Ansible Hostvars

AnsibleBeginner
Pratique Agora

Introdução

As variáveis hostvars do Ansible são variáveis essenciais que armazenam informações sobre cada host gerenciado em sua infraestrutura. Essas variáveis permitem que você crie fluxos de trabalho de automação dinâmicos e flexíveis que se adaptam a diferentes servidores e ambientes.

Neste laboratório prático, você aprenderá a trabalhar com hostvars do Ansible do zero. Você configurará um inventário simples, acessará hostvars em playbooks, os usará em templates e explorará casos de uso práticos. Ao final deste laboratório, você entenderá como alavancar hostvars para tornar sua automação Ansible mais poderosa e adaptável.

Este é um Laboratório Guiado (Guided Lab), que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e obter experiência prática. Dados históricos mostram que este é um laboratório de nível avançado com uma taxa de conclusão de 50%. Ele recebeu uma taxa de avaliação positiva de 100% dos alunos.

Configurando o Ambiente do Laboratório

Antes de mergulharmos nas hostvars do Ansible, precisamos configurar nosso ambiente de trabalho. Nesta etapa, instalaremos o Ansible, criaremos uma estrutura de diretórios para o projeto e prepararemos nosso arquivo de inventário.

Instalando o Ansible

Vamos começar instalando o Ansible em nosso sistema:

sudo apt update
sudo apt install -y ansible

Após a instalação, verifique se o Ansible foi instalado corretamente:

ansible --version

Você deverá ver uma saída semelhante a esta:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, Mar 15 2023, 11:42:32) [GCC 11.3.0]
  jinja version = 3.0.3
  libyaml = True

Criando a Estrutura do Projeto

Agora, vamos criar uma estrutura de diretórios adequada para o nosso projeto Ansible:

mkdir -p ~/project/ansible_hostvars/inventory
mkdir -p ~/project/ansible_hostvars/group_vars
mkdir -p ~/project/ansible_hostvars/playbooks
mkdir -p ~/project/ansible_hostvars/templates
cd ~/project/ansible_hostvars

Criando um Arquivo de Inventário

O Ansible usa arquivos de inventário para definir os hosts e grupos que ele gerenciará. Vamos criar um arquivo de inventário simples com alguns hosts de exemplo:

cat > ~/project/ansible_hostvars/inventory/hosts << 'EOF'
[webservers]
web01 ansible_host=192.168.1.10 http_port=80 max_connections=100
web02 ansible_host=192.168.1.11 http_port=8080 max_connections=200

[dbservers]
db01 ansible_host=192.168.1.20 db_port=3306 backup_dir=/var/backups
db02 ansible_host=192.168.1.21 db_port=5432 backup_dir=/opt/backups

[all:vars]
ansible_connection=local
ansible_user=labex
environment=development
EOF

Neste arquivo de inventário:

  • Definimos dois grupos: webservers e dbservers
  • Cada host possui variáveis específicas como http_port ou db_port
  • Definimos variáveis globais para todos os hosts sob [all:vars]
  • Estamos usando ansible_connection=local pois este é um ambiente de laboratório

Vamos também criar um arquivo ansible.cfg simples em nosso diretório de projeto:

cat > ~/project/ansible_hostvars/ansible.cfg << 'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
EOF

Agora, vamos verificar nosso inventário:

cd ~/project/ansible_hostvars
ansible-inventory --list

Você deverá ver uma saída em formato JSON exibindo todos os hosts e suas variáveis em seu inventário.

Parabéns! Você configurou com sucesso seu ambiente Ansible e criou um inventário com variáveis de host. Na próxima etapa, exploraremos como acessar essas variáveis usando hostvars.

Explorando as Hostvars do Ansible

Agora que configuramos nosso ambiente, vamos explorar as hostvars do Ansible e aprender como acessá-las em playbooks.

Entendendo as Hostvars

