2017-05-15 18 views
1

我正在玩Terraform了一下,我想知道这是否可能。最好的做法是将标签分配给您在AWS上创建的每个资源(例如)。因此,您首先要做的是提出一个标记策略(例如,哪个业务部门,应用程序名称,负责该团队的团队......)。在TerraForm的中心部分定义标签

但是,在Terraform中,这意味着您必须为每个资源重复每个标签块。这不是很方便,如果你想更新一个标签名称,你必须更新你创建的每个资源。

例如:

resource "aws_vpc" "vpc" { 
    cidr_block = "${var.cidr}" 

    tags { 
    Name   = "${var.name}" 
    Project  = "${var.projectname}" 
    Environment = "${var.environment}" 
    } 
} 

如果我想创建一个具有相同标记,VPC子网和EC2,我要再说一遍,标签块。如果我想稍后更新一个标签名称,我必须单独更新每个资源,这非常耗时且乏味。

是否有可能在集中位置创建一个标签块并引用它?我在考虑模块,但这似乎不符合模块的定义。

+0

虽然这不完全是我想要的,但这是一个开始。我使用Terraform社区模块查看了Github存储库,并发现了一种更简洁的方法:https://github.com/terraform-community-modules/tf_aws_vpc/。 – Bjorn121

+0

那么为什么不回答你自己的问题? – BMW

回答

4

您还可以尝试local values从版本0.10.3开始。它允许您为表达式分配一个符号本地名称,以便在配置中可以多次使用而不必重复。

# Define the common tags for all resources 
locals { 
    common_tags = { 
    Component = "awesome-app" 
    Environment = "production" 
    } 
} 

# Create a resource that blends the common tags with instance-specific tags. 
resource "aws_instance" "server" { 
    ami   = "ami-123456" 
    instance_type = "t2.micro" 

    tags = "${merge(
    local.common_tags, 
    map(
     "Name", "awesome-app-server", 
     "Role", "server" 
    ) 
)}" 
} 
+0

谢谢你。阅读这些文档的目的是作为模块特定的。我希望所有AWS资源都有一套标准的标记,并且有单独的'vpc','subnet'等模块。将顶级定义传递给每个模块是否有最佳做法? – nikobelia

+0

你是什么意思的模块特定?此处显示的方法可让您在顶层定义中定义一组通用标记,并将它们传递给支持标记的每个资源或模块。在某些情况下,您可以设置'tags = $ {local.common_tags}',或者如果除了常见的标签之外还需要包含一些特定于资源的标签,则可以使用如图所示的'merge'。 – glucas