Técnicas Avançadas de vars_files
Nesta etapa final, exploraremos algumas técnicas avançadas para trabalhar com vars_files no Ansible, incluindo a organização hierárquica de variáveis e a implementação da organização de variáveis baseada em funções (roles).
Organizando Variáveis Hierarquicamente
Em projetos complexos, é frequentemente útil organizar as variáveis hierarquicamente. Vamos criar uma estrutura onde temos:
- Variáveis comuns que se aplicam a todos os ambientes
- Variáveis específicas do ambiente
- Variáveis específicas da aplicação
Primeiro, vamos criar um ficheiro de variáveis comuns:
Crie um novo ficheiro em ~/project/ansible-vars-demo/vars/common.yml com o seguinte conteúdo:
---
## Common variables for all environments
organization: "Example Corp"
admin_email: "admin@example.com"
timezone: "UTC"
Em seguida, vamos criar variáveis específicas da aplicação:
Crie um novo ficheiro em ~/project/ansible-vars-demo/vars/database.yml com o seguinte conteúdo:
---
## Database application variables
db_port: 3306
db_user: "dbuser"
db_name: "appdb"
db_max_connections: 100
Criando um Playbook Hierárquico
Agora, vamos criar um playbook que demonstra o uso destas variáveis hierárquicas. Crie um novo ficheiro em ~/project/ansible-vars-demo/hierarchical_setup.yml com o seguinte conteúdo:
---
- 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"
Compreendendo as Variáveis de Grupo e Host
Além de vars_files, o Ansible também suporta o armazenamento de variáveis em diretórios especiais chamados group_vars e host_vars. Vamos ver como isso funciona:
Crie uma estrutura de diretórios para variáveis de grupo e host:
mkdir -p ~/project/ansible-vars-demo/group_vars
mkdir -p ~/project/ansible-vars-demo/host_vars
Agora, crie um ficheiro de variáveis de grupo para o grupo 'webservers':
Crie um novo ficheiro em ~/project/ansible-vars-demo/group_vars/webservers.yml com o seguinte conteúdo:
---
## Variables for all webservers
firewall_enabled: true
ssh_port: 22
monitoring_enabled: true
E crie um ficheiro de variáveis de host para 'localhost':
Crie um novo ficheiro em ~/project/ansible-vars-demo/host_vars/localhost.yml com o seguinte conteúdo:
---
## Variables specific to localhost
local_backup_path: "/tmp/backups"
is_development_machine: true
Criando um Playbook com Todos os Tipos de Variáveis
Vamos criar um playbook final que demonstra o uso de todos os tipos de variáveis juntos. Crie um novo ficheiro em ~/project/ansible-vars-demo/complete_setup.yml com o seguinte conteúdo:
---
- 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"
Executando os Playbooks Avançados
Vamos executar o nosso playbook hierárquico:
cd ~/project/ansible-vars-demo
ansible-playbook -i inventory.ini hierarchical_setup.yml
Você deve ver uma saída que inclui variáveis de todos os três vars_files.
Agora, vamos executar o nosso playbook completo:
ansible-playbook -i inventory.ini complete_setup.yml
Desta vez, você deve ver uma saída que inclui variáveis de vars_files, group_vars e host_vars.
Verificando os Ficheiros de Configuração
Vamos verificar os ficheiros de configuração criados pelos nossos playbooks avançados:
cat /tmp/dev_database_config.conf
cat /tmp/complete_config.conf
Compreendendo a Precedência de Variáveis no Ansible
Ao usar múltiplas fontes de variáveis, o Ansible segue uma ordem específica de precedência:
- Variáveis da linha de comando (
-e ou --extra-vars)
- Variáveis definidas no play
- Variáveis de ficheiros e funções (roles) incluídas
- Fatos do host
- Variáveis do host (
host vars)
- Variáveis do grupo (
group vars)
- Variáveis do inventário
- Variáveis padrão da função (role)
Isso significa que as variáveis definidas em host_vars substituirão as mesmas variáveis definidas em group_vars, que substituirão as mesmas variáveis definidas em vars_files.
Esta estrutura hierárquica oferece uma maneira poderosa de gerenciar a configuração em diferentes ambientes, hosts e aplicações.