Получить готовый файл 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 параметра:
- путь к шаблону
- переменные, из которых будем получать данные в шаблоне
На выходе у нее будут данные (сгенерированные по шаблону), которые запишутся в файл filename.
В данном примере у нас в качестве переменных в шаблон передаются следующие параметры:
instances
- массив созданных инстансов (их может быть от 1 и больше)
vps_ipaddresses
- массив публичных ip адресов, привязанных к машинам (по ним будет производиться подключение ансиблом)
ssh_file
- путь к приватному ключу, с помощью которого будет производиться подключение к машинам (парный публичный ключ надо добавить на создаваемые машины в ресурсе создания инстанса)
vps_user
- пользователь, от имени которого мы будем подключаться к созданным машинам