Ниже один из вариантов как это сделать.
Примерная структура проекта
.
├── ansible
│ ├── ansible.cfg
│ ├── group_vars
│ │ └── all
│ ├── roles
│ │ └── role_1
│ │ └── .....
│ │ └── role_n
│ └── site.yml
│
└── terraform
├── providers.tf
├── inventory.tpl
├── localfile.tf
├── ....
├── secrets.auto.tfvars
└── variables.tf
В каталоге проекта находятся каталоги ansible и terraform.
Terraform, при старте, с помощью провайдера local, генерирует в каталоге ansible inventory-файл hosts и запускает плейбук.
providers.tf
terraform {
required_providers {
....
local = {
source = "hashicorp/local"
version = "2.0.0"
}
}
}
...
localfile.tf
В данном случае инфраструктура разворачивается в Google Cloud
resource "local_file" "inventory" {
filename = "${path.module}/../ansible/hosts"
file_permission = "0644"
content = templatefile("${path.module}/inventory.tpl", {
ip_addrs = google_compute_instance.andrdi-gcp-server[*].network_interface[0].access_config[0].nat_ip
})
provisioner "local-exec" {
command = "ANSIBLE_CONFIG=${path.module}/../ansible/ansible.cfg ansible-playbook ${path.module}/../ansible/site.yml"
}
}
Шаблон inventory.tpl
[webservers]
%{ for addr in ip_addrs ~}
${addr}
%{ endfor ~}
ansible.cfg
Пришлось немного увеличить таймаут для того, чтобы ВМ успевали создаваться. Параметр remote_user задается в момент прокидывания публичного ключа при генерации ВМ.
[defaults]
inventory = hosts
timeout = 60
host_key_checking = False
roles_path = roles
nocows = 1
remote_user = andrdi
# default module name for /usr/bin/ansible
module_name = command