我使用terraform模块,并将一组default_tags传递给子模块,以实现一致的标记。如下所示,它的优点是子模块继承父模块的标记,但也可以添加自己的标记。
不过,我还想做的是能够覆盖一些继承的标记值,特别是"Name“。但我似乎无法做到这一点。
在下面的示例中(带AWS的terraform 13.5 ),为任何标记指定的第一个值,例如根模块中的“划痕测试”,被级联到子模块,并且不能更改。因此,VPC名称标记和子网名称标记=“划痕测试”。
如何覆盖子模块中的标记值?
# root variables.tf
variable "default_tags" {
type = map
default = {
environment_type = "Dev Environment"
}
}
# root main.tf
provider "aws" {
region = var.region
}
module "vpc" {
source = "../../../../scratch/tags-pattern"
vpc_name = "scratch-test"
public_subnets = ["10.0.0.0/26"]
default_tags = merge(map(
"Name", "scratch-test"
), var.default_tags)
}
# ../../../../scratch/tags-pattern/main.tf
module "the_vpc" {
source = "../../terraform/tf-lib/network/vpc"
vpc_name = var.vpc_name
vpc_cidr = "10.0.0.0/24"
default_tags = merge(map(
"Name", "scratch-test-vpc",
"vpc_tag", "vpc"
), var.default_tags)
}
# Add a subnet
module "public_subnets" {
source = "../../terraform/tf-lib/network/subnet"
vpc_id = module.the_vpc.output_vpc_id
subnets = var.public_subnets
default_tags = merge(map(
"Name", "scratch-test-subnet",
"subnet_tag", "public"
), var.default_tags)
}
# tf-lib/network/vpc/main.tf
resource "aws_vpc" "vpc" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = merge(map(
"module", "tf-lib/network/vpc"
), var.default_tags)
}
每个模块的variable.tf文件包含以下语句:
variable "default_tags" {}
发布于 2020-11-30 05:46:04
函数通过覆盖参数序列中定义的后一个映射来设置优先级:
merge
获取任意数量的映射或对象,并返回包含所有参数的合并元素集的单个映射或对象。 如果多个给定的映射或对象定义相同的键或属性,则参数序列后面的键或属性优先。如果参数类型不匹配,则结果类型将是在应用合并规则后与属性的类型结构匹配的对象。
因此,为了允许您覆盖默认标记,可以首先指定默认标记,如下所示:
# root variables.tf
variable "default_tags" {
type = map
default = {
environment_type = "Dev Environment"
}
}
# root main.tf
provider "aws" {
region = var.region
}
module "vpc" {
source = "../../../../scratch/tags-pattern"
vpc_name = "scratch-test"
public_subnets = ["10.0.0.0/26"]
default_tags = merge(var.default_tags, map(
"Name", "scratch-test"
))
}
使用{}
映射语法(而不是函数 ),上面的内容也可能更清晰:
# root main.tf
provider "aws" {
region = var.region
}
module "vpc" {
source = "../../../../scratch/tags-pattern"
vpc_name = "scratch-test"
public_subnets = ["10.0.0.0/26"]
default_tags = merge(var.default_tags, {
Name = "scratch-test",
})
}
正如map
函数文档中所提到的,这个函数被取消了,并最终将被删除:
这个函数是不推荐的,Terraform的使用
{
和}
分隔符创建映射的内置语法,它来自Terraformv0.12。使用内置语法代替。map
函数将在以后的Terraform版本中删除。
发布于 2021-05-19 01:38:19
对于AWS提供者v3.38.0来说,这可以做得更简单。见这个公告博客。下面是使用新的提供程序实现的请求,没有tags
变量。
# root main.tf
provider "aws" {
region = var.region
default_tags {
tags = {
environment_type = "Dev Environment"
}
}
}
module "vpc" {
source = "../../../../scratch/tags-pattern"
vpc_name = "scratch-test"
public_subnets = ["10.0.0.0/26"]
}
# ../../../../scratch/tags-pattern/main.tf
module "the_vpc" {
source = "../../terraform/tf-lib/network/vpc"
vpc_name = var.vpc_name
vpc_cidr = "10.0.0.0/24"
}
# tf-lib/network/vpc/main.tf
resource "aws_vpc" "vpc" {
cidr_block = var.vpc_cidr
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = "scratch-test-vpc"
module = "tf-lib/network/vpc"
vpc_tag = "vpc"
}
}
这是标签。
https://stackoverflow.com/questions/65073774
复制相似问题