Pesquisa de site

Como usar playbooks Ansible para automatizar tarefas complexas em vários servidores remotos - Parte 2


No artigo anterior desta série Ansible, explicamos que Ansible é uma ferramenta sem agente que permite gerenciar de forma rápida e eficiente várias máquinas (também conhecidas como nós – e também realizar implantações nelas) a partir de um único sistema.

Depois de instalar o software na máquina controladora, criar as chaves para login sem senha e copiá-las para os nós, é hora de aprender como otimizar o processo de gerenciamento desses sistemas remotos usando o Ansible.

Ao longo deste artigo, assim como no próximo, usaremos o seguinte ambiente de teste. Todos os hosts são caixas do CentOS 7:


Controller machine (where Ansible is installed): 192.168.0.19
Node1: 192.168.0.29
Node2: 192.168.0.30

Além disso, observe que ambos os nós foram adicionados na seção webservers do arquivo local /etc/ansible/hosts:

Dito isto, vamos começar com o tópico em questão.

Apresentando os manuais do Ansible

Conforme descrito no guia anterior, você pode usar o utilitário ansible para executar comandos em nós remotos da seguinte forma:


ansible -a "/bin/hostnamectl --static" webservers

No exemplo acima, executamos hostnamectl --static em node1 e node2. Não demora muito para perceber que esse método de execução de tarefas em computadores remotos funciona bem para comandos curtos, mas pode rapidamente se tornar pesado ou confuso para tarefas mais complexas que exigem parâmetros de configuração mais bem estruturados ou interações com outros serviços.

Por exemplo, instalação e configuração do WordPress em vários hosts – que abordaremos no próximo artigo desta série). É aqui que os Manuais entram em cena.

Simplificando, Playbooks são arquivos de texto simples escritos no formato YAML e contêm uma lista com itens com um ou mais pares chave/valor (também conhecidos como “ >hash” ou um “dicionário”).

Dentro de cada Playbook você encontrará um ou mais grupos de hosts (cada um desses grupos também é chamado de play) onde as tarefas desejadas serão executadas.

Um exemplo dos documentos oficiais nos ajudará a ilustrar:

1. hosts: esta é uma lista de máquinas (conforme /etc/ansible/hosts) onde as seguintes tarefas serão executadas.

2. remote_user: conta remota que será utilizada para realizar as tarefas.

3. vars: variáveis utilizadas para modificar o comportamento do(s) sistema(s) remoto(s).

4. as tarefas são executadas em ordem, uma de cada vez, em todas as máquinas que correspondem aos hosts. Dentro de uma peça, todos os anfitriões receberão as mesmas diretivas de tarefa.

Se você precisar executar um conjunto diferente de tarefas associadas para um host específico, crie outra peça no Playbook atual (em outras palavras, o objetivo de uma peça é mapear uma seleção específica de hosts para o poço -tarefas definidas).

Nesse caso, comece uma nova jogada adicionando a diretiva hosts na parte inferior e recomeçando:


---
- hosts: webservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
  remote_user: root
  tasks:
  - name: description for task1
    task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  - name: description for task1
    task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
  handlers:
    - name: description for handler 1
      service: name=name_of_service state=service_status
- hosts: dbservers
  remote_user: root
  vars:
    variable1: value1
    variable2: value2
…

5. manipuladores são ações que são acionadas no final da seção de tarefas em cada jogo e são usadas principalmente para reiniciar serviços ou acionar reinicializações nos sistemas remotos.


mkdir /etc/ansible/playbooks

E um arquivo chamado apache.yml dentro dele com o seguinte conteúdo:


---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: replace default index.html file
    copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

Segundo, crie um diretório /static_files:


mkdir /static_files

onde você armazenará o arquivo index.html personalizado:


<!DOCTYPE html>
 <html lang="en">
 <head>
 <meta charset="utf-8"/>
 </script>
 </head>
 <body>
 <h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-console.net</h2>
 </body>
 </html>

Dito isto, agora é hora de usar este manual para realizar as tarefas mencionadas anteriormente. Você notará que o Ansible analisará cada tarefa por host, uma de cada vez, e reportará o status de tais tarefas:


ansible-playbook /etc/ansible/playbooks/apache.yml

Agora vamos ver o que acontece quando abrimos um navegador e apontamos para 192.168.0.29 e 192.168.0.30:

Vamos dar um passo adiante e parar e desabilitar manualmente o Apache em node1 e node2:


systemctl stop httpd
systemctl disable httpd
systemctl is-active httpd
systemctl is-enabled httpd

Então corra novamente,


ansible-playbook /etc/ansible/playbooks/apache.yml

Desta vez, a tarefa informa que o servidor web Apache foi iniciado e habilitado em cada host:

Considere o exemplo acima como um vislumbre do poder do Ansible. Embora essas tarefas sejam relativamente fáceis quando executadas em um pequeno número de servidores, podem se tornar muito tediosas e demoradas se você precisar fazer o mesmo em várias (talvez centenas) de máquinas.

Resumo

Neste artigo, descrevemos como executar comandos e tarefas complexas em vários hosts remotos simultaneamente usando Ansible. A documentação oficial e o repositório GitHub fornecem muitos exemplos e guias sobre como usar o Ansible para realizar quase todas as tarefas imagináveis.

À medida que você começa a aprender como automatizar tarefas em hosts Linux remotos usando Ansible, gostaríamos de ouvir sua opinião. Dúvidas, comentários e sugestões também são sempre bem-vindos, então fique à vontade para entrar em contato conosco através do formulário abaixo a qualquer momento.