Técnicas Avanzadas de vars_files
En este paso final, exploraremos algunas técnicas avanzadas para trabajar con vars_files en Ansible, incluida la organización jerárquica de variables y la implementación de la organización de variables basada en roles.
Organización Jerárquica de Variables
En proyectos complejos, a menudo es útil organizar las variables jerárquicamente. Creemos una estructura donde tengamos:
- Variables comunes que se aplican a todos los entornos
- Variables específicas del entorno
- Variables específicas de la aplicación
Primero, creemos un archivo de variables comunes:
Cree un nuevo archivo en ~/project/ansible-vars-demo/vars/common.yml con el siguiente contenido:
---
## Common variables for all environments
organization: "Example Corp"
admin_email: "admin@example.com"
timezone: "UTC"
A continuación, creemos variables específicas de la aplicación:
Cree un nuevo archivo en ~/project/ansible-vars-demo/vars/database.yml con el siguiente contenido:
---
## Database application variables
db_port: 3306
db_user: "dbuser"
db_name: "appdb"
db_max_connections: 100
Creación de un Playbook Jerárquico
Ahora, creemos un playbook que demuestre el uso de estas variables jerárquicas. Cree un nuevo archivo en ~/project/ansible-vars-demo/hierarchical_setup.yml con el siguiente contenido:
---
- name: Hierarchical Variable Demo
hosts: webservers
vars:
env: dev
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display hierarchical configuration
debug:
msg: >
Configuration for {{ app }} in {{ environment_name }} environment:
- Organization: {{ organization }}
- Admin Email: {{ admin_email }}
- Timezone: {{ timezone }}
- Debug Mode: {{ debug_mode }}
- Log Level: {{ log_level }}
- DB Port: {{ db_port }}
- DB User: {{ db_user }}
- DB Max Connections: {{ db_max_connections }}
- name: Create hierarchical config file
copy:
content: |
## {{ organization }} Configuration
## {{ environment_name }} Environment
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
BACKUP_FREQUENCY={{ backup_frequency }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
DB_MAX_CONNECTIONS={{ db_max_connections }}
dest: "/tmp/{{ environment_name }}_{{ app }}_config.conf"
mode: "0644"
Entendiendo las Variables de Grupo y Host
Además de vars_files, Ansible también admite el almacenamiento de variables en directorios especiales llamados group_vars y host_vars. Veamos cómo funcionan:
Cree una estructura de directorio para las variables de grupo y host:
mkdir -p ~/project/ansible-vars-demo/group_vars
mkdir -p ~/project/ansible-vars-demo/host_vars
Ahora, cree un archivo de variables de grupo para el grupo 'webservers':
Cree un nuevo archivo en ~/project/ansible-vars-demo/group_vars/webservers.yml con el siguiente contenido:
---
## Variables for all webservers
firewall_enabled: true
ssh_port: 22
monitoring_enabled: true
Y cree un archivo de variables de host para 'localhost':
Cree un nuevo archivo en ~/project/ansible-vars-demo/host_vars/localhost.yml con el siguiente contenido:
---
## Variables specific to localhost
local_backup_path: "/tmp/backups"
is_development_machine: true
Creación de un Playbook con Todos los Tipos de Variables
Creemos un playbook final que demuestre el uso de todos los tipos de variables juntos. Cree un nuevo archivo en ~/project/ansible-vars-demo/complete_setup.yml con el siguiente contenido:
---
- name: Complete Variable Demo
hosts: webservers
vars:
env: prod
app: database
vars_files:
- "vars/common.yml"
- "vars/{{ env }}_environment.yml"
- "vars/{{ app }}.yml"
tasks:
- name: Display complete configuration
debug:
msg: >
Complete configuration for {{ inventory_hostname }}:
- Organization: {{ organization }}
- Environment: {{ environment_name }}
- Debug Mode: {{ debug_mode }}
- Firewall Enabled: {{ firewall_enabled }}
- SSH Port: {{ ssh_port }}
- Monitoring Enabled: {{ monitoring_enabled }}
- Local Backup Path: {{ local_backup_path }}
- Is Development Machine: {{ is_development_machine }}
- name: Create complete config file
copy:
content: |
## {{ organization }} - {{ environment_name }} Environment
## Host: {{ inventory_hostname }}
## Common Settings
ADMIN_EMAIL={{ admin_email }}
TIMEZONE={{ timezone }}
## Environment Settings
DEBUG={{ debug_mode }}
LOG_LEVEL={{ log_level }}
## Server Settings
FIREWALL_ENABLED={{ firewall_enabled }}
SSH_PORT={{ ssh_port }}
MONITORING_ENABLED={{ monitoring_enabled }}
## Host-specific Settings
LOCAL_BACKUP_PATH={{ local_backup_path }}
IS_DEVELOPMENT_MACHINE={{ is_development_machine }}
## {{ app | capitalize }} Settings
DB_PORT={{ db_port }}
DB_USER={{ db_user }}
DB_NAME={{ db_name }}
dest: "/tmp/complete_config.conf"
mode: "0644"
Ejecutando los Playbooks Avanzados
Ejecutemos nuestro playbook jerárquico:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
Debería ver una salida que incluye variables de los tres vars_files.
Ahora, ejecutemos nuestro playbook completo:
ansible-playbook -i inventory.ini complete_setup.yml
Esta vez, debería ver una salida que incluye variables de vars_files, group_vars y host_vars.
Verificando los Archivos de Configuración
Verifiquemos los archivos de configuración creados por nuestros playbooks avanzados:
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
Entendiendo la Precedencia de Variables en Ansible
Al usar múltiples fuentes de variables, Ansible sigue un orden específico de precedencia:
- Variables de la línea de comandos (
-e o --extra-vars)
- Variables definidas en el play
- Variables de archivos y roles incluidos
- Hechos del host (Host facts)
- Variables del host (Host vars)
- Variables del grupo (Group vars)
- Variables del inventario (Inventory vars)
- Variables predeterminadas del rol (Role default vars)
Esto significa que las variables definidas en host_vars anularán las mismas variables definidas en group_vars, que a su vez anularán las mismas variables definidas en vars_files.
Esta estructura jerárquica le brinda una forma poderosa de administrar la configuración en diferentes entornos, hosts y aplicaciones.