【问题标题】:Inner looping with Terraform使用 Terraform 进行内部循环
【发布时间】:2017-11-10 14:00:33
【问题描述】:

使用 Terraform (v0.9.6) GitHub Provider,如何在使用一种资源的同时将多个不同的问题标签分别分配给 GitHub 存储库列表?

用另一种语言我可能会写一些类似的东西:

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 的解决方法,以便在我们遍历标签总数时分配正确的存储库。

【问题讨论】:

  • 一开始我也认为这是同一个问题,但另一个问题是关于创建资源的二维“矩阵”,这最终与这种情况略有不同,其中每个顶级对象(存储库)有自己的一组二级对象。

标签: github terraform


【解决方案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,并且通常最好显式编写配置而不是通过变量生成它。结果通常更容易阅读和维护,并且随着需求的变化更容易适应。

【讨论】:

  • 两年后这仍然是惯用的,注意到 Terraform 变化很快?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 2018-07-16
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多