Tengo un libro de jugadas de Ansible con roles que quiero ejecutar desde Terraform.
site.yaml
---
- hosts: cluster
gather_facts: yes
become: yes
roles:
- role: prereq
roles/prereq/tasks/main.yml
contiene las tareas.
Con Ansible, primero creo el inventario:
inventory/hosts
[bastion]
192.168.2.1
[node]
192.168.2.2
192.168.2.3
[cluster:children]
node
[cluster:vars]
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q [email protected]"'
Luego lanzo ansible-playbook -i inventory/hosts site.yml
.
Quiero reproducir esto en Terraform sin crear manualmente el archivo de inventario/hosts. Hice lo siguiente:
terraform {
required_providers {
ansible = {
source = "ansible/ansible"
version = "~> 1.1.0"
}
}
resource "ansible_group" "bastion" {
name = "bastion"
}
resource "ansible_group" "nodes" {
name = "node"
}
resource "ansible_group" "cluster" {
name = "cluster"
children = [
ansible_group.nodes.name
]
variables = {
ansible_ssh_common_args = "-o ProxyCommand='...'"
}
}
# NOTE bastion and then nodes come from a remote state.
resource "ansible_host" "bastion" {
name = bastion.ip
groups = [ansible_group.bastion.name]
}
resource "ansible_host" "nodes" {
for_each = { for key, val in nodes : key => val }
name = each.value.ip
groups = [ansible_group.nodes.name]
}
resource "ansible_playbook" "test" {
name = "all"
playbook = "site.yaml"
replayable = true
ansible_playbook_binary = "ansible-playbook"
ignore_playbook_failure = true
}
Y falla con el siguiente mensaje:
ansible_playbook = <<EOT
[WARNING]: Found both group and host with same name: cluster
[WARNING]: Found both group and host with same name: all
PLAY [cluster] *******************************************************************
TASK [Gathering Facts] *********************************************************
fatal: [cluster]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname cluster: Temporary failure in name resolution", "unreachable": true}
PLAY RECAP *********************************************************************
cluster : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
EOT
ansible_playbook_errors = "exit status 4"
No me queda claro qué debo insertar en el name
parámetro ansible_playbook.test
y cómo debo configurar los hosts y grupos ansibles. ¿Tienes alguna sugerencia?