背景:
关于如何在机器上拉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"