Por: Adelmo da Silva – consultor de sistemas
É natural que em uma infra-estrutura existam dois ou mais Sistemas Operacionais compondo um projecto, ou a rede de uma empresa. E isso é comum. Depende das necessidades de cada empresa, ou sector desta empresa. Já vi clusters com 12 VMs (máquinas virtuais) composto por Oracle Linux e Ubuntu Server onde estava funcionando aplicações e serviços normalmente. Serviços como APACHE ou MYSQL, a funcionar em ambos servidores e com as mesmas configurações. E, sem mencionar que em projectos, no mínimo, existem três ambientes:Produção, Homologação e Dev. Ou seja, neste exemplo, serão 03 clusters, um para cada ambiente. Serão 36 VMs para que o produto/serviço seja o mesmo em todos os ambientes e tenha o mesmo desempenho.
Créditos: D.R
Agora, imagine uma situação onde o time de desenvolvimento solicita a actualização dos serviços Apache em todos os servidores de Homologação e Produção, pois estão com uma versão diferente do que está em Dev, que é a versão mais actual. Seriam 24 VMs para actualizar utilizando tanto o gestor de pacotes YUM (Oracle Linux) e APT (Ubuntu Server). A Instalação de pacote por pacote, considerando o login, o tempo de download e instalação por servidor, dura pelo menos uns 2 minutos sendo bem ágil, totalizando 48 minutos nos 24 servidores. Nesse tempo, o cafezinho já esfriou. 🙁
No Ubuntu, utilizamos o seguinte comando para actualizar o Apache:
sudo apt-get upgrade apache2
Já no Oracle Linux, o comando é:
sudo yum update httpd
O Apache, apesar de ser a mesma aplicação, possui nomes diferentes no Ubuntu Server (família Debian) e no Oracle Linux (família RedHat). No Ubuntu Server o pacote se chama APACHE2 e no Oracle Linux se chama HTTPD.
No Ansible, seria normal criarmos um playbook para cada sistema, por exemplo: install_apache_ubuntu.yaml e install_apache_oraclelinux.yaml. Mas, isso não seria efectivo, seria sim mais um trabalho. O Ansible é poliglota, consegue falar com, praticamente, qualquer sistema operacional. Ele possui um módulo chamado WHEN, que cria um loop de decisão baseado na família de distribuição. Caso seja da família RedHat, o Ansible executará a instalação usando o YUM e, consequentemente, o pacote HTTPD. Caso seja a família Debian, será executada a instalação usando o APT e, consequentemente, o pacote APACHE2. Observe este playbook:
—
– name: Actualizando o Apache
hosts: env-homolog, env-dev
become: true
tasks:
– name: Actualizando o Apache no Oracle Linux
when: ansible_os_family == ‘RedHat’
yum:
name: httpd
state: latest
– name: Actualizando o Apache no Ubuntu
when: ansible_os_family == ‘Debian’
apt:
name: apache2
state: latest
– name: Reiniciando o Serviço Apache
service:
name: “{{ ‘httpd’ if ansible_os_family == ‘RedHat’ else ‘apache2’ }}”
state: restarted
enabled: true
Neste exemplo, o módulo WHEN utiliza a variável ANSIBLE_OS_FAMILY para identificar a qual família o sistema operacional pertence. Assim que for identificado, será executado o comando de actualização correspondente. A opção STATE solicita que seja aplicada a última versão do pacote (LATEST). E, de quebra, ainda faz um restart no serviço, de acordo com a família do sistema, para garantir que a actualização seja aplicada. A saída deste playbook será assim:
PLAY [Actualizando o Apache] **************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [oracle_server01]
ok: [oracle_server02]
ok: [oracle_server03]
ok: [oracle_server04]
ok: [oracle_server05]
ok: [oracle_server06]
ok: [ubuntu_server01]
ok: [ubuntu_server02]
ok: [ubuntu_server03]
ok: [ubuntu_server04]
ok: [ubuntu_server05]
ok: [ubuntu_server06]
TASK [Actualizando o Apache no Oracle Linux] *******************************************************************
changed: [oracle_server01]
changed: [oracle_server02]
changed: [oracle_server03]
changed: [oracle_server04]
changed: [oracle_server05]
changed: [oracle_server06]
TASK [Actualizando o Apache no Ubuntu] *************************************************************************
changed: [ubuntu_server01]
changed: [ubuntu_server02]
changed: [ubuntu_server03]
changed: [ubuntu_server04]
changed: [ubuntu_server05]
changed: [ubuntu_server06]
TASK [Reiniciando o Serviço Apache] ***********************************************************************
changed: [oracle_server01]
changed: [oracle_server02]
changed: [oracle_server03]
changed: [oracle_server04]
changed: [oracle_server05]
changed: [oracle_server06]
changed: [ubuntu_server01]
changed: [ubuntu_server02]
changed: [ubuntu_server03]
changed: [ubuntu_server04]
changed: [ubuntu_server05]
changed: [ubuntu_server06]
PLAY RECAP *********************************************************************************************************
oracle_server01 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
oracle_server02 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
oracle_server03 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
oracle_server04 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
oracle_server05 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
oracle_server06 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server01 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server02 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server03 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server04 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server05 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu_server06 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Feito! Tudo pronto em menos de 2 minutos, uma vez que o pacote do Apache, em média, tem 231.5 kB de tamanho.
Lembrete: para que o Ansible faça a instalação do mesmo pacote em sistemas operacionais diferentes, basta saber qual é o nome do pacote em cada sistema.
Pronto! Mais uma demanda fechada rapidamente, de forma efectiva e com tempo para tomar um delicioso cafezinho. Ansible é demais!