Instalar NGINX con Ansible en varios servidores

Bien en este artículo de la serie de artículos DevOps Ansible, vamos a explicar cómo instalar un servidor web NGINX en varias máquinas remotas casi sin despeinarnos 🙂

Efectivamente, tal como hemos visto en otros artículos anteriores, la tarea para todos aquellos administradores de sistemas se puede convertir realmente tediosa si tienes que ir instalando uno por uno el servidor web.

Pero gracias a nuestros querido Ansible, podemos optar por realizar este tipo de automatización de tareas de una forma rápida y simple (la filosofía de Ansible tiene estos dos puntos por bandera)

Antes de seguir con el resto de pasos a seguir para instalar NGINX con Ansible, te recomiendo encarecidamente que eches un vistazo a este otro artículo sobre todo si aún no estás familiarizado con Ansible o cualquier herramienta DevOps:

Empezamos desde lo más básico: El uso del módulo shell en Ansible

Ansible usa el concepto de “módulos” para realizar la mayor parte de las tareas de automatización.

Gracias al uso de los módulos en Ansible, podemos hacer diferentes cosas como podría ser instalar programas o servicios, gestionar ficheros o archivos, usar diferentes plantillas y en fin, un sin fin de posibilidades cuyo límite tiene tu imaginación 🙂

Para los que no encuentren su módulo que más se ajuste a sus necesidades, siempre puede recurrir al módulo shell de Ansible, que permitirá interpretar comandos shell como si los escribiésemos en todas las máquinas remotas por comandos.

Ejemplo del módulo shell en Ansible para instalar NGINX

Por poner un ejemplo de la instalación de NGINX en Debian, sería algo tal que así (usando el módulo shell de Ansible):

[test@centos1 roles]$ ansible debian -s -m shell -a 'apt-get install nginx -s'
192.168.1.14 | SUCCESS | rc=0 >>
Leyendo lista de paquetes...
Creando árbol de dependencias...
Leyendo la información de estado...
Se instalarán los siguientes paquetes extras:
  nginx-common nginx-full
Paquetes sugeridos:
  fcgiwrap nginx-doc
Se instalarán los siguientes paquetes NUEVOS:
  nginx nginx-common nginx-full
0 actualizados, 3 nuevos se instalarán, 0 para eliminar y 0 no actualizados.
Inst nginx-common (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [all])
Inst nginx-full (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [amd64])
Inst nginx (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [all])
Conf nginx-common (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [all])
Conf nginx-full (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [amd64])
Conf nginx (1.6.2-5+deb8u4 Debian:8.7/stable, Debian-Security:8/stable [all])

[test@centos1 roles]$

Instalar NGINX con Ansible es relativamente sencillo como podéis ver:

instalación de nginx con modulo shell ansible
instalación de nginx con modulo shell ansible

Tal como vemos, hemos introducido a través de comandos Ansible una simple linea que nos ha instalado en el grupo de hosts “debian” el paquete NGINX.

Nota importante: El modificador “-s” es necesario en algunas versiones Ansible para que no se pare la operación en caso de que nos haga la consulta si queremos realmente instalar un paquete.

Otros modificadores importantes del comando:

  • “-a” va a indicar que va a meter ciertos argumentos del módulo que meteremos entrecomillado simple. En nuestro caso ‘apt-get install nginx’
  • “-s” va a indicar que para la realización del comando, se use superusuario (sudo)
  • “-m” es el módulo ansible a usar, en nuestro caso “shell”

Si te ha resultado interesante, ¡no te vayas todavía!

¡Vamos a darle un par de vueltas a las posibilidades de Ansible que harán que esto resulte mucho más interesante!

Pues si, tal como pensamos, este tipo de tareas vienen genial cuando queremos instalar el servidor NGINX en nuestros 20 servidores nuestra empresa.

No obstante, se puede adaptar el comando anterior más a una sintaxis tipo Ansible del siguiente método:

[test@centos1 roles]$ ansible debian -s -m apt -a 'pkg=nginx state=installed update_cache=true'
192.168.1.14 | SUCCESS => {
    "cache_update_time": 1491665020,
    "cache_updated": true,
    "changed": true,
    "stderr": "",
    "stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nThe following NEW packages will be installed:\n  nginx\n0 upgraded, 1 newly installed, 0 to remove and 21 not upgraded.\nNeed to get 0 B/72.6 kB of archives.\nAfter this operation, 102 kB of additional disk space will be used.\nSelecting previously unselected package nginx.\r\n(Reading database ... \r(Reading database ... 5%\r(Reading database ... 10%\r(Reading database ... 15%\r(Reading database ... 20%\r(Reading database ... 25%\r(Reading database ... 30%\r(Reading database ... 35%\r(Reading database ... 40%\r(Reading database ... 45%\r(Reading database ... 50%\r(Reading database ... 55%\r(Reading database ... 60%\r(Reading database ... 65%\r(Reading database ... 70%\r(Reading database ... 75%\r(Reading database ... 80%\r(Reading database ... 85%\r(Reading database ... 90%\r(Reading database ... 95%\r(Reading database ... 100%\r(Reading database ... 139400 files and directories currently installed.)\r\nPreparing to unpack .../nginx_1.6.2-5+deb8u4_all.deb ...\r\nUnpacking nginx (1.6.2-5+deb8u4) ...\r\nSetting up nginx (1.6.2-5+deb8u4) ...\r\n",
    "stdout_lines": [
        "Reading package lists...",
        "Building dependency tree...",
        "Reading state information...",
        "The following NEW packages will be installed:",
        "  nginx",
        "0 upgraded, 1 newly installed, 0 to remove and 21 not upgraded.",
        "Need to get 0 B/72.6 kB of archives.",
        "After this operation, 102 kB of additional disk space will be used.",
        "Selecting previously unselected package nginx.",
        "(Reading database ... ",
        "(Reading database ... 5%",
        "(Reading database ... 10%",
        "(Reading database ... 15%",
        "(Reading database ... 20%",
        "(Reading database ... 25%",
        "(Reading database ... 30%",
        "(Reading database ... 35%",
        "(Reading database ... 40%",
        "(Reading database ... 45%",
        "(Reading database ... 50%",
        "(Reading database ... 55%",
        "(Reading database ... 60%",
        "(Reading database ... 65%",
        "(Reading database ... 70%",
        "(Reading database ... 75%",
        "(Reading database ... 80%",
        "(Reading database ... 85%",
        "(Reading database ... 90%",
        "(Reading database ... 95%",
        "(Reading database ... 100%",
        "(Reading database ... 139400 files and directories currently installed.)",
        "Preparing to unpack .../nginx_1.6.2-5+deb8u4_all.deb ...",
        "Unpacking nginx (1.6.2-5+deb8u4) ...",
        "Setting up nginx (1.6.2-5+deb8u4) ..."
    ]
}

Y siguiendo a lo aprendido anteriormente, podemos lanzar la consulta para saber si NGINX está corriendo, como no, en Ansible:

Et voilà! Hemos conseguido instalar NGINX con Ansible con casi nada y desde la comunidad desde nuestro servidor principal.

¡Le damos un par de vueltas! ¡Ahora NGINX con Playbook!

Ya sabemos de otros artículos anteriores, que es muy posible definir un archivo YAML que contenga nuestros comandos a realizar para automatizar una serie de tareas y no depender de que lancemos comando por comando.

Esto lo conseguimos gracias a los Playbooks en Ansible

Si, los Playbooks es lo que va a dar ese toque de magia cuando buscamos realizar tareas más complejas a nuestra infraestructura de servidores.

Los administradores de sistemas que estén leyendo el artículo, saben que no pueden ir realizando comandos Ad-Hoc por cada uno de los servidores que tengan en su infraestructura. ¡No es viable!