No Ansible, hostvars é uma variável especial que contém informações sobre todos os hosts em seu inventário. É um dicionário onde as chaves são nomes de hosts e os valores são dicionários contendo todas as variáveis definidas para cada host.

Vamos criar um playbook simples para explorar as hostvars:

cat > ~/project/ansible_hostvars/playbooks/explore_hostvars.yml << 'EOF'
---
- name: Explore hostvars
  hosts: all
  gather_facts: no
  tasks:
    - name: Display host variables for the current host
      debug:
        msg: "Host: {{ inventory_hostname }} has the following variables: {{ hostvars[inventory_hostname] }}"
      
    - name: Display a specific variable for the current host
      debug:
        msg: "Host {{ inventory_hostname }} has environment: {{ hostvars[inventory_hostname]['environment'] }}"
EOF

Agora, vamos executar este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/explore_hostvars.yml

Você deverá ver uma saída com as variáveis de cada host. A primeira tarefa mostra todas as variáveis para cada host, enquanto a segunda tarefa mostra uma variável específica.

Criando um Playbook de Variáveis Específicas do Host

Vamos criar outro playbook que demonstra como acessar diferentes tipos de variáveis de host:

cat > ~/project/ansible_hostvars/playbooks/host_specific_vars.yml << 'EOF'
---
- name: Working with host-specific variables
  hosts: all
  gather_facts: no
  tasks:
    - name: Display web server information
      debug:
        msg: "Web server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['http_port'] | default('N/A') }}"
      when: inventory_hostname in groups['webservers']
    
    - name: Display database server information
      debug:
        msg: "Database server {{ inventory_hostname }} running on port {{ hostvars[inventory_hostname]['db_port'] | default('N/A') }}"
      when: inventory_hostname in groups['dbservers']
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_specific_vars.yml

Você deverá ver uma saída que mostra informações diferentes para servidores web e servidores de banco de dados, com base em suas respectivas variáveis.

Acessando Variáveis de Outros Hosts

Uma das funcionalidades poderosas das hostvars é que você pode acessar variáveis de qualquer host em seu inventário. Vamos criar um playbook que demonstra isso:

cat > ~/project/ansible_hostvars/playbooks/cross_host_vars.yml << 'EOF'
---
- name: Access variables from other hosts
  hosts: web01
  gather_facts: no
  tasks:
    - name: Display information about web01 and db01
      debug:
        msg: |
          Web server: {{ inventory_hostname }}
          Web server port: {{ hostvars[inventory_hostname]['http_port'] }}
          
          Database server: db01
          Database port: {{ hostvars['db01']['db_port'] }}
          Backup directory: {{ hostvars['db01']['backup_dir'] }}
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/cross_host_vars.yml

Você deverá ver uma saída que mostra informações de web01 e db01, mesmo que o playbook esteja sendo executado apenas em web01.

Isso demonstra como as hostvars lhe dão acesso a variáveis de todos os hosts em seu inventário, permitindo que você crie relacionamentos e dependências complexas entre os hosts em sua automação.

Usando Hostvars em Templates

Templates são uma das funcionalidades mais poderosas do Ansible, e elas se tornam ainda mais poderosas quando combinadas com hostvars. Nesta etapa, aprenderemos como usar hostvars dentro de templates Jinja2 para criar arquivos de configuração dinâmicos.

Introdução aos Templates Jinja2

O Ansible usa o motor de templates Jinja2 para gerar conteúdo dinâmico. Templates permitem que você crie arquivos de configuração que se adaptam a diferentes hosts e cenários.

Vamos criar um template de configuração simples para servidor web:

mkdir -p ~/project/ansible_hostvars/templates
cat > ~/project/ansible_hostvars/templates/nginx.conf.j2 << 'EOF'
## Server configuration for {{ inventory_hostname }}
## Generated by Ansible

