Циклы или операторы выбора в файле template_file - PullRequest
0 голосов
/ 03 мая 2020

Столкнулся с такой проблемой. Я не могу понять, как создать файл temlate_file такого типа:

[master] ser1 ansible_host=10.0.0.1 ser2 ansible_host=10.0.0.2

, чтобы имя и адрес генерировались из изменения. Я использую стандартную инструкцию в date.tf:

data "template_file" "inventory" {
count = length(var.domains)
template = file("inventory.tpl")
vars = {
master_ip = join("\n", hcloud_server.rebrain_quest.*.ipv4_address)
key_path = var.privat_key
}
}

Но здесь я могу только сгенерировать свой адрес.

[master] 10.0.0.1 10.0.0.2

Вам может понадобиться такой способ, но у меня ничего не выходит:

master_ip = join(";", [hcloud_server.rebrain_quest.*.name, ansible_host=, hcloud_server.rebrain_quest.*.ipv4_address])

У меня версия terraform v0.12.24

Ответы [ 3 ]

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

Поскольку вы используете Terraform 0.12, вы должны использовать функцию templatefile вместо источника данных template_file. Поскольку он встроен в язык, а не предлагается поставщиком, он свободен от ограничений источника данных, таких как принудительное использование всех значений vars в виде строк.

locals {
  ansible_inventory = templatefile("${path.module}/inventory.tpl", {
    hosts = hcloud_server.rebrain_quest
  })
}

Затем в файле шаблона:

[master]
%{ for h in hosts ~}
${h.name} ansible_host=${h.ipv4_address}
%{ endfor ~}

Приведенный выше шаблон представляет собой вариант примера, приведенного в документации о синтаксисе шаблонных директив Terraform .


Ваш первоначальный пример включал count = var.domains, но остальная часть конфигурации ресурса не включала упоминания count.index, поэтому я предположил, что это на самом деле не нужно. Однако, если вы хотите создать несколько копий шаблона на основе номера в var.domains, вы можете сделать следующее изменение:

locals {
  ansible_inventory = [
    for i in range(var.domains) :
    templatefile("${path.module}/inventory.tpl", {
      hosts = hcloud_server.rebrain_quest
      index = i
    })
  ]
}

Функция range здесь создает список целых чисел от нуля до var.domains - 1, поэтому мы можем использовать его с for, чтобы повторить рендеринг шаблона несколько раз. Я добавил index = i к объекту переменных шаблона, чтобы вы могли в принципе использовать ${i} внутри шаблона, чтобы получить эффект, аналогичный count.index в блоке ресурсов.

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

Спасибо всем за ответы, я решил эту проблему со сложным выражением:

master_ip = "${join("\n", [for instance in hcloud_server.rebrain_quest : join("", [instance.name, " ansible_host=", instance.ipv4_address])] )}"
0 голосов
/ 04 мая 2020

Terraform:

data "template_file" "inventory" {
  count    = length(var.domains)
  template = file("inventory.tpl")

  vars = {
    hosts = hcloud_server.rebrain_quest
    lines = [
      for h in hcloud_server.rebrain_quest:
    ]
  }
}

Шаблон:

[master]
%{ for h in hosts ~}
${h.name} ansible_host=${h.ipv4_address}
%{ endfor ~}

Но рассмотрите возможность использования terraform- ansible (их много), используйте hcloud dynamici c плагин инвентаря или используйте ad-ho c hcloud обнаружить через hcloud_server_info

...