Nuestro playbook para instalar NGINX en Debian

Para ello, vamos a crear un fichero que se llame “nginx_debian.yml” con el siguiente contenido:

[test@centos1 Playbooks]$ cat nginx_debian.yml
---
- hosts: debian
  tasks:
   - name: Instalar Nginx en Debian
     apt: pkg=nginx state=installed update_cache=true

Ahora tan sólo tenemos que invocar el Playbook desde el siguiente comando:

[test@centos1 Playbooks]$ ansible-playbook -s nginx_debian.yml

Cuyo resultado será lo siguiente:

instalando nginx con playbook ansible
instalando nginx con playbook ansible

Bien, como vimos al comienzo, en la parte de modificadores, usaremos “-s” para usar “sudo” y le pasamos el Playbook que acabamos de crear.

Y ahora…Instalar NGINX con Ansible y uso de Handlers

Para hacernos una idea rápida, un Handler es casi lo mismo que una tarea o Task (o lo que es lo mismo, puede realizar todo lo que una tarea puede realizar), pero además, será llamado por otra Task que lo enlace.

Dicho de otro modo, un Handler realizará una acción cuando sea llamado por un evento a través del cual esté escuchando.

Esta filosofía que se lleva a cabo mediante del uso de Handlers, va a permitirnos realizar acciones secundarias que puedan ser ejecutadas después de que una Tarea sea realizada, un ejemplo válido, y que nos puede venir muy bien, sería el de arrancar un servicio después de una instalación.

O hacer un reinicio de un proceso después de que se realice una modificación de un fichero de configuración.

Desinstalamos antes el nginx de nuestra máquina remota Debian:

[test@centos1 Playbooks]$ ansible debian -s -m shell -a 'apt-get remove nginx-full -y'

Y creamos un nuevo Playbook Ansible con el apoyo de Handlers:

[test@centos1 Playbooks]$ cat nginx_debian_reinicia.yml
---
- hosts: debian
  tasks:
   - name: Instalar Nginx en Debian
     apt: pkg=nginx state=installed update_cache=true
     notify:
      - Arranca Nginx
  handlers:
   - name: Arranca Nginx
     service: name=nginx state=started

Veamos el resultado del uso de los Handlers

instalando nginx y usando handler
instalando nginx y usando handler

Obtenemos una salida similar a los anteriores comandos, pero esta vez le hemos dicho que arranque Nginx como se aprecia en la imagen.

Le podemos decir cualquier cosa, como por ejemplo:

  • Stop
  • Restart
  • Reload

¿Quieres añadir más flexibilidad al instalar NGINX con Ansible? ¡Añade más tareas!

Si, esto puede ser todo lo complejo que quieres que sea, ojo, cuando digo complejo, ¡no quiero decir difícil!

añadiendo tareas playbook ansible
añadiendo tareas playbook ansible

El resultado de ejecutar el Playbook anterior es el siguiente:

[test@centos1 Playbooks]$ ansible-playbook -s nginx_debian_reinicia_grande.yml

PLAY [debian] ******************************************************************

TASK [setup] *******************************************************************
ok: [192.168.1.14]

TASK [Instalar Nginx en Debian] ************************************************
ok: [192.168.1.14]

TASK [Crear Root de la Web] ****************************************************
changed: [192.168.1.14]

RUNNING HANDLER [Reinicia Nginx] ***********************************************
changed: [192.168.1.14]

PLAY RECAP *********************************************************************
192.168.1.14               : ok=4    changed=2    unreachable=0    failed=0

De esta manera, hemos podido ver como se entrelazan las diferentes tareas, aunque el potencial es tan alto que aún hay otras opciones de verificación.

¡Si te ha gustado el artículo no dudes en compartirlo o deja tus impresiones o consultas! ¡Gracias!

Instalar NGINX con Ansible en varios servidores
5 (100%) 6 votos

Dejar respuesta

Please enter your comment!
Please enter your name here