server {
    listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }};
    server_name {{ inventory_hostname }};
    
    root /var/www/html;
    
    ## Environment: {{ hostvars[inventory_hostname]['environment'] }}
    
    ## Max connections: {{ hostvars[inventory_hostname]['max_connections'] | default(50) }}
    
    location / {
        index index.html index.htm;
    }
}
EOF

Agora, vamos criar um template de configuração de banco de dados:

cat > ~/project/ansible_hostvars/templates/db.conf.j2 << 'EOF'
## Database configuration for {{ inventory_hostname }}
## Generated by Ansible

port = {{ hostvars[inventory_hostname]['db_port'] }}
backup_directory = {{ hostvars[inventory_hostname]['backup_dir'] }}
environment = {{ hostvars[inventory_hostname]['environment'] }}

## Database hosts in environment:
{% for host in groups['dbservers'] %}
## - {{ host }} ({{ hostvars[host]['ansible_host'] }})
{% endfor %}
EOF

Criando um Playbook para Aplicar Templates

Vamos criar um playbook que aplica esses templates:

cat > ~/project/ansible_hostvars/playbooks/apply_templates.yml << 'EOF'
---
- name: Apply configuration templates
  hosts: all
  gather_facts: no
  tasks:
    - name: Create output directory
      file:
        path: ~/project/ansible_hostvars/output
        state: directory
      run_once: true
    
    - name: Apply web server configuration template
      template:
        src: ../templates/nginx.conf.j2
        dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-nginx.conf
      when: inventory_hostname in groups['webservers']
    
    - name: Apply database configuration template
      template:
        src: ../templates/db.conf.j2
        dest: ~/project/ansible_hostvars/output/{{ inventory_hostname }}-db.conf
      when: inventory_hostname in groups['dbservers']
EOF

Agora, vamos executar este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/apply_templates.yml

Após executar o playbook, verifique os arquivos de configuração gerados:

ls -l ~/project/ansible_hostvars/output/

Você deverá ver arquivos de configuração gerados para cada host. Vamos examinar uma das configurações do servidor web:

cat ~/project/ansible_hostvars/output/web01-nginx.conf

E uma das configurações do banco de dados:

cat ~/project/ansible_hostvars/output/db01-db.conf

Observe como os templates usam hostvars para gerar dinamicamente configurações adaptadas a cada host.

Usando Loops e Condicionais em Templates

Templates podem usar loops e condicionais para criar conteúdo ainda mais dinâmico. Vamos criar um template abrangente de arquivo de hosts:

cat > ~/project/ansible_hostvars/templates/hosts.j2 << 'EOF'
## Hosts file generated by Ansible
127.0.0.1 localhost

