Introdução
Um playbook reutilizável deve usar dados do ambiente em vez de fixar respostas separadas para desenvolvimento e produção no código. A seleção do inventário, o escopo das variáveis e os fatos dos destinos determinam o que cada nó recebe.
Você usará dois inventários que selecionam nós SSH diferentes, armazenará dados de grupos e hosts junto a cada origem e gerará configurações com um único playbook. Também aplicará uma substituição temporária por variável extra e restaurará uma configuração de referência estável.
Separar os dados de inventário por ambiente
Nesta etapa, você dará a desenvolvimento e produção origens de inventário e valores de variáveis de grupo separados.
Entre no projeto:
cd /home/labex/project
O laboratório fornece dois inventários pequenos. Leia cada um antes de executar a automação:
cat inventories/dev/hosts.ini
cat inventories/prod/hosts.ini
O grupo app de dev contém web1; o grupo app de prod contém web2. Seus endereços e configurações SSH estão preparados. Esses são nós realmente distintos, não dois nomes para localhost.
-i seleciona uma origem de inventário para esta invocação, substituindo o inventário padrão do projeto. Visualize previamente cada ambiente separadamente:
ansible app -i inventories/dev/hosts.ini --list-hosts
ansible app -i inventories/prod/hosts.ini --list-hosts
Espere web1 para dev e web2 para prod. Não combine essas duas origens para simular ambientes isolados: as origens podem se mesclar, e o mesmo nome de host no inventário continua identificando um único host. Mantenha explícita a invocação de cada ambiente.
Uma variável é um valor nomeado usado pela automação. Um mapeamento YAML usa linhas name: value. O Ansible carrega group_vars/app.yml junto a um inventário para seu grupo app. Crie dados diferentes para o mesmo nome de grupo em cada ambiente:
cat > inventories/dev/group_vars/app.yml <<'EOF'
environment_label: development
release_channel: preview
EOF
cat > inventories/prod/group_vars/app.yml <<'EOF'
environment_label: production
release_channel: stable
EOF
Inspecione os dados resolvidos do inventário. --list retorna JSON, incluindo um objeto _meta.hostvars para os valores dos hosts:
ansible-inventory -i inventories/dev/hosts.ini --list
ansible-inventory -i inventories/prod/hosts.ini --list
O host dev deve resolver development/preview; o host prod, production/stable. Um arquivo de variáveis só tem utilidade quando o inventário e o grupo pretendidos realmente o carregam.
Usar variáveis de hosts e fatos reais
Nesta etapa, você substituirá o valor de grupo de um host e renderizará os dados do ambiente em configurações gerenciadas reais.
Um arquivo em host_vars recebe o nome de um host do inventário. Para o mesmo host e chave, sua variável de host substitui a variável de grupo usada aqui. Dê ao canary de desenvolvimento um canal de versão específico do host:
cat > inventories/dev/host_vars/web1.yml <<'EOF'
release_channel: canary
EOF
Desenvolvimento ainda tem environment_label development, mas web1 agora resolve release_channel canary. Produção permanece stable. Confirme a resolução de dev:
ansible-inventory -i inventories/dev/hosts.ini --list
Escreva um playbook reutilizável para qualquer um dos inventários:
cat > deploy-info.yml <<'EOF'
- name: Configure environment-specific application settings
hosts: app
gather_facts: true
vars:
banner_prefix: Managed environment
tasks:
- name: Write settings from variables and facts
ansible.builtin.copy:
dest: /home/automation/app-settings.conf
content: |
[application]
environment={{ environment_label }}
channel={{ release_channel }}
host={{ inventory_hostname }}
distribution={{ ansible_facts.distribution }}
label={{ banner_prefix }}
mode: "0640"
EOF
vars define um valor no nível do play, banner_prefix. Dentro do conteúdo de copy, {{ variable_name }} insere um valor no momento da execução. Essa é uma substituição básica de valores; um laboratório posterior gerenciará modelos Jinja independentes.
O | do YAML mantém o conteúdo indentado seguinte como texto de várias linhas, incluindo sua quebra de linha final. inventory_hostname é o nome atual no inventário. Com gather_facts true, o Ansible coleta dados do destino antes das tarefas; ansible_facts.distribution fornece a distribuição real do sistema operacional. São dados do destino, não um fato sobre o controlador.
Verifique a sintaxe e execute o mesmo playbook separadamente para cada ambiente:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --syntax-check
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml
Leia os dois arquivos reais por seus respectivos inventários:
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
ansible app -i inventories/prod/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
Desenvolvimento deve conter environment=development, channel=canary e host=web1. Produção deve conter environment=production, channel=stable e host=web2. Ambos devem conter distribution=Ubuntu e label=Managed environment. O playbook compartilhado produziu conteúdo diferente nos destinos usando dados diferentes.
Substituir um valor em uma invocação e restaurar a referência
Nesta etapa, você usará uma variável extra sem editar os dados salvos do inventário e depois voltará a uma configuração de referência convergida.
-e fornece uma variável extra para esta execução. Ela substitui os valores de grupo e host demonstrados aqui. Selecione temporariamente um canal hotfix apenas em desenvolvimento:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml -e release_channel=hotfix
Leia a configuração de dev resultante:
ansible app -i inventories/dev/hosts.ini -m ansible.builtin.command -a 'cat /home/automation/app-settings.conf'
Seu canal deve ser hotfix. Os arquivos de origem group_vars e host_vars não foram editados por -e, e produção não foi selecionada.
Execute sem a variável extra para restaurar o canal canary salvo de web1:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml
Agora execute a previsão dos dois ambientes de referência:
ansible-playbook -i inventories/dev/hosts.ini deploy-info.yml --check
ansible-playbook -i inventories/prod/hosts.ini deploy-info.yml --check
Cada host selecionado deve informar zero alterações pendentes e nenhum resultado de falha ou unreachable. As relações limitadas de precedência praticadas aqui são dados de grupo, uma substituição por host e uma substituição por variável extra. Regras mais complexas de precedência estão fora deste exercício.
Resumo
Você selecionou inventários de ambientes distintos, carregou dados de grupo, aplicou uma substituição específica de host e renderizou fatos reais dos destinos com um playbook compartilhado. Uma variável extra temporária alterou uma invocação, e as execuções seguintes com os dados de referência devolveram os dois ambientes a configurações declaradas estáveis.


