Depurar Problemas de Precedência de Variáveis

AnsibleBeginner
Pratique Agora

Introdução

Quando a mesma variável é definida em vários locais, o Ansible aplica regras de precedência. Depurar o valor final é essencial antes de alterar um playbook.

Neste laboratório, você definirá as mesmas variáveis nos níveis all, group, host e extra-var, e então gerará relatórios que comprovam qual nível prevalece.

Criar um Projeto de Prática de Precedência

Nesta etapa, você criará um projeto com diretórios de variáveis all, group e host.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory/group_vars,inventory/host_vars,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[web]
web1 ansible_connection=local
web2 ansible_connection=local
EOF

Este laboratório define intencionalmente a mesma variável em vários locais. Os relatórios mostrarão o valor final que o Ansible seleciona, em vez de exigir que você infira a precedência apenas pelos nomes dos arquivos.

Definir Variáveis All e Group

Nesta etapa, você definirá valores de referência em group_vars/all.yml e, em seguida, os substituirá para o grupo web. 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
cat > inventory/group_vars/all.yml <<'EOF'
app_port: 8000
app_source: all
EOF
cat > inventory/group_vars/web.yml <<'EOF'
app_port: 8080
app_source: group
EOF

O arquivo group_vars/all.yml aplica-se a todos os hosts, enquanto group_vars/web.yml aplica-se apenas ao grupo web. Como web1 e web2 são hosts web, os valores do grupo devem substituir a referência de todos os hosts.

cat inventory/group_vars/all.yml inventory/group_vars/web.yml

Definir uma Substituição de Variável de Host

Nesta etapa, você substituirá as mesmas variáveis apenas para o web2. As variáveis de host são mais específicas do que as variáveis de grupo. 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
cat > inventory/host_vars/web2.yml <<'EOF'
app_port: 9090
app_source: host
EOF

Este arquivo aplica-se apenas ao web2, portanto, ele deve substituir os valores do grupo web para esse host. O web1 ainda deve usar os valores do grupo.

ansible-inventory --host web2

Use a saída do inventário para confirmar o valor resolvido antes de executar um playbook. Ele deve mostrar app_port como 9090 para o web2.

Gerar os Valores de Variáveis Resolvidos

Nesta etapa, você escreverá e executará um playbook que registra os valores finais que o Ansible escolheu para cada host. 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
cat > playbooks/show-precedence.yml <<'EOF'
---
- name: Show resolved variable precedence
  hosts: web
  gather_facts: false
  tasks:
    - name: Write resolved variable report
      ansible.builtin.copy:
        dest: "/home/labex/project/rhce-ansible/reports/{{ inventory_hostname }}.txt"
        content: |
          host={{ inventory_hostname }}
          app_port={{ app_port }}
          app_source={{ app_source }}
        mode: '0644'
EOF

O playbook grava os valores finais resolvidos em arquivos. Isso torna a precedência visível: cada relatório registra tanto a porta escolhida quanto um rótulo de origem que indica qual camada prevaleceu.

ansible-playbook playbooks/show-precedence.yml | tee reports/normal-run.txt
cat reports/web1.txt reports/web2.txt

O web1 deve mostrar app_source=group, e o web2 deve mostrar app_source=host. Isso prova que as variáveis de host são mais específicas do que as variáveis de grupo.

Substituir com Variáveis Extras

Nesta etapa, você passará variáveis extras com -e. As variáveis extras possuem precedência muito alta e substituem tanto as variáveis de grupo quanto as de host para esta execução. 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
ansible-playbook playbooks/show-precedence.yml -e app_port=10080 -e app_source=extra | tee reports/extra-run.txt

As variáveis extras são intencionalmente poderosas. Elas substituem tanto as variáveis de grupo quanto as de host para esta execução, mas não editam os arquivos de variáveis no disco.

cat reports/web1.txt reports/web2.txt

Ambos os relatórios agora devem mostrar os valores das variáveis extras. Se apenas um host foi alterado, verifique novamente como as opções -e foram digitadas.

Resumo

Você comparou variáveis all, group, host e extra e, em seguida, usou relatórios gerados para comprovar qual valor o Ansible aplicou em cada nível de precedência.