Curso Ansible: Provisioners de Ansible en Terraform
Avanzamos en el curso de Ansible desde la anterior entrada anterior entrada…
Los provisioners en Terraform son bloques de código que permiten ejecutar scripts o comandos en recursos creados. Los provisioners de Ansible en Terraform permiten la integración directa de playbooks de Ansible, ejecutándolos una vez que los recursos de infraestructura se han creado.
Terraform puede ejecutar Ansible usando dos tipos de provisioners: local-exec y remote-exec. Aquí te mostramos cómo configurar ambos.
DOCUMENTACIÓN OFICIAL: https://developer.hashicorp.com/packer/integrations/hashicorp/ansible/latest/components/provisioner/ansible
Integración de Ansible con Packer
Packer es una herramienta de HashiCorp que permite crear imágenes de máquina idénticas para múltiples plataformas a partir de una única configuración de origen. Integrar Ansible con Packer permite utilizar playbooks de Ansible para configurar estas imágenes.
Para utilizar Ansible como provisioner en Packer, se utiliza el provisioner ansible o ansible-local. La diferencia principal es que ansible se ejecuta en la máquina que está ejecutando Packer, mientras que ansible-local se ejecuta directamente en la máquina creada por Packer.
Provisioner local-exec
El provisioner local-exec se ejecuta en la máquina donde se está ejecutando Terraform. Este método invoca Ansible localmente para configurar los recursos remotos.
1 2 3 |
provisioner "local-exec" { command = "ansible-playbook -i ${self.network_interface.0.address}, --private-key ~/.ssh/id_rsa -u ubuntu playbook.yml" } |
Provisioner remote-exec
El provisioner remote-exec se ejecuta en la máquina remota que Terraform ha creado. Este método es útil para preparar la máquina remota antes de invocar Ansible desde el provisioner local-exec.
1 2 3 4 5 6 7 |
provisioner "remote-exec" { inline = [ "sudo apt-get update -y", "sudo apt-get install -y python3-pip", "sudo pip3 install ansible" ] } |
Ejemplo práctico Provisioners
Antes de comenzar, asegúrate de tener las siguientes herramientas instaladas y configuradas:
• Terraform
• Ansible
• Packer
• Claves SSH configuradas para la conexión sin contraseña entre las máquinas
Aquí hay un ejemplo completo que combina ambos provisioners para configurar una máquina virtual en Proxmox utilizando Terraform y Ansible.
Archivo main.tf (Terraform)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
provider "proxmox" { pm_api_url = "https://proxmox.example.com:8006/api2/json" pm_user = "root@pam" pm_password = "your_password" pm_tls_insecure = true } resource "proxmox_vm_qemu" "ubuntu_vm" { name = "terraform-ansible-ubuntu" target_node = "proxmox-node1" clone = "ubuntu-template" disk { id = 0 size = "20G" } network { id = 0 model = "virtio" bridge = "vmbr0" } os_type = "cloud-init" sshkeys = file("~/.ssh/id_rsa.pub") connection { type = "ssh" user = "root" private_key = file("~/.ssh/id_rsa") host = self.network.0.ip } provisioner "remote-exec" { inline = [ "apt-get update -y", "apt-get install -y python3-pip", "pip3 install ansible" ] } provisioner "local-exec" { command = "ansible-playbook -i '${self.network.0.ip},' --private-key ~/.ssh/id_rsa -u root playbook.yml" } } |
Archivo playbook.yml (Ansible)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
- hosts: all become: yes tasks: - name: Actualizar paquetes y cache apt: update_cache: yes name: "*" state: latest - name: Instalar nginx apt: name: nginx state: present - name: Iniciar y habilitar nginx service: name: nginx state: started enabled: yes |
Archivo packer.json (Packer)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
{ "variables": { "ansible_playbook_file": "{{user `playbook_file`}}", "ssh_username": "{{user `ssh_username`}}", "ssh_private_key_file": "{{user `ssh_private_key_file`}}" }, "builders": [ { "type": "proxmox", "host": "https://proxmox.example.com:8006/api2/json", "username": "root@pam", "password": "your_password", "vm_name": "packer-ansible-ubuntu", "template": "ubuntu-template", "node": "proxmox-node1", "storage_pool": "local-lvm", "disk_size": "20G", "network_adapters": [ { "bridge": "vmbr0", "model": "virtio" } ], "ssh_username": "{{user `ssh_username`}}", "ssh_private_key_file": "{{user `ssh_private_key_file`}}", "image_type": "qcow2", "os_type": "cloud-init" } ], "provisioners": [ { "type": "ansible", "playbook_file": "{{user `ansible_playbook_file`}}", "extra_arguments": [ "--ssh-extra-args", "-o StrictHostKeyChecking=no" ], "groups": [ "packer" ] } ] } |
Archivo inventory
1 2 3 |
[web] terraform-ansible-ubuntu ansible_host=192.168.1.100 |
ENTRADAS RELACIONADAS CURSO ANSIBLE
- Curso Ansible: Qué es y para qué sirve
- Curso Ansible: Instalación, configuración inicial y ejemplo práctico básico
- Curso Ansible: Puertos de comunicación necesarios
- Curso Ansible: Playbooks conceptos básicos
- Curso Ansible: Manejo de Inventarios
- Curso Ansible: Manejo de Variables
- Curso Ansible: definición y uso de Roles
- Curso Ansible: qué son los Handlers
- Curso Ansible: Condicionales y bucles
- Curso Ansible: Gestión de secretos y credenciales con Ansible Vault
- Curso Ansible: Uso de roles de la comunidad con Ansible Galaxy
- Curso Ansible: Despliegue de aplicaciones en contenedores con Ansible
- Curso Ansible: Integración de Ansible con CI/CD pipelines
- Curso Ansible: Generar ficheros YAML
- Curso Ansible: Integración de Ansible con Terraform para gestionar Proxmox
- Curso Ansible: Provisioners de Ansible en Terraform
OTRAS ENTRADAS RELACIONADAS ANSIBLE
- Ansible: Conceptos básicos
- Ansible: Comandos básicos
- Instalar Ansible en Centos 7
- Ansible: Gestión básica máquinas virtuales Proxmox
- MacOS: Instalar Podman y Ansible
- Docker Swarm: Instalar Ansible AWX
- Ansible: Validar ficheros YAML
- Ansible: Instalar SQL Server 2019 en Linux
- Ansible: Crear página web WordPress
- Ansible: Instalación servidores web
- Ansible: Gestión de máquina Windows
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?