Como Trabalhar com Ansible Quando e Outras Condições

Se você precisa executar tarefas do Ansible com base em condições diferentes, está prestes a ter uma ótima experiência. O Ansible when e outras condicionais permitem avaliar condições, como com base no sistema operacional, ou se uma tarefa depende da tarefa anterior.

Neste tutorial, você aprenderá como trabalhar com o Ansible when e outras condicionais para executar tarefas sem complicar as coisas.

Vamos lá!

Pré-requisitos

Este tutorial inclui exemplos práticos. Se você quiser acompanhar, certifique-se de ter o seguinte em funcionamento:

  • 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

Ter várias tarefas em um playbook pode ser cansativo se todas forem executadas sem condições específicas. Vamos começar este tutorial definindo as condições do Ansible when no playbook do Ansible com múltiplas tarefas.

1. Abra um terminal no host do controlador do Ansible.

2. Execute os comandos abaixo para criar um diretório e dar-lhe o nome que preferir em seu diretório pessoal, e navegue até esse diretório.

Para este exemplo, o diretório é chamado de ansible_when_condition_demo. Este diretório conterá o playbook que você usará para invocar a condição when dentro da tarefa do Ansible.

# Criar um diretório chamado ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# Mudar o diretório de trabalho para ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

3. No 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 para o arquivo my_playbook.yml.

Em ambas as tarefas abaixo (Tarefa-1 e Tarefa-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 marcadores de posição ansible_os_family for igual a RedHat ou Debian, então o Ansible executa uma das tarefas para instalar o Apache.

---
- name: Ansible tasks to work on Ansible When
# Definindo o servidor remoto onde o Ansible será executado
  hosts: web
  remote_user: ubuntu # Usando o host remoto como ubuntu
  become: true # Executando as tarefas como usuário elevado (sudo)
  tasks:

# (Tarefa-1) Verifica se ansible_os_family == "RedHat" e então instala o Apache no nó remoto
    - name: Install Apache on CentOS  Server
      yum: name=httpd  state=present
      become: yes
      when: ansible_os_family == "RedHat"

# (Tarefa-2) Verifica se ansible_os_family == "Debian" e então instala o Apache no nó remoto
    - name: Install Apache on Ubuntu Server
      apt:name=apache2 state=present
      become: yes
      when: ansible_os_family == "Debian"

4. Agora execute o comando ansible-playbook abaixo para executar as tarefas definidas no playbook (my_playbook.yml) no host remoto, definido em seu arquivo de inventário existente.

ansible-playbook my_playbook.yml 

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 de pular. Quando a condição não é atendida, a tarefa será ignorada.
  • A terceira TAREFA retornou um status de alterado, indicando 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.
Invoking the ansible-playbook using ansible-playbook command

5. Abra uma sessão SSH no 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.

service status apache2

Como você pode ver abaixo, você instalou o serviço Apache na máquina remota.

Verifying the Apache service on the remote node

Trabalhando com when e loops do Ansible

Anteriormente, você executou 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 em “Trabalhando com Ansible when com Múltiplas Tarefas no Playbook”). Substitua o conteúdo do arquivo my_playbook.yml pelo código abaixo.

A tarefa no código abaixo (Tarefa-1) executa um loop onde a condição do when verifica se o valor do item é maior que cinco e retorna o resultado.

---
- name: Ansible tasks to work on Ansible When
# Definindo o servidor remoto onde o Ansible será executado
  hosts: web
  remote_user: ubuntu   # Usando o host remoto como ubuntu
  become: true
  tasks:
  # (Tarefa -1) Verificando se o valor do item é maior que 5
    - name: Run with items greater than 5
      ansible.builtin.command: echo {{ item }}
      loop: [ 0, 2, 4, 6, 8, 10 ]
      when: item > 5*

Agora execute o comando abaixo para executar o playbook, assim como fez anteriormente.

 ansible-playbook my_playbook.yml

