En artículos previos expliqué cómo instalar Ansible desde los fuentes y cómo configurar el inventario. Ahora veamos de qué forma Ansible puede simplificarlos el día a día. Es decir, qué tareas es posible resolver de manera más simple y rápida gracias utilizando esta herramienta. En esta oportunidad voy a demostrar cómo actualizar múltiples servidores Debian en simultáneo y paralelo utilizando el módulo apt.



El escenario es el siguiente: tenemos un conjunto de servidores Debian que deseamos actualizar, pero en lugar de loguearse uno por uno y actualizarlos manualmente deseamos actualizarlos todos en simultáneo, tal como lo hace mi script updatemyfarm.

El módulo apt de Ansible permite gestionar paquetes en sistemas Debian y derivados de forma simple. Este módulo trabaja por defecto con el gestor aptitude, aunque permite forzar el uso de apt-get mediante la opción force_apt_get.

Este módulo posee opciones para instalar paquetes (a través de los parámetros name y state), actualizar paquetes (upgrade) y actualizar la caché (update_cache), entre otras. Veamos directamente un par de ejemplos.

Si deseamos actualizar la cache de paquetes de todos los servidores en el grupo "devel-debian8", se debe invocar al módulo apt con el parámetro update_cache=yes:

ansible@obsd:~$ ansible devel-debian8 -b -m apt -a update_cache=yes
www-devel | SUCCESS => {
    "cache_update_time": 1505223866, 
    "cache_updated": true, 
    "changed": true, 
    "failed": false
}
db-test | SUCCESS => {
    "cache_update_time": 1505223864, 
    "cache_updated": true, 
    "changed": true, 
    "failed": false
}
devel07 | SUCCESS => {
    "cache_update_time": 1505223864, 
    "cache_updated": true, 
    "changed": true, 
    "failed": false
}

t56 | SUCCESS => {
    "cache_update_time": 1505223865, 
    "cache_updated": true, 
    "changed": true, 
    "failed": false
}
devwww2 | SUCCESS => {
    "cache_update_time": 1505223866, 
    "cache_updated": true, 
    "changed": true, 
    "failed": false
}

La salida por pantalla indica si se actualizó la caché, si hubo cambios y si hubo errores, para cada servidor.

Al momento de actualizar los paquetes se dispone de diferentes alternativas. El parámetro upgrade admite los siguientes valores:

  • safe: ejecuta un aptitude safe-upgrade, loq ue equivale a ejecutar apt-get upgrade.
  • dist: ejecuta apt-get dist-upgrade.
  • full: ejecuta aptitude full-upgrade.

Al actualizar múltiples servidores en simultáneo es recomendable ejecutar apt-get update, el camino más seguro. De esta forma, se debe invocar al módulo apt con los argumentos upgrade=safe update_cache=yes:

ansible@obsd:~$ ansible devel-debian8 -b -m apt -a "upgrade=safe update_cache=yes" > update_devel-debian8-$(date +%Y%M%d)

La salida de este comando es muy extensa, pues vuelca todas las salidas en todos los servidores. Por ello utilizo una redirección a un archivo:

ansible@obsd:~$ head -n 20 update_devel-debian8-20170712 
www-devel | SUCCESS => {
    "changed": true, 
    "failed": false, 
    "msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\nInitializing 
package states...\nWriting extended state information...\nReading task descriptions...\nBuilding tag 
database...\nThe following packages will be upgraded:\n  bind9-host dnsutils host libbind9-90 libdns-export100 
libdns100 \n  libirs-export91 libisc-export95 libisc95 libisccc90 libisccfg-export90 \n  libisccfg90 liblwres90 
\n13 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 1933 kB of archives. 
After unpacking 396 kB will be used.\nWriting extended state information...\nGet: 1 
http://cache.linuxito.com:1381/debian/ jessie-updates/main libisc-export95 amd64 1:9.9.5.dfsg-9+deb8u14 [141 
kB]\nGet: 2 http://cache.linuxito.com:1381/debian/ jessie-updates/main libdns-export100 amd64 
1:9.9.5.dfsg-9+deb8u14 [456 kB]\nGet: 3 http://cache.linuxito.com:1381/debian/ jessie-updates/main 
libisccfg-export90 amd64 1:9.9.5.dfsg-9+deb8u14 [41.4 kB]\nGet: 4 http://cache.linuxito.com:1381/debian/ 
jessie-updates/main libirs-export91 amd64 1:9.9.5.dfsg-9+deb8u14 [39.1 kB]\nGet: 5 
http://cache.linuxito.com:1381/debian/ jessie-updates/main dnsutils amd64 1:9.9.5.dfsg-9+deb8u14 [119 kB]\nGet: 6 
http://cache.linuxito.com:1381/debian/ jessie-updates/main bind9-host amd64 1:9.9.5.dfsg-9+deb8u14 [68.3 kB]\nGet: 
7 http://cache.linuxito.com:1381/debian/ jessie-updates/main libisc95 amd64 1:9.9.5.dfsg-9+deb8u14 [170 kB]\nGet: 8 
http://cache.linuxito.com:1381/debian/ jessie-updates/main libdns100 amd64 1:9.9.5.dfsg-9+deb8u14 [681 kB]\nGet: 9 
http://cache.linuxito.com:1381/debian/ jessie-updates/main libisccc90 amd64 1:9.9.5.dfsg-9+deb8u14 [37.2 kB]\nGet: 
10 http://cache.linuxito.com:1381/debian/ jessie-updates/main libisccfg90 amd64 1:9.9.5.dfsg-9+deb8u14 [57.8 

Luego es posible filtrar el archivo para recuperar sólo el estado final en cada servidor:

ansible@obsd:~$ grep "=>" -A 2 update_devel-debian8-20170712 
www-devel | SUCCESS => {
    "changed": true, 
    "failed": false, 
db-test | SUCCESS => {
    "changed": true, 
    "failed": false, 
devel07 | SUCCESS => {
    "changed": true, 
    "failed": false, 
t56 | SUCCESS => {
    "changed": true, 
    "failed": false, 
devwww2 | SUCCESS => {
    "changed": true, 
    "failed": false,

Luego es recomendable examinar la salida completa, aunque no se haya producido errores, para descartar cualquier tipo de anomalía.

Los comandos que ejecuta el módulo apt requieren privilegios de superusuario, es por ello que se invoca con la opción -b (become).

En el próximo episodio: cómo llevar a cabo esta tarea utilizando un playbook.

Referencias


Tal vez pueda interesarte


Compartí este artículo y dejá tu comentario