Se você precisa executar tarefas do Ansible com base em condições diferentes, está prestes a ter uma experiência agradável. O Ansible when
e outras condicionais permitem que você avalie condições, como baseado no sistema operacional, ou se uma tarefa depende da tarefa anterior.
Neste tutorial, você aprenderá a trabalhar com o Ansible when
e outras condicionais para executar tarefas sem bagunçar as coisas.
Vamos lá!
Pré-requisitos
Este tutorial inclui exemplos práticos. Se você quiser acompanhar, certifique-se de ter o seguinte em vigor:
- Um host controlador Ansible – Este tutorial usa o Ansible v2.9.24 hospedado em uma máquina Ubuntu 18.04.5 LTS.
- A remote computer to run commands.
- Você precisará de um arquivo de inventário configurado e um ou mais hosts já configurados para executar comandos e playbooks do Ansible. O tutorial usará um grupo de inventário chamado web.
Trabalhando com o when
do Ansible com Múltiplas Tarefas no Playbook
Tendo várias tarefas em um playbook pode ser um incômodo se todas forem executadas sem condições específicas. Vamos começar este tutorial definindo as condições when
do Ansible no playbook com várias tarefas.
1. Abra um terminal no host do controlador Ansible.
2. Execute os comandos abaixo para criar um diretório e nomeá-lo como desejar em seu diretório pessoal, e navegue até esse diretório.
Para este exemplo, o diretório é chamado ansible_when_condition_demo
. Este diretório conterá o playbook que você usará para invocar a condição when
na tarefa do Ansible.
3. Em seu editor de código preferido, crie um arquivo YAML no diretório ~/ansible_when_condition_demo. Neste exemplo, o arquivo é chamado my_playbook.yml. Copie e cole o conteúdo do playbook YAML abaixo no arquivo my_playbook.yml.
Em ambas as tarefas abaixo (Task-1
e Task-2
), as condições when
verificam em qual sistema operacional cada host remoto está. O resultado é então passado para a variável de espaço reservado ansible_os_family
em cada tarefa.
Se o valor dos espaços reservados ansible_os_family
for igual a RedHat
ou Debian
, então o Ansible executa uma das tarefas para instalar o Apache.
4. Agora execute o comando ansible-playbook
abaixo para executar as tarefas definidas no playbook (meu_playbook.yml) no host remoto, definido no seu arquivo de inventário existente.
Na captura de tela abaixo, você pode ver que:
- A primeira TAREFA retornou um status OK, o que mostra que a tarefa não requer nenhuma alteração.
- A segunda TAREFA retornou o status pulando. Quando a condição não é atendida, a tarefa será pulada.
- A terceira TAREFA retornou um status alterado, o que indica que o host remoto não estava no estado adequado (ou seja, o Apache não está presente) e foi modificado para instalar o Apache.

5. Abra uma sessão SSH para o host remoto, que foi o alvo do playbook do Ansible, usando seu cliente SSH favorito para verificar se o Apache está instalado e em execução.
6. Por fim, execute o comando service
abaixo para verificar se o Apache está instalado (status apache2
) no host remoto.
Como você pode ver abaixo, você instalou o serviço Apache na máquina remota.

Trabalhando com when
e loops do Ansible
Você executou anteriormente tarefas do Ansible de acordo com um when
do Ansible para um parâmetro específico, como ansible_os_family
. Mas talvez você precise verificar uma condição com vários parâmetros definidos em uma lista. Se for o caso, tente adicionar um loop
em uma tarefa.
Abra o arquivo my_playbook.yml que você criou anteriormente (passo três embaixo de “Trabalhando com Ansible when
com Múltiplas Tarefas no Playbook”). Substitua o conteúdo do arquivo my_playbook.yml com o código abaixo.
A tarefa no código abaixo (Tarefa-1
) executa um loop
onde a condição when
verifica se o valor do item é maior que cinco e retorna o resultado.
Agora execute o comando abaixo para executar o playbook como fez anteriormente.
Abaixo, você pode ver o status de pular quando a condição é falsa e o status alterado quando a condição é verdadeira.

when
condition for multiple parameters Trabalhando com o Ansible when
e os facts
do Ansible
Talvez você queira adicionar múltiplas condições para executar uma tarefa. Se sim, aprenda como utilizar facts do Ansible dentro da condição when
. Os facts do Ansible permitem que você adicione uma declaração condicional para executar tarefas com base em fatos coletados, como seu sistema operacional, endereços IP, sistemas de arquivos anexados e muito mais.
Substitua o conteúdo do arquivo my_playbook.yml com o código abaixo.
No código abaixo, ambas as tarefas (Tarefa-1
e Tarefa-2
) só são executadas (desligamento do sistema) quando uma das condições abaixo é verdadeira:
- Ambos
distribution
edistribtion_major_version
retornaram um valor verdadeiro. - O valor de
os_family
é igual aCentOS
.
Execute o playbook como você fez anteriormente com o comando abaixo.
Observe abaixo que ambas as tarefas mostram o status de pular já que você está no Ubuntu. A tarefa só é executada se você estiver no CentOS.

