Ansible / agosto 26, 2018

Controlando módulos en Ansible [Ansible #4]

En el anterior capítulo, hablamos sobre los Comandos básicos en Ansible y aprendimos que se podían utilizar módulos. Incluso usamos un módulo muy básico como el de ping.

Existen módulos para absolutamente todo. Y evidentemente, no los vamos a ver todos, pero si que vamos a ver algunos interesantes y sobretodo vamos a ver como encontrar esos módulos.

Como todo en esta vida -de informático- es importante saber donde están las documentaciones de las herramientas que vamos a utilizar. La de Ansible es maravillosa y muy completa. Pero por ahora nos vamos a fijar en la documentación de los módulos ordenados por categorías.

Si vemos el listado de módulos por categorías, vemos que hay prácticamente de todo. Módulos para Cloud, módulos para clusters, módulos para criptomonedas, módulos para monitorización, módulos de red, etc.

Muchos módulos. Os recomiendo que os perdáis un poco por la lista de módulos, a la categoría que más os llame la atención y veáis la cantidad ingesta de módulos que hay.

Módulos, módulos… ¡Módulos!

En el anterior capítulo llegamos a ejecutar varios comandos, y es que podemos ejecutar un solo comando para que haga cualquier cosa por shell:

ansible db.voidnull.es -a 'uname -a'

La respuesta que obtendremos será la siguiente:

db.voidnull.es | success | rc=0 >>
Linux ansible 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Si os habéis fijado en el comando que hemos ejecutado, no hay el parámetro -m para indicar el módulo que hay que usar. Cuando no se indica el módulo, por defecto Ansible selecciona un módulo llamado Shell.

Documentación para el módulo Shell

Para cada módulo existe su documentación muy bien explicada. Como en los manuales de los comandos de GNU/Linux, tenemos un resumen de la función del módulo, la estructura sintáctica del módulo -si, la sinopsis-, y luego los parámetros que podemos utilizar. Además de notas, ejemplos de uso, etc.

Pero vamos a ir un poco más lejos. Imaginemos que queremos instalar un paquete en nuestro servidor. Lo lógico sería acceder por SSH al servidor y ejecutar un apt-get install, ¿Verdad?

Con Ansible, podemos utilizar un módulo llamado APT que permite instalar paquetes usando el gestor de paquetes de Debian.

Si entramos en su página de documentación, veremos que hay una serie de parámetros para utilizar que pueden ser muy interesantes:

  • name: para indicar el nombre de paquete.
  • state: Nos indica el estado actual del paquete y tiene diferentes opciones: latest, absent, present, build-dep. O dicho de otro modo: en su última versión, sin instalar, instalado, o que las dependencias estén instaladas.
  • update_cache: Esto permite ejecutar un apt-get update antes de procesar su instalación.

Dicho esto, vamos a ver un caso práctico que siempre se entiende mejor:

ansible voidnull.es -m apt -a 'name=nmap state=present'

¿Que significado tiene este comando? Pues le estamos indicando a ansible, que en el servidor voidnull.es utilice el módulo apt y que ejecute el comando con las siguientes opciones: instalar (present) el paquete con el nombre (name) nmap. ¿Sencillo verdad?

Y esta es la salida que nos da el comando:

voidnull.es | success >> {
    "changed": true,
    "stderr": "",
    "stdout": "Reading package lists...\n
Building dependency tree...\n
Reading state information...\n
Suggested packages:\n  ndiff\n
The following NEW packages will be installed:\n  nmap\n0 upgraded, 1 newly installed, 0 to remove and 135 not upgraded.\n
Need to get 0 B/5174 kB of archives.\n
After this operation, 24.0 MB of additional disk space will be used.\n
Selecting previously unselected package nmap.\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 ... 90%\r
(Reading database ... 95%\r
Reading database ... 100%\r
(Reading database ... 67375 files and directories currently installed.)\r\n
Preparing to unpack .../nmap_7.60-1ubuntu5_amd64.deb ...\r\nUnpacking nmap (7.60-1ubuntu5) ...\r\n
Setting up nmap (7.60-1ubuntu5) ...\r\n
Processing triggers for man-db (2.8.3-2) ...\r\n"
}

Este comando lo he ejecutado como usuario root, porque las claves de SSH que he compartido han sido para ese usuario. Pero, ¿Qué sucede si esto lo ejecutamos con un usuario diferente a root? Pues seguramente tengáis un error, ya que vuestro usuario no tendrá permisos para instalar el paquete.

En el caso que queramos ejecutar un comando desde Ansible y necesitemos ser root, podemos ejecutar el comando con el parámetro -b. Este parámetro transforma el comando que vamos a ejecutar en nuestro servidor y le añade un sudo delante. También tendremos que añadir otro parámetro para que nos pida la contraseña -K

ansible voidnull.es -m apt -a 'name=nmap state=present' -b -K
SUDO password:

Si volvemos a ejecutar el comando para instalar nmap en nuestro servidor, como que ya tiene ese paquete instalado, no nos mostrará ningún error. Más que nada porque la salida será success y tiene su sentido:

voidnull.es | success >> {
    "changed": false
}

El parámetro changed es false, y básicamente Ansible nos está diciendo “En tu servidor, no ha cambiado absolutamente nada, porque el paquete nmap ya lo tienes instalado, así, que no voy a ejecutar apt-get install nmap“.


Ningún comentario “Controlando módulos en Ansible [Ansible #4]”

avatar
500
  Suscribirte  
Notificarme

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.