Итерация по карте карт в Terraform 0.12 - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужно составить список из templatefile, например:

templatefile("${path.module}/assets/files_eth0.nmconnection.yaml", {
  interface-name = "eth0",
  addresses = element(values(var.virtual_machines), count.index),
  gateway = element(var.gateway, count.index % length(var.gateway)),
  dns = join(";", var.dns_servers),
  dns-search = var.domain,
  }),
templatefile("${path.module}/assets/files_etc_hostname.yaml", {
  hostname = element(keys(var.virtual_machines), count.index),
  }),

, перебирая карту карт, как показано ниже:

variable templatefiles {
  default = {
    "files_eth0.nmconnection.yaml" = {
      "interface-name" = "eth0",
      "addresses" = "element(values(var.virtual_machines), count.index)",
      "gateway" = "element(var.gateway, count.index % length(var.gateway))",
      "dns" = "join(";", var.dns_servers)",
      "dns-search" = "var.domain",
    },
    "files_etc_hostname.yaml" = {
      "hostname" = "host1"
    }
  }
}

У меня есть сделал что-то подобное со списком файлов:

file("${path.module}/assets/files_90-disable-console-logs.yaml"),
file("${path.module}/assets/files_90-disable-auto-updates.yaml"),

... но хотел бы расширить это до templatefiles (выше).

Вот код, который я сделал для список files:

main.tf

variable files {
  default = [
    "files_90-disable-auto-updates.yaml",
    "files_90-disable-console-logs.yaml",
  ]
}

output "snippets" {
  value = flatten(module.ingition_snippets.files)
}

modules / main.tf

variable files {}

resource "null_resource" "files" {
  for_each = toset(var.files)
  triggers = {
    snippet = file("${path.module}/assets/${each.value}")
  }
}

output "files" {
  value = [for s in null_resource.files: s.triggers.*.snippet]
}

Цени любую помощь!

1 Ответ

0 голосов
/ 29 апреля 2020

Оба этих варианта использования могут быть выполнены без использования каких-либо блоков resource, поскольку необходимые функции встроены в язык Terraform.

Вот более короткий способ написать пример с stati c files:

variable "files" {
  type = set(string)
}

output "files" {
  value = tomap({
    for fn in var.files : fn => file("${path.module}/assets/${fn}")
  })
}

Приведенное выше будет создавать карту из имен файлов к содержимому файла, поэтому вызывающему модулю будет проще получить доступ к содержимому отдельного файла.

Мы можем адаптировать это для templatefile вот так:

variable "template_files" {
  # We can't write down a type constraint for this case
  # because each file might have a different set of
  # template variables, but our later code will expect
  # this to be a mapping type, like the default value
  # you shared in your comment, and will fail if not.
  type = any
}

output "files" {
  value = tomap({
    for fn, vars in var.template_files : fn => templatefile("${path.module}/assets/${fn}", vars)
  })
}

Опять же, результатом будет карта от имени файла до результата рендеринга шаблона с заданными переменными.


Если ваша цель это создание модуля для рендеринга шаблонов из исходного каталога в где-то publi sh, может оказаться полезным модуль hashicorp/dir/template. Он объединяет fileset, file и templatefile таким образом, который, как мы надеемся, удобен для публикации на веб-сайте stati c и аналогичных сценариев использования. (В то время, когда я пишу это, модуль переходит из моей личной учетной записи GitHub в организацию HashiCorp, поэтому, если вы посмотрите на нее вскоре после этого, вы можете увидеть некоторую турбулентность при обновлении документов, et c.)

...