【Terraform学习】本地变量(Terraform配置语言学习)

背景:

关于如何在机器上拉terraform代码,初始化就不重复了,需要的可以查看前面的文章:

【Terraform学习】Terraform-AWS部署快速入门(快速入门)_向往风的男子的博客-CSDN博客

使用本地变量命名资源

  • 每个配置的共享部分设置为重复使用的本地值减少重复并使此配置更清晰

  • 通过将以下代码段粘贴到main.tf顶部来定义本地变量

复制代码
locals {
  name_suffix = "${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
}
  • 任何Terraform配置中一样 ,配置的显示顺序不会影响Terraform解释配置的方式

  • 现在更新配置中的属性以使用此新的本地值

复制代码
 module "vpc" {
   source  = "terraform-aws-modules/vpc/aws"
   version = "2.66.0"

-  name = "vpc-${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
+  name = "vpc-${local.name_suffix}"
   ## ...
 }

 module "app_security_group" {
   source  = "terraform-aws-modules/security-group/aws//modules/web"
   version = "3.17.0"

-  name        = "web-sg-${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
+  name        = "web-sg-${local.name_suffix}"
   ## ...
 }

 module "lb_security_group" {
   source  = "terraform-aws-modules/security-group/aws//modules/web"
   version = "3.17.0"

-  name        = "lb-sg-${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
+  name        = "lb-sg-${local.name_suffix}"
   ## ...
 }

 module "elb_http" {
   source  = "terraform-aws-modules/elb/aws"
   version = "2.4.0"

   # Ensure load balancer name is unique
-  name = "lb-${random_string.lb_id.result}-${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
+  name = "lb-${random_string.lb_id.result}-${local.name_suffix}"
   ## ...
 }
  • 请注意,负载均衡器名称包含一个随机字符串 ,以便这些名称是唯一的 ,这是 AWS 中负载均衡器名称的要求

  • 应用配置以验证名称的值是否未更改

    • terraform apply

将变量与局部值组合

  • 变量值不同局部值可以使用动态表达式和资源参数

  • 许多项目要求以某种方式标记所有资源以跟踪它们 。要强制实施此要求 ,请将本地值与变量结合使用 ,以便分配给资源的标签至少包括项目名称和环境

  • 将以下新变量定义 添加到**variables.tf**。

复制代码
variable "project_name" {
  description = "Name of the project."
  type        = string
  default     = "my-project"
}

variable "environment" {
  description = "Name of the environment."
  type        = string
  default     = "dev"
}
  • 接下来,将变量resource_tags的默认值更改为空映射
复制代码
 variable "resource_tags" {
   description = "Tags to set for all resources"
   type        = map(string)
-   default     = {
-     project     = "my-project",
-     environment = "dev"
-   }
+   default     = { }
 }
  • 添加新块locals以创建所需标签和用户定义标签组合
复制代码
locals {
  required_tags = {
    project     = var.project_name,
    environment = var.environment
  }
  tags = merge(var.resource_tags, local.required_tags)
}
  • 可以在单个块中定义配置本地值也可以使用多个locals

  • 更新局部变量的定义以使用新变量

复制代码
 locals {
-  name_suffix = "${var.resource_tags["project"]}-${var.resource_tags["environment"]}"
+  name_suffix = "${var.project_name}-${var.environment}"
 }
  • 然后,更新main.tf中的tags引用 ,以使用新的本地值
复制代码
-  tags = var.resource_tags
+  tags = local.tags
## ... replace all five occurrences of `tags = var.resource_tags`
  • 最后,向**output.tf文件添加一个名为tags的输出** 。此输出将显示您在此配置中使用的标签
复制代码
output "tags" {
  value = local.tags
}
  • 现在,应用这些更改以查看每个资源的标签

    • terraform apply
  • 接下来,运行另一个 apply ,这次将环境更改为prod

    • terraform apply -var "environment=prod"
相关推荐
for_ever_love__2 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
皮卡丘不断更4 小时前
从遥操作示范到可复现训练:LeRobot 0.6.1 的机器人学习工作流
人工智能·学习·机器人·开源·开发工具
林浅不想努力4 小时前
k8s集群部署的方法原理
云原生·容器·kubernetes
IZero074 小时前
Elasticsearch 学习笔记筑基-文档操作篇
笔记·学习·elasticsearch
輝太くん5 小时前
k8s中的pod管理
云原生·容器·kubernetes
大大大大晴天5 小时前
大数据平台为什么必须走向云原生:从资源孤岛到弹性数据基础设施
大数据·云原生
小白说大模型5 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
吃好睡好便好6 小时前
三伏天结束了
学习·生活·毕淑敏·心理游戏
潘正翔6 小时前
k8s高级_调度器Deployment
linux·运维·云原生·容器·kubernetes·jenkins·devops
阿里云云原生6 小时前
云效 AI 助手深度解析:如何贯穿需求、代码、测试与发布的全链路闭环?
云原生