Por: Adelmo da Silva – consultor de sistemas
Depois de adquirirmos conhecimento sobre algo, é natural que continuemos a evolução deste conhecimento. No último artigo, mostrei a estrutura e como funciona um Playbook. Já entendemos como é um Playbook e como executá-lo. Hoje, vamos dar mais um passo. Vamos realizar a instalação de dois pacotes no Linux, com a diferença de que teremos uma condição: Se for no Debian, será o apache2, se for no Oracle Linux, será o httpd. Com isso, podemos “programar” o Ansible para tomar decisões de acordo com o ambiente onde tal pacote será instalado. Com isso, damos ao Ansible o poder de decisão em tarefas para sistemas diferentes.
Vamos ensinar o Ansible a tomar decisões
Imagine uma situação onde é necessário instalar o serviço em um parque de 40 servidores, entre eles, Debian e Oracle Linux. Alguns pacotes de um mesmo serviço possuem nomes diferentes. Um exemplo clássico é o Apache. Nas distros da família Debian (Ubuntu, Linux Mint, PopOS!, etc…) utilizam o APT com o pacote APACHE2 para instalar o serviço Apache. Já nas famílias RedHat (CentOS, Oracle Linux, AlmaLinux, etc…) utilizam o YUM com o pacote HTTPD para instalação desse serviço.
Com o Ansible podemos fazer com que o Ansible tome uma decisão para instalar o Apache utilizando o pacote específico de cada família. Para isso, vamos dar uma olhada no playbooks abaixo:
—
– name: Instalar Apache em servidores Debian e RedHat
hosts: webservers
become: yes
tasks:
– name: Instalar Apache em Debian
apt:
name: apache2
state: present
update_cache: yes
when: ansible_os_family == “Debian”
– name: Instalar Apache em RedHat
yum:
name: httpd
state: present
when: ansible_os_family == “RedHat”
Repare que temos dois novos itens: o módulo WHEN e a variável ANSIBLE_OS_FAMILY.
O módulo WHEN tem a função de fazer uma verificação, baseado em uma condição. Se esta condição foi satisfeita, ele executa o comando da tarefa.
A variável ANSIBLE_OS_FAMILY identifica a qual família Linux o sistema operativo pertence. Essa variável torna-se, nesta tarefa, um auxiliar vital para que a condição do WHEN seja verificada.
Neste Playbook, temos duas condicionais when: ansible_os_family == “Debian” e “when: ansible_os_family == “RedHat”. Em ambas, a condição faz o seguinte:
Se a família do sistema operacional for igual a Debian, execute sudo apt install -y apache2.
Se a família do sistema operacional for igual a RedHat, execute sudo yum install -y httpd.
Com isso, a instalação ocorrerá de acordo com o sistema operativo. Podemos, também, adicionar condições para que cada serviço seja iniciado de acordo com seu sistema. Neste caso, adicionaremos estas duas tarefas para iniciar o Apache tanto no Debian, quanto no Oracle Linux:
– name: Habilitar e iniciar o serviço Apache em Debian
systemd:
name: apache2
state: started
enabled: yes
when: ansible_os_family == “Debian”
– name: Habilitar e iniciar o serviço Apache em RedHat
systemd:
name: httpd
state: started
enabled: yes
when: ansible_os_family == “RedHat”
Veja que o módulo SYSTEMD, que é módulo para gerenciar serviços no Linux, possui o nome do serviço de cada sistema operativo. A opção STATE indica que o serviço deve ser iniciado (STARTED). Por fim, a opção ENABLE, indica que os serviços devem ser habilitados para carregar depois do boot do sistema. O módulo WHEN é um módulo de decisão e que pode ser usado para qualquer outra aplicação que se precisa de condicional. Por exemplo, se a saída de uma tarefa for bem sucedida, a próxima poderá ser executada. Caso contrário, não seria executada. Caso queira se aprofundar mais, leia a documentação do Ansible sobre condicionais aqui: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html
Pronto. Assim, fazemos com que o Ansible tome decisão de instalação do mesmo pacote em sistemas diferentes, nos dando tempo para um delicioso cafezinho.