En los proyectos de Ansible, mantener una estructura clara y bien definida es crucial para garantizar la escalabilidad y la facilidad de mantenimiento. Separar los archivos en directorios bien organizados no solo ayuda a localizar rápidamente lo que necesitas, sino que también permite colaborar de manera más eficiente en equipos grandes.
A continuación, tenemos un ejemplo detallado de cómo organizar un proyecto para maximizar su orden y funcionalidad.
├── ansible.cfg
├── inventories/
│ ├── production/
│ │ ├── group_vars/
│ │ ├── host_vars/
│ │ └── inventory
│ ├── staging/
│ │ ├── group_vars/
│ │ ├── host_vars/
│ │ └── inventory
├── playbooks/
│ ├── site.yml
│ ├── webservers.yml
│ └── dbservers.yml
├── roles/
│ ├── common/
│ │ ├── tasks/
│ │ ├── handlers/
│ │ ├── templates/
│ │ ├── files/
│ │ ├── vars/
│ │ ├── defaults/
│ │ ├── meta/
│ │ └── README.md
│ ├── webserver/
│ │ ├── tasks/
│ │ ├── handlers/
│ │ ├── templates/
│ │ ├── files/
│ │ ├── vars/
│ │ ├── defaults/
│ │ ├── meta/
│ │ └── README.md
│ └── dbserver/
│ ├── tasks/
│ ├── handlers/
│ ├── templates/
│ ├── files/
│ ├── vars/
│ ├── defaults/
│ ├── meta/
│ └── README.md
└── README.md
ansible.cfg: Archivo de configuración de Ansible donde puedes definir parámetros como la ubicación del inventario, la clave SSH, etc.
inventories/: Directorio que contiene los inventarios de hosts organizados por entorno (producción, staging, etc.).
group_vars/ y host_vars/: Carpetas donde puedes definir variables específicas para grupos de hosts o hosts individuales.
playbooks/: Directorio donde guardas tus playbooks. Los playbooks son archivos YAML que definen las tareas a realizar en los hosts.
roles/: Directorio que contiene los roles. Cada rol se organiza en varias subcarpetas.
-
tasks/: Contiene los archivos YAML que definen las tareas a ejecutar. -
handlers/: Tareas que se ejecutan cuando son notificadas por otras tareas. -
templates/: Archivos de plantilla que pueden contener variables. -
files/: Archivos estáticos que se copian directamente a los hosts. -
vars/: Archivos YAML que definen variables utilizadas en las tareas. -
defaults/: Variables por defecto para el rol. -
meta/: Información sobre el rol, como dependencias.
README.md: Archivo de documentación donde puedes describir el propósito y la estructura de tu proyecto Ansible.
Aquí tenemos otro ejemplo de una estructura básica del proyecto que incluye group_vars y host_vars:
proyecto_ansible/
├── ansible.cfg
├── inventory
├── group_vars/
│ └── webservers.yml
├── host_vars/
│ └── 192.168.1.10.yml
└── site.yml
Archivo de Inventario
El archivo inventory define nuestros grupos de hosts:
[webservers]
192.168.1.10
192.168.1.11
[dbservers]
192.168.1.20
192.168.1.21
Variables de Grupo (group_vars)
Podemos definir variables específicas para el grupo webservers creando un archivo webservers.yml dentro del directorio group_vars.
# Variables para el grupo webservers
apache_port: 8080
document_root: /var/www/html
Variables de Host (host_vars)
Podemos definir variables específicas para el host 192.168.1.10 creando un archivo 192.168.1.10.yml dentro del directorio host_vars.
# Variables para el host 192.168.1.10
apache_port: 9090
document_root: /srv/www
Plantilla (template)
Vamos a crear una plantilla apache.conf.j2 que utilice las variables definidas en group_vars y host_vars.
<VirtualHost *:>
DocumentRoot
<Directory >
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Playbook
Por último, vamos a crear un playbook site.yml que utilice estas variables.
- name: Configurar servidores web
hosts: webservers
tasks:
- name: Instalar Apache
apt:
name: apache2
state: present
- name: Configurar Apache
template:
src: apache.conf.j2
dest: /etc/apache2/sites-available/000-default.conf
- name: Reiniciar Apache
service:
name: apache2
state: restarted
Cómo Funciona
-
Cuando ejecutemos el playbook, Ansible buscará las variables en
group_varsprimero y luego enhost_vars. Si una variable está definida en ambos lugares, la definición en host_vars tendrá prioridad. -
En este caso, el host 192.168.1.10 usará apache_port: 9090 y document_root: /srv/www, mientras que el host 192.168.1.11 usará apache_port: 8080 y document_root: /var/www/html.
Para ejecutar el playbook:
ansible-playbook -i inventory site.yml
Esto aplicará las configuraciones especificadas en el playbook site.yml utilizando las variables definidas en group_vars y host_vars.