1 Вопрос: Terraform local-exec Provisioner для работы на нескольких виртуальных машинах Azure

вопрос создан в Thu, May 2, 2019 12:00 AM

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

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

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

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 предоставляет Ansible частный IP-адрес только первой виртуальной машины.

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

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

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

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

    
1
  1. Мне кажется, что реальная проблема заключается в том, что local-exec выполняется только один раз за блок, а не один раз за итерацию ресурса, поэтому вы получаете только выполнение на первый ip адрес. Лучший способ сделать это, который также решил бы вашу проблему, мог бы использовать Terraform template для вывода всех IP-адресов в файл Ansible hosts, который вы затем можете использовать вместо этого.
    2019-05-02 15: 18: 42Z
1 ответ                              1                         

Как сказал Мэтт, 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 .

    
0
2019-05-03 08: 03: 25Z
  1. Спасибо, Чарльз. Код работает как брелок с небольшим изменением (запятая в кавычке) в команде: command = "sleep 20; ansible-playbook -i ${join (", ", azurerm_network_interface.cnic. *. Private_ip_address)} vmlinux -playbook.yml "
    2019-05-03 15: 47: 12Z
  2. @ Asghar Это здорово. Ну, если вы думаете, что все в порядке, вы можете принять это как ответ.
    2019-05-03 15: 48: 35Z
источник размещен Вот