2017-05-15 17 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