## Web servers
{% for host in groups['webservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}

## Database servers
{% for host in groups['dbservers'] %}
{{ hostvars[host]['ansible_host'] }} {{ host }}
{% endfor %}
EOF

Vamos adicionar uma tarefa ao nosso playbook para aplicar este template:

cat > ~/project/ansible_hostvars/playbooks/hosts_template.yml << 'EOF'
---
- name: Create hosts file from template
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Create output directory
      file:
        path: ~/project/ansible_hostvars/output
        state: directory
    
    - name: Generate hosts file
      template:
        src: ../templates/hosts.j2
        dest: ~/project/ansible_hostvars/output/hosts
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/hosts_template.yml

Verifique o arquivo de hosts gerado:

cat ~/project/ansible_hostvars/output/hosts

Você deverá ver um arquivo de hosts com todos os seus servidores web e de banco de dados, gerado dinamicamente a partir do seu inventário.

Técnicas Avançadas de Hostvars

Agora que você dominou os conceitos básicos de hostvars, vamos explorar algumas técnicas avançadas para trabalhar com elas no Ansible.

Usando Variáveis de Grupo com Hostvars

Variáveis de grupo permitem que você defina variáveis que se aplicam a grupos inteiros de hosts. Vamos criar um arquivo de variáveis de grupo na localização correta dentro do nosso diretório de inventário:

mkdir -p ~/project/ansible_hostvars/inventory/group_vars
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers.yml << 'EOF'
---
web_server_type: nginx
default_document_root: /var/www/html
enable_ssl: true
ssl_cert_path: /etc/ssl/certs
EOF

E outro para os servidores de banco de dados:

cat > ~/project/ansible_hostvars/inventory/group_vars/dbservers.yml << 'EOF'
---
backup_frequency: daily
backup_retention: 7
monitoring_enabled: true
alert_email: admin@example.com
EOF

Agora, vamos criar um playbook que acessa essas variáveis de grupo através de hostvars:

cat > ~/project/ansible_hostvars/playbooks/group_vars_demo.yml << 'EOF'
---
- name: Demonstrate group variables with hostvars
  hosts: all
  gather_facts: no
  tasks:
    - name: Display web server group variables
      debug:
        msg: |
          Host: {{ inventory_hostname }}
          Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] | default('N/A') }}
          Document Root: {{ hostvars[inventory_hostname]['default_document_root'] | default('N/A') }}
          SSL Enabled: {{ hostvars[inventory_hostname]['enable_ssl'] | default('N/A') }}
      when: inventory_hostname in groups['webservers']
    
    - name: Display database server group variables
      debug:
        msg: |
          Host: {{ inventory_hostname }}
          Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] | default('N/A') }}
          Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] | default('N/A') }}
          Monitoring Enabled: {{ hostvars[inventory_hostname]['monitoring_enabled'] | default('N/A') }}
      when: inventory_hostname in groups['dbservers']
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/group_vars_demo.yml

Você deverá ver a saída mostrando como as variáveis de grupo estão disponíveis através de hostvars.

Criando Relatórios Dinâmicos de Inventário

Vamos criar um playbook que gera relatórios com base nos dados do inventário:

cat > ~/project/ansible_hostvars/playbooks/inventory_report.yml << 'EOF'
---
- name: Generate inventory reports
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Create output directory
      file:
        path: ~/project/ansible_hostvars/output
        state: directory
    
    - name: Generate web servers report
      template:
        src: ../templates/web_report.j2
        dest: ~/project/ansible_hostvars/output/web_servers_report.txt
    
    - name: Generate database servers report
      template:
        src: ../templates/db_report.j2
        dest: ~/project/ansible_hostvars/output/db_servers_report.txt
EOF

Agora, vamos criar os templates para esses relatórios:

cat > ~/project/ansible_hostvars/templates/web_report.j2 << 'EOF'
========================================
WEB SERVERS INVENTORY REPORT
========================================

{% for host in groups['webservers'] %}
HOST: {{ host }}
  IP Address: {{ hostvars[host]['ansible_host'] }}
  HTTP Port: {{ hostvars[host]['http_port'] }}
  Max Connections: {{ hostvars[host]['max_connections'] | default('Not specified') }}
  Web Server Type: {{ hostvars[host]['web_server_type'] | default('Not specified') }}
  Environment: {{ hostvars[host]['environment'] }}

{% endfor %}
EOF
cat > ~/project/ansible_hostvars/templates/db_report.j2 << 'EOF'
========================================
DATABASE SERVERS INVENTORY REPORT
========================================

{% for host in groups['dbservers'] %}
HOST: {{ host }}
  IP Address: {{ hostvars[host]['ansible_host'] }}
  DB Port: {{ hostvars[host]['db_port'] }}
  Backup Directory: {{ hostvars[host]['backup_dir'] }}
  Backup Frequency: {{ hostvars[host]['backup_frequency'] | default('Not specified') }}
  Backup Retention: {{ hostvars[host]['backup_retention'] | default('Not specified') }}
  Environment: {{ hostvars[host]['environment'] }}

{% endfor %}
EOF

Agora, execute o playbook de relatório de inventário:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/inventory_report.yml

Verifique os relatórios gerados:

cat ~/project/ansible_hostvars/output/web_servers_report.txt
cat ~/project/ansible_hostvars/output/db_servers_report.txt