Abaixo, você pode ver a tarefa retornando o status pular quando a condição é falsa e o status alterado quando a condição é verdadeira.

Checking the when condition for multiple parameters

Trabalhando com o Ansible when e os facts do Ansible

Talvez você queira adicionar várias condições para executar uma tarefa. Se for o caso, aprenda como utilizar os facts do Ansible dentro da condição when. Os facts do Ansible permitem adicionar uma declaração condicional para executar tarefas com base em fatos coletados, como seu sistema operacional, endereços IP, sistemas de arquivos conectados e muito mais.

Substitua o conteúdo do arquivo my_playbook.yml pelo código abaixo.

No código abaixo, ambas as tarefas (Task-1 e Task-2) só são executadas (desligamento do sistema) quando uma das condições abaixo é verdadeira:

  • Ambos os valores distribution e distribution_major_version retornaram um valor verdadeiro.
  • O valor de os_family é igual a CentOS.
---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Task-1): Desligar o nó remoto se a distribuição for CentOS com a versão principal 6 
    - name: Shut down CentOS 6 systems
      ansible.builtin.command: /sbin/shutdown -t now
      when:
        - ansible_facts['distribution'] == "CentOS"
        - ansible_facts['distribution_major_version'] == "6"
# (Task-2): Desligar o nó remoto se a os_family for CentOS. 
    - name: Shut down CentOS flavored systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "CentOS"

Execute o playbook como fez anteriormente com o comando abaixo.

ansible-playbook my_playbook.yml

Observe abaixo que ambas as tarefas mostram o status pular, pois você está no Ubuntu. A tarefa só é executada se estiver no CentOS.

Executing the ansible-playbook with Ansible facts in Ansible when

Trabalhando com Ansible when Baseado em Valores Registrados

Às vezes você deseja executar ou pular uma tarefa com base no resultado de uma tarefa anterior em um playbook. Por exemplo, você pode querer configurar um serviço após uma atualização de tarefa anterior. Nesse caso, use uma variável registrada. Uma variável registrada permite que você registre o resultado da tarefa anterior como uma variável e a use para a próxima tarefa como entrada.

1. Crie um diretório vazio chamado /home/ubuntu/hello.

2. Substitua o conteúdo do arquivo my_playbook.yml com o código abaixo, que realiza o seguinte:

A primeira tarefa (Tarefa-1) lista o conteúdo (arquivos e subdiretórios) do diretório /etc/hosts na memória e salva esse resultado na variável contents1 via o comando register.

A segunda tarefa (Tarefa-2) lista o conteúdo (atualmente vazio) do diretório /home/ubuntu/hello na memória e salva essa lista na variável contents2.

A terceira tarefa (Tarefa-3) verifica e imprime uma mensagem “O diretório está vazio” se o resultado registrado para a variável contents1 ou contents2 estiver vazio.

A propriedade stdout da variável contents1 e contents2 é a saída do shell salva a partir do resultado da execução dos comandos da tarefa.

---
- name: Ansible When Single task example
  hosts: web
  remote_user: ubuntu
  become: true
  tasks:
# (Tarefa-1): Listar o conteúdo do diretório /etc/hosts
      - name: List contents of directory and Store in content1
        ansible.builtin.command: ls /etc/hosts
        register: contents1
# (Tarefa-2): Listar o conteúdo do diretório /home/ubuntu/hello
      - name: List contents of directory and Store in content2
        ansible.builtin.command: ls /home/ubuntu/hello
        register: contents2
# (Tarefa-3): Exibir "O diretório está vazio" se algum dos diretórios
# /etc/hosts ou /home/ubuntu/hello estiver vazio
      - name: Check contents for emptiness for content1 or content2
        ansible.builtin.debug:
          msg: "Directory is empty"
        when: contents1.stdout == "" or contents2.stdout == ""