A trabalhar com Ansible baseado em when
em Função de Valores Registados
Por vezes, deseja executar ou ignorar uma tarefa com base no resultado de uma tarefa anterior num playbook. Por exemplo, pode querer configurar um serviço após uma atualização da tarefa anterior. Nesse caso, utilize uma variável registada. Uma variável registada permite registar o resultado da tarefa anterior como uma variável e utilizá-la na próxima tarefa como entrada.
1. Crie um diretório vazio chamado /home/ubuntu/hello.
2. Substitua o conteúdo do ficheiro my_playbook.yml pelo código abaixo, que realiza o seguinte:
A primeira tarefa (Tarefa-1
) lista o conteúdo (ficheiros e subdiretórios) do diretório /etc/hosts
na memória e guarda esse resultado na variável contents1
através do comando register
.
A segunda tarefa (Tarefa-2
) lista o conteúdo (atualmente vazio) do diretório /home/ubuntu/hello na memória e guarda essa lista na variável contents2
.
A terceira tarefa (Tarefa-3
) verifica e imprime uma mensagem “O diretório está vazio” se o resultado registado para a variável contents1
ou contents2
estiver vazio.
A propriedade
stdout
da variávelcontents1
econtents2
é a saída do shell guardada a partir do resultado da execução dos comandos da tarefa.
3. Por fim, execute o playbook com o comando ansible-playbook
abaixo.
Como mostrado abaixo, uma vez que o resultado registrado para a variável contents2
está vazio, a terceira tarefa retorna a mensagem O diretório está vazio.

Ansible when
based on registered values Trabalhando com o when
do Ansible em Funções do Ansible
Neste exemplo final, você aprenderá como o when
do Ansible funciona dentro de funções do Ansible. As funções do Ansible permitem que você reutilize configurações padrão e faça uma implantação mais rápida. Continue lendo para aprender como uma tarefa invoca funções do Ansible somente se a condição when
do Ansible for verdadeira.
1. Execute os comandos abaixo para criar um diretório chamado ~/ansible_role_when_demo no seu diretório home e mudar para essa pasta como diretório de trabalho. O diretório ~/ansible_role_when_demo conterá os arquivos de demonstração deste exemplo.
2. Em seguida, execute os comandos abaixo para criar um diretório ~/ansible_role_when_demo/roles e ~/ansible_role_when_demo/roles/java/tasks.
Abaixo está o que cada diretório conterá:
- O diretório ~/ansible_role_when_demo/roles conterá o papel que você precisa implantar.
Por padrão, o Ansible procura papéis em dois locais: em um diretório chamado roles/ dentro do diretório onde o playbook reside ou em /etc/ansible/roles. Se você deseja armazenar papéis em caminhos diferentes, declare os caminhos usando o parâmetro
- role:
no playbook.
- A pasta ~/ansible_role_when_demo/roles/java/tasks conterá um arquivo main.yml que você precisará implantar um papel.
Agora, crie um arquivo chamado main.yml no diretório ~/ansible_role_when_demo/roles/java/tasks, em seguida, copie e cole o código do playbook abaixo para o arquivo main.yml.
O playbook abaixo instala o Java no nó remoto em que é executado com o módulo apt.
4. Crie outro arquivo YAML com o nome que preferir e copie/cole o código abaixo. Para este exemplo, o arquivo é nomeado ~/ansible_role_when_demo/java-setup.yml.
O código abaixo implanta o role
do Ansible (java
) para o usuário remoto (ubuntu
) que possui acesso de administrador apenas quando o usuário remoto estiver no sistema operacional Debian.
5. Execute o comando tree
para verificar se todas as pastas e arquivos necessários existem no diretório ~/ansible_role_when_demo.

6. Por fim, execute o playbook com o comando ansible-playbook
abaixo. ansible-playbook java-setup.yml
Abaixo, a tarefa retornou um status alterado, indicando que o Java foi instalado com sucesso, já que o nó remoto está em um sistema operacional Debian. Executando o playbook do Ansible usando
Ansible when
com funções do Ansible

Ansible when
with Ansible roles Conclusão
Neste tutorial, você aprendeu diferentes maneiras de usar o when
do Ansible e outras condições. Você também aprendeu como aplicar condições do Ansible when
, desde tarefas básicas aproveitando os fatos
do Ansible até a implantação de funções
do Ansible.
Agora, como você ampliaria esse conhecimento recém-descoberto? Talvez economizar tempo configurando vários servidores com modelos do Ansible enquanto aplica condições do Ansible when
?