31. Мар 2021, 21:03

Запуск Ansible из Terraform

Ниже один из вариантов как это сделать.

Примерная структура проекта

.
├── 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
comments powered by Disqus

© andrdi.com 2020