• AnsibleTerraform
  • Создаем inventory для ansible с помощью terraform

Получить готовый файл inventory для последующего управления инфраструктурой можно при создании инстансов через terraform.
Файл конфигурации tftpl (Terraform Template) представляет собой шаблон, на основе которого Terraform, используя информацию о создаваемой инфраструктуре, генерирует файл inventory.yml (для Ansible).

Ниже представлен пример шаблона:

nodes:
  hosts:
%{ for i,vps in instances ~}
    ${vps.name}:
      ansible_host: ${vps_ipaddresses[i]}
      ansible_user: ${vps_user}
      ansible_ssh_private_key_file: ${ssh_file}
%{ endfor ~}

Синтаксис tftpl очень напоминает синтаксис языка шаблонов jinja2, так что не перепутайте.

Строка %{ for i,vps in instances ~} - это начало цикла, который будет пройден до строки %{ endfor ~}столько раз, сколько инстансов (vps) содержится в массиве instances.
При этом i - это индекс каждой машины в цикле (начинается с 0). С помощью этой переменной мы можем получить доступ к элементам других массивов (в данном примере vps_ipaddresses - массив ip адресов машин).
${vps.name} - используется имя инстанса в Terraform в качестве имени хоста в Ansible инвентаре.

На основании этого шаблона (при условии, что мы создаем 2 машины) получится примерно такой файл inventory.yml:

nodes:
  hosts:
    node-0
      ansible_host: 1.2.3.4
      ansible_user: user
      ansible_ssh_private_key_file: /home/user/.ssh/private-key
    node-1:
      ansible_host: 5.6.7.8
      ansible_user: user
      ansible_ssh_private_key_file: /home/user/.ssh/private-key

Чтобы terraform сгенерировал инвентори на основе шаблона, в его манифесте надо указать resource "local_file":

resource "local_file" "inventory" {
        filename        = "/home/user/project/inventory.yml"
        content         = templatefile("/home/user/project/inventory.tftpl",
                                {
                                instances            = t1_compute_instance.slave_2[*],
                                vps_ipaddresses = t1_vpc_public_ip.public_ip_slave_2[*].floating_ip,
                                ssh_file               = var.private_key_path,
                                vps_user             = data.t1_compute_ssh_key.ssh.login,
                                })
}
  • filename - путь, по которому будет сохранен файл inventory.yml
  • content = templatefile(path, vars) - функция, которая получает на вход 2 параметра:
    1. путь к шаблону
    2. переменные, из которых будем получать данные в шаблоне

На выходе у нее будут данные (сгенерированные по шаблону), которые запишутся в файл filename.

В данном примере у нас в качестве переменных в шаблон передаются следующие параметры:

  • instances - массив созданных инстансов (их может быть от 1 и больше)
  • vps_ipaddresses - массив публичных ip адресов, привязанных к машинам (по ним будет производиться подключение ансиблом)
  • ssh_file - путь к приватному ключу, с помощью которого будет производиться подключение к машинам (парный публичный ключ надо добавить на создаваемые машины в ресурсе создания инстанса)
  • vps_user - пользователь, от имени которого мы будем подключаться к созданным машинам