Introdução
Os inventários descrevem os hosts que o Ansible pode gerenciar e os grupos aos quais esses hosts pertencem. Uma boa estrutura de inventário permite que você direcione os hosts de forma clara e atribua variáveis no escopo correto.
Neste laboratório, você construirá um inventário estático com aliases de host, grupos, grupos filhos, variáveis de grupo, variáveis de host e um pequeno playbook que comprova que as variáveis são resolvidas conforme o esperado.
Criar um Projeto de Inventário
Nesta etapa, você criará os diretórios do projeto usados para a prática de inventário. Este laboratório utiliza aliases de host locais para que você possa aprender o comportamento do inventário com segurança dentro de uma única VM RHEL 10.
Crie e acesse o projeto.
cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
Crie o arquivo ansible.cfg para que o Ansible utilize seu inventário por padrão.
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
retry_files_enabled = False
interpreter_python = auto_silent
EOF
Este laboratório coloca os arquivos de variáveis em inventory/group_vars e inventory/host_vars. Esse layout mantém os dados do inventário organizados e deixa claro que as variáveis pertencem aos hosts definidos em inventory/hosts.
Definir Hosts, Grupos e Filhos
Nesta etapa, você criará um inventário estático. Cada alias de host usa ansible_connection=local, para que os aliases se comportem como hosts gerenciados, enquanto os comandos ainda são executados nesta VM. Grupos filhos permitem que um grupo contenha outros grupos.
Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible. Isso mantém os comandos estáveis, mesmo quando o LabEx executa cada etapa separadamente.
cd /home/labex/project/rhce-ansible
Crie o arquivo inventory/hosts.
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
[db]
db1 ansible_connection=local
[prod:children]
web
db
EOF
Inspecione o gráfico de grupos.
ansible-inventory --graph
As seções web e db definem grupos comuns. A seção [prod:children] define um grupo pai, portanto, o gráfico deve mostrar prod contendo ambos os grupos e todos os três aliases de host.
Adicionar Variáveis de Grupo e de Host
Nesta etapa, você anexará variáveis a grupos e a hosts individuais. Uma variável de grupo aplica-se a todos os hosts desse grupo. Uma variável de host substitui ou complementa valores para um host específico.
Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.
cd /home/labex/project/rhce-ansible
Crie variáveis para os hosts web.
cat > inventory/group_vars/web.yml <<'EOF'
service_role: web
service_port: 8080
EOF
Esses valores aplicam-se a todos os hosts no grupo web. Neste inventário, tanto web1 quanto web2 devem herdar a função (role) e a porta web.
Crie variáveis para os hosts de banco de dados.
cat > inventory/group_vars/db.yml <<'EOF'
service_role: database
service_port: 5432
EOF
O grupo de banco de dados recebe valores diferentes porque hosts de banco de dados geralmente precisam de configurações de serviço distintas. Separar os arquivos de grupo evita a necessidade de colocar condicionais em cada tarefa do playbook.
Crie uma variável específica para o host web2.
cat > inventory/host_vars/web2.yml <<'EOF'
rack: rack-b
EOF
Variáveis de host são o escopo mais restrito usado neste laboratório. Apenas web2 deve ter o valor rack, o que facilita a visualização da diferença entre dados de todo o grupo e dados específicos de um host.
Inspecionar Variáveis de Host Resolvidas
Nesta etapa, você solicitará ao Ansible que mostre as variáveis resolvidas para hosts selecionados. Esta é uma maneira segura de depurar o inventário antes de escrever playbooks.
Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.
cd /home/labex/project/rhce-ansible
Inspecione o web1.
ansible-inventory --host web1
O web1 deve mostrar a função e a porta web, mas nenhuma variável rack. Essa ausência é uma evidência útil de que o arquivo específico do host para web2 não foi aplicado acidentalmente a todo o grupo.
Inspecione o web2 e procure pelo valor de rack específico do host.
ansible-inventory --host web2 | grep -E 'service_role|service_port|rack'
Inspecione o db1.
ansible-inventory --host db1 | grep -E 'service_role|service_port'
Compare todos os três hosts antes de escrever o playbook. Este é o fluxo normal de depuração de inventário: confirme primeiro os valores de grupo herdados e, em seguida, verifique se existe um valor específico para o host.
Escrever um Playbook de Relatório de Variáveis
Nesta etapa, você criará um pequeno playbook que escreve um arquivo de relatório por host do inventário. A tarefa usa inventory_hostname para que cada alias obtenha seu próprio arquivo, mesmo que todos os aliases sejam executados localmente.
Antes de executar os comandos nesta etapa, retorne ao diretório do projeto Ansible.
cd /home/labex/project/rhce-ansible
Crie o playbook.
cat > playbooks/write-inventory-report.yml <<'EOF'
---
- name: Write inventory variable reports
hosts: prod
gather_facts: false
tasks:
- name: Write report for each inventory host
ansible.builtin.copy:
dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
content: "{{ inventory_hostname }} role={{ service_role }} port={{ service_port }} rack={{ rack | default('none') }}\n"
mode: '0644'
EOF
A expressão {{ inventory_hostname }} expande-se para o alias do host atual, permitindo que uma única tarefa crie arquivos de relatório separados para web1, web2 e db1. O filtro default('none') evita erros em hosts que não definem rack.
Execute o playbook e inspecione os relatórios.
ansible-playbook playbooks/write-inventory-report.yml
O play tem como alvo prod, que é o grupo pai contendo tanto os hosts web quanto os de banco de dados. O resumo deve incluir todos os três aliases e terminar com failed=0.
cat reports/*.txt
Os arquivos de relatório são a prova final de que as variáveis de inventário foram resolvidas corretamente. web2.txt deve incluir rack-b, enquanto os outros hosts devem mostrar rack=none.
Resumo
Você construiu um inventário estático com grupos, grupos filhos, variáveis de grupo e variáveis de host. Você também validou a resolução de variáveis com ansible-inventory e um pequeno playbook.


