2017-06-08 137 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,并且通常更好地显式编写配置,而不是通过变量生成配置。结果往往更容易阅读和维护,并且随着需求的变化随着时间的推移更容易适应。