Esses relatórios demonstram como hostvars podem ser usados para criar relatórios abrangentes da sua infraestrutura.

Lidando com Variáveis Ausentes

Ao trabalhar com hostvars, é importante lidar com casos em que as variáveis podem estar ausentes. Vamos criar um playbook que demonstra o acesso seguro a variáveis:

cat > ~/project/ansible_hostvars/playbooks/safe_variable_access.yml << 'EOF'
---
- name: Demonstrate safe variable access
  hosts: all
  gather_facts: no
  tasks:
    - name: Using default filter
      debug:
        msg: "The value is: {{ hostvars[inventory_hostname]['nonexistent_variable'] | default('Not defined') }}"
    
    - name: Using conditional checks
      debug:
        msg: >
          {% if 'special_variable' in hostvars[inventory_hostname] %}
          The special variable is: {{ hostvars[inventory_hostname]['special_variable'] }}
          {% else %}
          The special variable is not defined for this host.
          {% endif %}
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/safe_variable_access.yml

A saída mostra como lidar com segurança com variáveis ausentes usando o filtro default e verificações condicionais.

Melhores Práticas e Aplicações no Mundo Real

Nesta etapa final, exploraremos as melhores práticas para trabalhar com hostvars e veremos algumas aplicações no mundo real.

Melhores Práticas para Organização de Variáveis

Organizar suas variáveis corretamente é crucial para manter um código Ansible limpo e de fácil manutenção. Vamos criar uma configuração de inventário mais estruturada para demonstrar as melhores práticas:

mkdir -p ~/project/ansible_hostvars/inventory/group_vars/all
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/webservers
mkdir -p ~/project/ansible_hostvars/inventory/group_vars/dbservers
mkdir -p ~/project/ansible_hostvars/inventory/host_vars

Agora, vamos criar alguns arquivos de variáveis organizados:

cat > ~/project/ansible_hostvars/inventory/group_vars/all/common.yml << 'EOF'
---
## Common variables for all hosts
ntp_servers:
  - ntp1.example.com
  - ntp2.example.com

timezone: UTC

monitoring_enabled: true
monitoring_server: monitor.example.com
EOF
cat > ~/project/ansible_hostvars/inventory/group_vars/webservers/web.yml << 'EOF'
---
## Web server specific variables
http_protocol: https
default_vhost: default.example.com
web_user: www-data
web_group: www-data

firewall_ports:
  - 80
  - 443
EOF
cat > ~/project/ansible_hostvars/inventory/host_vars/web01.yml << 'EOF'
---
## Host-specific variables for web01
server_role: primary
backup_server: web02
custom_vhosts:
  - name: site1.example.com
    docroot: /var/www/site1
  - name: site2.example.com
    docroot: /var/www/site2
EOF

Vamos criar um playbook que demonstra o acesso a essas variáveis estruturadas:

cat > ~/project/ansible_hostvars/playbooks/structured_vars.yml << 'EOF'
---
- name: Demonstrate structured variables
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Display structured variables
      debug:
        msg: |
          Common variables:
          - NTP Servers: {{ hostvars['web01']['ntp_servers'] | default([]) }}
          - Timezone: {{ hostvars['web01']['timezone'] | default('Not set') }}
          
          Web server variables:
          - HTTP Protocol: {{ hostvars['web01']['http_protocol'] | default('Not set') }}
          - Default VHost: {{ hostvars['web01']['default_vhost'] | default('Not set') }}
          
          Host-specific variables for web01:
          - Server Role: {{ hostvars['web01']['server_role'] | default('Not set') }}
          - Backup Server: {{ hostvars['web01']['backup_server'] | default('Not set') }}
          - Custom VHosts: {{ hostvars['web01']['custom_vhosts'] | default([]) }}
EOF

Execute este playbook:

cd ~/project/ansible_hostvars
ANSIBLE_INVENTORY=~/project/ansible_hostvars/inventory ansible-playbook playbooks/structured_vars.yml

