地形覆盖子模块中的标记值



我使用terraform模块,并将一组default_tag传递给子模块以进行一致标记。如下所示,其优点是子模块继承其父模块的标记,但也可以添加自己的标记。

然而,我也想做的是能够覆盖一些继承的标签值,尤其是";名称";。但我似乎无法做到这一点。

在下面的例子(带有AWS的地形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" {}

merge函数通过重写参数序列中定义的后一个映射来设置优先级:

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"
))
}

使用{}映射语法而不是map函数,上面的内容也可能看起来更清晰:

# 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 v0.12,Terraform该语言具有用于使用{}创建映射的内置语法分隔符。请改用内置语法。map功能将在Terraform的未来版本中删除。

从AWS Provider 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"
}
}

以下是default_tags的主要文档。

相关内容

  • 没有找到相关文章

最新更新