2017-06-08 133 views
0

使用Terraform(v0.9.6)GitHub提供程序,如何在使用一個資源時單獨將多個不同問題標籤分配給GitHub存儲庫列表?使用Terraform內部循環

用另一種語言我可能會寫的線沿線的東西:

for i in repos { 
    for j in tags[i] { 
    make tag j on repo i 
    } 
} 

在這個例子下面我添加多個標籤對一個信息庫。該map鍵是回購,和值是字符串列表:

variable "issue-labels" { 
    type = "map" 
    default = { 
    "repo_0" = "tag1, tag2, tag3" 
    "repo_1" = "tag4" 
    "repo_2" = "tag5, tag6" 
    } 
} 


resource "github_issue_label" "issue_labels" { 
    count = "${length(split(", ", join(", ", lookup(issue-labels, "my-repo"))))}" 
    repository = "my-repo" 
    name = "${element(split(", ", join(", ", lookup(issue-labels, "my-repo"))), count.index)}" 
    color = "FFFFFF" 
} 

目前正在尋求一個答案是什麼感覺就像terraform一個內部循環。要麼尋找某種方法遍歷存儲庫併爲每個存儲庫創建多個資源計數,要麼在涉及到interpolation的迭代通過標籤總數時分配正確的回購的解決方法。

+0

類似於https://serverfault.com/questions/833810/terraform-use-nested-loops-with-count –

+0

我也認爲這是同樣的問題,但另一個問題是關於創建一個雙向的,這是一個二維的「資源矩陣」,最終與每個頂層對象(資源庫)都有自己的第二層集合的場景稍有不同。 –

回答

1

使用列表變量和其他複雜結構來「抽象」資源不是慣用的,並且往往導致配置難以閱讀和維護。

慣用風格是使用子模塊的多個實例來管理重複構造。

例如,一種可以使一個稱爲repository子目錄包含repository.tf文件,如以下:

variable "name" { 
} 

variable "labels" { 
    type = "list" 
} 

# can instead use github_team_repository here if appropriate 
resource "github_repository" "this" { 
    name = "${var.name}" 
    # ... 
} 

resource "github_issue_label" "all" { 
    count = "${length(var.labels)}" 

    repository = "${var.name}" 
    name  = "${var.labels[count.index]}" 
    color  = "FFFFFF" 
} 

現在根模塊中,而不是使用變量來定義該組的存儲庫的,人們可以而不是實例化這個資源一次爲每個庫:

module "foo_repo" { 
    source = "./repository" 

    name = "foo" 
    labels = ["tag1", "tag2", "tag3"] 
} 

module "bar_repo" { 
    source = "./repository" 

    name = "bar" 
    labels = ["tag4"] 
} 

module "baz_repo" { 
    source = "./repository" 

    name = "baz" 
    labels = ["tag5", "tag6"] 
} 

有了這種風格,每個倉庫的設置放在一起在每個單個模塊塊,從而使它們易於閱讀和更新。通過添加新的module塊來添加新的存儲庫。

此樣式還允許刪除單個存儲庫,而不會干擾其後的所有存儲庫,因爲模塊狀態是按模塊名稱存儲的,而不是索引存儲到列表中。

這裏的一般建議是應該謹慎使用count,並且通常更好地顯式編寫配置,而不是通過變量生成配置。結果往往更容易閱讀和維護,並且隨着需求的變化隨着時間的推移更容易適應。