Nota: Estamos usando a variável de ambiente ANSIBLE_INVENTORY para especificar um caminho de inventário diferente para este exemplo.

Criando um Gerador de Configuração

Vamos criar uma aplicação prática que gera arquivos de configuração para vários serviços:

mkdir -p ~/project/ansible_hostvars/templates/configs

Crie arquivos de template para diferentes serviços:

cat > ~/project/ansible_hostvars/templates/configs/apache.conf.j2 << 'EOF'
## Apache configuration for {{ inventory_hostname }}
Listen {{ hostvars[inventory_hostname]['http_port'] | default(80) }}

ServerName {{ inventory_hostname }}
DocumentRoot {{ hostvars[inventory_hostname]['default_document_root'] | default('/var/www/html') }}

MaxClients {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}

## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/mysql.conf.j2 << 'EOF'
## MySQL configuration for {{ inventory_hostname }}
[mysqld]
port = {{ hostvars[inventory_hostname]['db_port'] | default(3306) }}
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}

## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF
cat > ~/project/ansible_hostvars/templates/configs/postgresql.conf.j2 << 'EOF'
## PostgreSQL configuration for {{ inventory_hostname }}
listen_addresses = '*'
port = {{ hostvars[inventory_hostname]['db_port'] | default(5432) }}

max_connections = {{ hostvars[inventory_hostname]['max_connections'] | default(100) }}

## Backup directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('/var/backups') }}
## Environment: {{ hostvars[inventory_hostname]['environment'] }}
EOF

Agora, crie um playbook para aplicar esses templates:

cat > ~/project/ansible_hostvars/playbooks/config_generator.yml << 'EOF'
---
- name: Generate service configurations
  hosts: all
  gather_facts: no
  tasks:
    - name: Create output directory
      file:
        path: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}
        state: directory
    
    - name: Generate Apache configuration for web servers
      template:
        src: ../templates/configs/apache.conf.j2
        dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/apache.conf
      when: inventory_hostname in groups['webservers']
    
    - name: Generate MySQL configuration for database servers with MySQL
      template:
        src: ../templates/configs/mysql.conf.j2
        dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/mysql.conf
      when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '3306'
    
    - name: Generate PostgreSQL configuration for database servers with PostgreSQL
      template:
        src: ../templates/configs/postgresql.conf.j2
        dest: ~/project/ansible_hostvars/output/configs/{{ inventory_hostname }}/postgresql.conf
      when: inventory_hostname in groups['dbservers'] and hostvars[inventory_hostname]['db_port'] | string == '5432'
EOF

Execute o playbook do gerador de configuração:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/config_generator.yml

Explore os arquivos de configuração gerados:

find ~/project/ansible_hostvars/output/configs -type f | sort

Visualize algumas das configurações geradas:

cat ~/project/ansible_hostvars/output/configs/web01/apache.conf
cat ~/project/ansible_hostvars/output/configs/db01/mysql.conf
cat ~/project/ansible_hostvars/output/configs/db02/postgresql.conf

Criando uma Ferramenta de Documentação de Host

Finalmente, vamos criar uma ferramenta que gera documentação abrangente para cada host em nosso inventário:

cat > ~/project/ansible_hostvars/templates/host_doc.j2 << 'EOF'
## Host Documentation for {{ inventory_hostname }}
==============================================

### Basic Information
- Hostname: {{ inventory_hostname }}
- IP Address: {{ hostvars[inventory_hostname]['ansible_host'] }}
- Environment: {{ hostvars[inventory_hostname]['environment'] | default('Not specified') }}

### Role Information
{% if inventory_hostname in groups['webservers'] %}
- Role: Web Server
- HTTP Port: {{ hostvars[inventory_hostname]['http_port'] | default('Not specified') }}
- Max Connections: {{ hostvars[inventory_hostname]['max_connections'] | default('Not specified') }}
{% if 'web_server_type' in hostvars[inventory_hostname] %}
- Web Server Type: {{ hostvars[inventory_hostname]['web_server_type'] }}
{% endif %}
{% endif %}

