内部循环与Terraform

时间:2017-06-08 18:07:10

标签: github terraform

使用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来解决方法,以指定正确的存储库。

1 个答案:

答案 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,并且明确地编写配置通常更好,而不是通过变量生成它。结果通常更易于阅读和维护,并且随着需求的变化,随着时间的推移更容易适应。