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 unaptitude safe-upgrade
, loq ue equivale a ejecutarapt-get upgrade
.dist
: ejecutaapt-get dist-upgrade
.full
: ejecutaaptitude 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