Terraform local-exec Provisioner для работы на нескольких виртуальных машинах Azure - PullRequest
1 голос
/ 02 мая 2019

У меня была рабочая настройка TF для раскрутки нескольких виртуальных машин Linux в Azure.Я запускал локальный exec-поставщик в null_resource для запуска Ansible playbook.Я извлекал частные IP-адреса из файла состояния TF.Файл состояния был сохранен локально.

Я недавно настроил бэкэнд Azure, и теперь файл состояния сохраняется в учетной записи хранения.

Я изменил локальный поставщик и пытаюсь получить всечастные IP-адреса для запуска Ansible playbook, как указано ниже:

resource "null_resource" "Ansible4Ubuntu" {
  provisioner "local-exec" {
    command = "sleep 20;ansible-playbook -i '${element(azurerm_network_interface.unic.*.private_ip_address, count.index)}', vmlinux-playbook.yml"

Я также пробовал:

resource "null_resource" "Ansible4Ubuntu" {
  provisioner "local-exec" {
    command = "sleep 20;ansible-playbook -i '${azurerm_network_interface.unic.private_ip_address}', vmlinux-playbook.yml"

Они оба отлично работают только с первой виртуальной машиной и игнорируют остальные.Я также пытался с count.index+1 and self.private_ip_address, но не повезло.

Фактический результат: TF предоставляет частный IP только первой виртуальной машины для Ansible.

Ожидаемый результат: TF предоставляет списоквсе частные IP-адреса для Ansible, чтобы он мог запустить playbook для всех них.

PS: я также смотрю на использование структуры данных TF remote_state, но кажется, что файл состояния содержит IP-адреса из предыдущих сборок., затрудняя извлечение тех, которые хороши для текущей сборки.

Буду признателен за любую помощь.

Спасибо Асгар

1 Ответ

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

Как сказал Мэтт, null_resource запускается только один раз, поэтому он отлично работает с первой виртуальной машиной и игнорирует остальные. Вам нужно настроить триггеры для null_resource со списком NIC, чтобы он запускался несколько раз. Пример кода вроде этого:

resource "null_reousrce" "Ansible4Ubuntu" {

    triggers = {
      network_interface_ids = "${join(",", azurerm_network_interface.unic.*.id)}"
    }

    provisioner "local-exec" {
      command = "sleep 20;ansible-playbook -i '${join(" ", azurerm_network_interface.unic.*.private_ip_address)}, vmlinux-playbook.yml"
  }

}

Вы можете изменить что-то в нем, как хотите Для получения информации см. null_resource .

...