Обходной путь для `count.index` в модуле Terraform - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужен обходной путь для использования count.index внутри блока модуля для некоторых входных переменных. У меня есть привычка чрезмерно усложнять проблемы, поэтому, возможно, есть гораздо более простое решение.

Структура файла / папки:

modules/
  main.tf
  ignition/
    main.tf
    modules/
      files/
        main.tf
      template_files/
        main.tf

Конечная цель: Создайте файл зажигания для каждого развертываемого экземпляра. Каждый файл зажигания содержит информацию об экземпляре c, такую ​​как имя хоста, IP-адрес и т. Д. c.

Весь этот код работает, если я использую значение c или переменную без cound.index. Мне нужна помощь, чтобы найти обходной путь для переменных address, gateway и hostname. Если мне нужно обработать count.index внутри одного из дочерних модулей, это совершенно нормально. Хотя я не могу обернуть это вокруг себя. Я пробовал null_data_source и null_resource блоки от дочерних модулей, чтобы достичь этого, но пока что не повезло.

Переменные:

workers = {
  Lab1 = {
    "lab1k8sc8r001" = "192.168.17.100/24"
  }
  Lab2 = {
    "lab2k8sc8r001" = "192.168.18.100/24"
  }
}

gateway = {
  Lab1 = [
    "192.168.17.1",
  ]
  Lab2 = [
    "192.168.18.1",
  ]
}

С modules/main.tf, я ' Я вызываю модуль ignition:

module "ignition_workers" {
  source = "./modules/ignition"

  virtual_machines     = var.workers[terraform.workspace]
  ssh_public_keys      = var.ssh_public_keys

  files = [
    "files_90-disable-auto-updates.yaml",
    "files_90-disable-console-logs.yaml",
  ]

  template_files = {
    "files_eth0.nmconnection.yaml" = {
      interface-name = "eth0",
      address = element(values(var.workers[terraform.workspace]), 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 = element(keys(var.workers[terraform.workspace]), count.index),
    }
    "files_chronyd.yaml" = {
      ntp_server = var.ntp_server,
    }
  }
}

С modules/ignition/main.tf Я беру переменные files и template_files для построения конфигурации Ignition:

module "ingition_file_snippets" {
  source = "./modules/files"
  files  = var.files
}

module "ingition_template_file_snippets" {
  source          = "./modules/template_files"
  template_files  = var.template_files
}

data "ct_config" "fedora-coreos-config" {
  count = length(var.virtual_machines)

  content = templatefile("${path.module}/assets/files_ssh_authorized_keys.yaml", {
    ssh_public_keys = var.ssh_public_keys
    })
  pretty_print = true
  snippets = setunion(values(module.ingition_file_snippets.files), values(module.ingition_template_file_snippets.files))
}

1 Ответ

0 голосов
/ 03 мая 2020

Я не совсем уверен, чего вы пытаетесь достичь, поэтому я не могу привести подробные примеры.

Но modules в terraform пока не поддерживают count или for_each. Поэтому вы также не можете использовать count.index.

. Возможно, вы захотите изменить свой модуль так, чтобы он брал списки / карты ввода и создавал эти списки / карты с помощью для выражений , преобразовывая их из некоторые входные переменные. Вы можете объединить for с if, чтобы создать отфильтрованное подмножество вашего списка / карты источников. Как в:

[for s in var.list : upper(s) if s != ""]

Надеюсь, это поможет вам обойти отсутствующую поддержку count.

...