使用Terraform(v0.9.6)GitHub Provider,如何在使用一个资源时将多个不同的问题标签分别分配给GitHub存储库列表?
使用另一种语言,我可能会写下以下内容:
for i in repos {
for j in tags[i] {
make tag j on repo i
}
}
在下面的示例中,我将多个标记添加到单个存储库中。 map
键是repos,值是字符串列表。:
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 :(得分:2)
使用列表变量和其他复杂结构来“抽象”#34;资源不是惯用的,往往会导致难以阅读和维护的配置。
惯用风格是使用子模块的多个实例来管理重复构造。
例如,可以创建一个名为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
,并且明确地编写配置通常更好,而不是通过变量生成它。结果通常更易于阅读和维护,并且随着需求的变化,随着时间的推移更容易适应。