Como Trabalhar com Ansible em Diferentes Condições

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:

  • 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.

# Crie um diretório chamado ~/ansible_when_condition_demo
mkdir ~/ansible_when_condition_demo
# Altere o diretório de trabalho para ~/ansible_when_condition_demo
cd ~/ansible_when_condition_demo

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.

---
- name: Ansible tasks to work on Ansible When
# Definindo o servidor remoto onde o Ansible será executado
  hosts: web
  remote_user: ubuntu # Utilizando o host remoto como ubuntu
  become: true # Executando as tarefas como um 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 (meu_playbook.yml) no host remoto, definido no 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 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.
Invoking the ansible-playbook using ansible-playbook command

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.

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

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.

---
- 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 como fez anteriormente.

 ansible-playbook my_playbook.yml

Abaixo, você pode ver o status de 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 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 e distribtion_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:
# (Tarefa-1): Para desligar o nó remoto se a distribuição for CentOS com uma 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"
# (Tarefa-2): Para desligar o nó remoto se a família do sistema operacional 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 você fez anteriormente com o comando abaixo.

ansible-playbook my_playbook.yml

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.

Executing the ansible-playbook with Ansible facts in Ansible when

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ável contents1 e contents2 é a saída do shell guardada 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 em /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 em /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, uma vez que 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. 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.

# Crie um diretório chamado ~/ansible_role_when_demo no seu diretório home
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á 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.
# 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, 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.

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

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.

- 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 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

Running the Ansible playbook using 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?

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