3. Por fim, execute o playbook com o comando ansible-playbook abaixo.

ansible-playbook my_playbook.yml

Como mostrado abaixo, como o resultado registrado para a variável contents2 está vazio, a terceira tarefa retorna a mensagem O diretório está vazio.

Running the Ansible playbook for 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 roles. As roles do Ansible permitem que você reutilize configurações padrão e faça implantações mais rápidas. Continue lendo para aprender como uma tarefa invoca roles do Ansible apenas se a condição do when do Ansible for verdadeira.

1. Execute os comandos abaixo para criar um diretório chamado ~/ansible_role_when_demo em seu diretório pessoal e mude para esse diretório como o diretório de trabalho. O diretório ~/ansible_role_when_demo conterá os arquivos de demonstração deste exemplo.

# Crie um diretório chamado ~/ansible_role_when_demo em seu diretório pessoal
mkdir ~/ansible_role_when_demo
# Mude para o diretório ~/ansible_role_when_demo
cd ~/ansible_role_when_demo

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á a função que você precisa implantar.

Por padrão, o Ansible procura funções 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 funções em caminhos diferentes, declare os caminhos usando o parâmetro - role: no playbook.

  • O diretório ~/ansible_role_when_demo/roles/java/tasks conterá um arquivo main.yml que você precisará implantar uma função.
# Crie um diretório chamado roles dentro do diretório ~/ansible_role_when_demo
mkdir -p roles
# Altere o diretório de trabalho para o diretório ~/ansible_role_when_demo/roles
cd roles 
# Crie o diretório pai (-p) chamado java e um subdiretório chamado tasks
mkdir -p java/tasks

Agora, crie um arquivo chamado main.yml no diretório ~/ansible_role_when_demo/roles/java/tasks, depois copie e cole o código do playbook abaixo para o arquivo main.yml.

O playbook abaixo instala o Java no nó remoto onde é executado com o módulo apt.

---
# Instalando o Java (Open Jdk)
- name: Install Java 1.8
  apt: name=openjdk-8-jdk

4. Crie outro arquivo YAML com um nome de sua preferência e copie/cole o código abaixo. Para este exemplo, o arquivo é nomeado ~/ansible_role_when_demo/java-setup.yml.

O código abaixo implementa a role do Ansible (java) para o usuário remoto (ubuntu) que possui acesso administrativo apenas quando o usuário remoto estiver no sistema operacional Debian.

- name: Java Installation playbook
# Definindo o servidor remoto onde o pacote será implantado
  hosts: myserver
  remote_user: ubuntu   # Usando o usuário remoto como ubuntu
  become: true
  tasks:  
  roles:
     - role: java
       # Execute a tarefa apenas se o usuário remoto estiver em um sistema operacional Debian.
       when: ansible_facts['os_family'] == 'Debian'

5. Execute o comando tree para verificar se todas as pastas e arquivos necessários existem no diretório ~/ansible_role_when_demo.

Verifying all of the required folders in the ~/ansible_role_when_demo directory

6. Por fim, execute o playbook com o comando ansible-playbook abaixo. ansible-playbook java-setup.yml

ansible-playbook java-setup.yml

Abaixo, a tarefa retornou um status changed, indicando que o Java foi instalado com sucesso, pois o nó remoto está em um sistema operacional Debian. Executando o playbook do Ansible usando Ansible when com funções do Ansible

Running the Ansible playbook using Ansible when with Ansible roles

Conclusão

Neste tutorial, você aprendeu diferentes maneiras de usar o Ansible when e outras condicionais. Você também aprendeu como aplicar condições do Ansible when, desde tarefas básicas utilizando facts do Ansible até a implantação de roles do Ansible.

Agora, como você ampliaria esse conhecimento recém-adquirido? Talvez economizando tempo configurando vários servidores com modelos do Ansible enquanto aplica condições do Ansible when?

Source:
https://adamtheautomator.com/ansible-when/