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_vars
primero 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
.