{% if inventory_hostname in groups['dbservers'] %}
- Role: Database Server
- DB Port: {{ hostvars[inventory_hostname]['db_port'] | default('Not specified') }}
- Backup Directory: {{ hostvars[inventory_hostname]['backup_dir'] | default('Not specified') }}
{% if 'backup_frequency' in hostvars[inventory_hostname] %}
- Backup Frequency: {{ hostvars[inventory_hostname]['backup_frequency'] }}
- Backup Retention: {{ hostvars[inventory_hostname]['backup_retention'] }} days
{% endif %}
{% endif %}

### Related Hosts
{% if inventory_hostname in groups['webservers'] %}
#### Database Servers:
{% for db_host in groups['dbservers'] %}
- {{ db_host }} ({{ hostvars[db_host]['ansible_host'] }})
{% endfor %}
{% endif %}

{% if inventory_hostname in groups['dbservers'] %}
#### Web Servers:
{% for web_host in groups['webservers'] %}
- {{ web_host }} ({{ hostvars[web_host]['ansible_host'] }})
{% endfor %}
{% endif %}
EOF

Crie um playbook para gerar a documentação:

cat > ~/project/ansible_hostvars/playbooks/host_documentation.yml << 'EOF'
---
- name: Generate host documentation
  hosts: all
  gather_facts: no
  tasks:
    - name: Create output directory
      file:
        path: ~/project/ansible_hostvars/output/docs
        state: directory
    
    - name: Generate host documentation
      template:
        src: ../templates/host_doc.j2
        dest: ~/project/ansible_hostvars/output/docs/{{ inventory_hostname }}.md
EOF

Execute o playbook de documentação:

cd ~/project/ansible_hostvars
ansible-playbook playbooks/host_documentation.yml

Visualize a documentação gerada:

ls -l ~/project/ansible_hostvars/output/docs/
cat ~/project/ansible_hostvars/output/docs/web01.md
cat ~/project/ansible_hostvars/output/docs/db01.md

Parabéns! Você concluiu uma exploração abrangente de hostvars do Ansible, desde o uso básico até aplicações avançadas. Você aprendeu como acessar variáveis de host, usá-las em templates e criar ferramentas práticas para gerenciar sua infraestrutura.

Resumo

Neste laboratório, você explorou o poder e a versatilidade das hostvars do Ansible. Veja o que você aprendeu:

  1. Configuração do Ambiente: Você configurou um ambiente Ansible com uma estrutura de inventário que incluía hosts, grupos e variáveis.

  2. Explorando hostvars: Você aprendeu como acessar hostvars em playbooks, incluindo o acesso a variáveis do host atual e de outros hosts no inventário.

  3. Usando hostvars em Templates: Você criou templates Jinja2 que utilizam hostvars para gerar arquivos de configuração dinâmicos adaptados a cada host.

  4. Técnicas Avançadas de hostvars: Você explorou variáveis de grupo (group variables), relatórios de inventário dinâmico e técnicas para lidar com variáveis ausentes de forma segura.

  5. Melhores Práticas e Aplicações no Mundo Real: Você implementou a organização estruturada de variáveis e criou aplicações práticas, incluindo um gerador de configuração e uma ferramenta de documentação de host.

As hostvars do Ansible são um recurso poderoso que permite criar fluxos de trabalho de automação dinâmicos e adaptáveis. Ao entender como trabalhar efetivamente com hostvars, você pode criar soluções de automação mais flexíveis e fáceis de manter para sua infraestrutura.

Ao continuar sua jornada com o Ansible, lembre-se de que hostvars são apenas uma parte do rico ecossistema de recursos do Ansible. Considere explorar outros recursos como roles, collections e inventários dinâmicos para aprimorar ainda mais suas capacidades de automação.