GNU/Linux / agosto 30, 2018

Creando nuestros PlayBooks [Ansible #5]

Si has llegado hasta aquí ya sabrás que se puede ejecutar comandos para ordenar a Ansible que ejecute ciertos comandos en nuestros servidores. Pero tenemos que ejecutar comando a comando y esto no es muy útil.

La gracia de Ansible es que permite crear unos ficheros conocidos bajo el nombre de PlayBooks. Estos ficheros son unos archivos que permiten escribir todas las tareas que se deben de ejecutar en nuestros host, o grupo de host o lo que tengamos en nuestro inventario.

Como veis, esto es muy útil, porque únicamente tendrás que escribir ese PlayBook una vez y lo podrás utilizar todas las veces que quieras. Incluso puedes buscar PlayBooks ya creados por otras personas y editarlo a tu gusto.

Nuestro primer PlayBook

Hermana/o SysAdmin, aquí la cosa se pone muy interesante. Porque llega el momento de escribir nuestro Manual de Juego. Podemos utilizar un editor cualquiera para generarlo, pero es importante que cuides los detalles:

nano playbook.yml

Para explicar la estructura del PlayBook, lo que voy hacer es primero de todo enseñaros toda la estructura de él, y luego os iré explicando paso por paso que significado tiene cada cosa y que opciones tenemos. Aquí va mi PlayBook:

---

- hosts: voidnull.es
  tasks:
  - name: Instalación de Apache2
    apt: name=apache2 state=present
  - name: Instalación de PHP
    apt: name=php7.0 state=present

Todos los PlayBooks empezarán con los tres guiones al principio para indicar que se trata de un fichero escrito en YAML.

Luego vendrá el parámetro para indicar sobre que parte del inventario que tenemos debe de afectar este PlayBook. Podemos poner un host en concreto, un grupo de hosts, o incluso todos, como se muestra a continuación:

--- Un host en concreto:
- hosts: voidnull.es
--- O bien... un grupo de hosts:
- hosts: webservers
--- O bien todos:
- hosts: all

A continuación, vendrán las tareas que hay que realizar en los hosts que hemos seleccionado y para ello lo haremos con tasks:

  tasks:
  - Primera tarea
  - Segunda tarea
  - Tercera tarea

Las tareas también tienen su estructura particular. Siempre, siempre, siempre, hay que indicar un nombre y luego los comandos que tiene que ejecutar con sus módulos.

  - name: Instalación de Apache2
    apt: name=apache2 state=present

Como veis, name sirve para describir de que trata la tarea. Y seguido, la tarea que hay que ejecutar. En este caso, estamos usando el módulo apt y le estamos pasando los parámetros, el nombre del paquete y el estado de ese paquete -en esta caso instalado en el servidor-.

Ejecutar nuestros PlayBooks

Para ejecutar nuestros PlayBooks tenemos otro comando:

ansible-playbook playbook.yml

Y como hemos hecho antes, vamos hacer lo mismo, os voy a mostrar la salida de este comando y os voy a explicar que ha pasado. Porque hay una tarea que va a salir mal.

PLAY [voidnull.es] ***************************************************

GATHERING FACTS ***************************************************************
ok: [voidnull.es]

TASK: [Instalación de Apache2] ************************************************
changed: [voidnull.es]

TASK: [Instalación de PHP] ****************************************************
failed: [voidnull.es] => {"failed": true}
msg: No package matching 'php7.0' is available

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
   to retry, use: --limit @/root/playbook.retry

voidnull.es: ok=2    changed=1    unreachable=0    failed=1

Ansible lo primero que hace es una recopilación de todos los hechos, que más tarde explicaremos que significa. Y luego ejecuta una a una las diferentes tareas que hemos escrito.

En el caso de que haya salido todo correcto, nos dirá que ha habido un cambio y en caso de que algo haya salido mal, nos mostrará un error indicando cual es el problema.

En este PlayBook hay una tarea, la de instalar Apache que ha salido exitosa, pero la otra tarea, instalar PHP no ha salido bien.

voidnull.es: ok=2    changed=1    unreachable=0    failed=1

Este PlayBook lo estoy ejecutando en un servidor Ubuntu 18.04 y la versión de PHP para esta versión no es la 7.0 si no que es la 7.2. Por ese motivo nos dice que el paquete php7.0 no está disponible.

Lo cambiamos para que ahora se instale correctamente PHP:

---

- hosts: voidnull.es
  tasks:
  - name: Instalación de Apache2
    apt: name=apache2 state=present
  - name: Instalación de PHP
    apt: name=php7.2 state=present

Y lo volvemos a ejecutar. Tened presente lo siguiente: apache2 ya es un paquete que se ha instalado anteriormente. Por lo que veremos un cambio en la salida que es necesario mencionarlo:

PLAY [voidnull.es] ***************************************************

GATHERING FACTS ***************************************************************
ok: [voidnull.es]

TASK: [Instalación de Apache2] ************************************************
ok: [voidnull.es]

TASK: [Instalación de PHP] ****************************************************
changed: [voidnull.es]

PLAY RECAP ********************************************************************
voidnull.es: ok=3    changed=1    unreachable=0    failed=0

Si comparamos la salida, vemos que en la primera tarea ahora aparece ok: [voidnull.es] y la primera vez que lo ejecutamos nos apareció changed: [voidnull.es]. Esto es que Ansible ha detectado que apache2 ya está instalado y simplemente ha pasado a la siguiente tarea.

Por este motivo, en la última línea vemos que 3 tareas se han realizado correctamente, y únicamente una a cambiado: la instalación de PHP.

¿Y si lo ejecutamos UNA TERCERA VEZ?

Pues no pasa nada. :/

También podemos añadir una tarea nueva a nuestro PlayBook. El que hemos creado tiene únicamente la instalación de Apache, pero podemos controlar los servicios con un módulo llamado Service.

---

- hosts: voidnull.es
  tasks:
  - name: Instalación de Apache2
    apt: name=apache2 state=present
  - name: Instalación de PHP
    apt: name=php7.2 state=present
  - name: Reiniciar Apache2
    service: name=apache2 state=restarted
  - name: Activar Apache2 al arranque
    service: name=apache2 enabled=yes

Las dos ultimas tareas, lo que hacemos es lo siguiente: primero reiniciamos, que seria lo recomendable después de instalar PHP y luego habilitamos el servicio para que cargue al arranque, de esta manera el servicio web estará habilitado tras reiniciar el servidor.

Si ejecutamos de nuevo el PlayBook veremos que se han ejecutado dos tareas:

TASK: [Reiniciar apache] ******************************************************
changed: [voidnull.es]

TASK: [Activar Apache al arranque] ********************************************
changed: [voidnull.es]

PLAY RECAP ********************************************************************
voidnull.es: ok=5    changed=2    unreachable=0    failed=0

Y si accedemos a nuestra IP veremos que…

Ansible nos ha instalado Apache2 😀

¿Magia? No, Ansible 🙂


2 comentarios “Creando nuestros PlayBooks [Ansible #5]”

avatar
500
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
T3rr0rz0n3kitto Recent comment authors
  Suscribirte  
más nuevos más viejos más votados
Notificarme
kitto
Invitado
kitto

Estoy siguiendo esta serie de tutos de ansible desde el principio y aunque ya lo había trasteado anteriormente no había profundizado demasiado. Estoy deseando que llegues a los roles 😀

Gracias por el curro que te estás pegando.

Utilizamos cookies propias y de terceros para mejorar nuestros servicios. Si continúa navegando, consideramos que acepta su uso. Doble clic sobre aquí para cerrar.