Cómo usar los manuales de Ansible para automatizar tareas complejas en varios servidores remotos - Parte 2


En el artículo anterior de esta serie de Ansible, explicamos que Ansible es una herramienta sin agentes que le permite administrar de manera rápida y eficiente múltiples máquinas (también conocidas como nodos, y realizar implementaciones en ellas) desde un solo sistema.

Después de instalar el software en la máquina controladora, crear las claves para el inicio de sesión sin contraseña y copiarlas en los nodos, es hora de aprender a optimizar el proceso de gestión de dichos sistemas remotos con Ansible.

A lo largo de este artículo, así como en el siguiente, usaremos el siguiente entorno de prueba. Todos los hosts son cajas CentOS 7:

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

Además, tenga en cuenta que ambos nodos se han agregado en la sección de servidores web del archivo local/etc/ansible/hosts:

Dicho esto, comencemos con el tema en cuestión.

Presentamos los libros de jugadas de Ansible

Como se describe en la guía anterior, puede usar la utilidad ansible para ejecutar comandos en nodos remotos de la siguiente manera:

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

En el ejemplo anterior, ejecutamos hostnamectl --static en node1 y node2. No pasa mucho tiempo para que uno se dé cuenta de que este método de ejecutar tareas en computadoras remotas funciona bien para comandos cortos, pero puede volverse rápidamente engorroso o complicado para tareas más complejas que requieren más parámetros de configuración bien estructurados o interacciones con otros servicios.

Por ejemplo, instalar y configurar WordPress en múltiples hosts, que cubriremos en el próximo artículo de esta serie). Aquí es donde entran en escena los Playbooks.

En pocas palabras, los Playbooks son archivos de texto sin formato escritos en formato YAML y contienen una lista con elementos con uno o más pares clave/valor (también conocido como "hash" o "diccionario").

Dentro de cada Playbook encontrarás uno o más grupos de anfitriones (cada uno de estos grupos también se denomina obra de teatro) donde se realizarán las tareas deseadas.

Un ejemplo de los documentos oficiales nos ayudará a ilustrar:

1. hosts: esta es una lista de máquinas (según/etc/ansible/hosts) donde se realizarán las siguientes tareas.

2. remote_user: cuenta remota que se utilizará para realizar las tareas.

3. vars: variables utilizadas para modificar el comportamiento de los sistemas remotos.

4. Las tareas se ejecutan en orden, una a la vez, en todas las máquinas que coinciden con los hosts. Dentro de una obra, todos los anfitriones obtendrán las mismas directivas de tareas.

Si necesita ejecutar un conjunto diferente de tareas asociadas para un host específico, cree otra jugada en el Playbook actual (en otras palabras, el propósito de una jugada es mapear una selección específica de hosts a tareas bien definidas).

En ese caso, comience una nueva jugada agregando la directiva hosts en la parte inferior y comience de nuevo:

---
- 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. Los controladores son acciones que se activan al final de la sección de tareas en cada juego, y se utilizan principalmente para reiniciar servicios o activar reinicios en los sistemas remotos.

# mkdir /etc/ansible/playbooks

Y un archivo llamado apache.yml dentro de allí con el siguiente contenido:

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

En segundo lugar, cree un directorio/static_files:

# mkdir /static_files

donde almacenará el archivo 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 Tecmint.com</h2>
 </body>
 </html>

Dicho esto, ahora es el momento de usar este manual para realizar las tareas mencionadas anteriormente. Notará que Ansible revisará cada tarea por host, una a la vez, e informará sobre el estado de dichas tareas:

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

Ahora veamos qué sucede cuando abrimos un navegador y lo apuntamos a 192.168.0.29 y 192.168.0.30:

Vayamos un paso más allá y detengamos y deshabilitemos Apache manualmente en el nodo1 y el nodo2:

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

Entonces corre de nuevo

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

Esta vez, la tarea informa que el servidor web Apache se inició y habilitó en cada host:

Considere el ejemplo anterior como una muestra del poder de Ansible. Si bien estas son tareas relativamente fáciles cuando se realizan en una pequeña cantidad de servidores, puede resultar muy tedioso y lento si necesita hacer lo mismo en varias (quizás cientos) de máquinas.

Resumen

En este artículo hemos descrito cómo ejecutar comandos y ejecutar tareas complejas en varios hosts remotos simultáneamente usando Ansible. La documentación oficial y el repositorio de GitHub proporcionan muchos ejemplos y guías sobre cómo usar Ansible para lograr casi cualquier tarea imaginable.

A medida que empiece a aprender a automatizar tareas en hosts remotos de Linux utilizando Ansible, nos gustaría conocer su opinión. Las preguntas, comentarios y sugerencias también son siempre bienvenidos, así que no dude en contactarnos usando el formulario a continuación en cualquier momento.