Luego de muchas actualizaciones se apilaron unas cuantas versiones del kernel Linux en mis servidores Debian. Veamos cómo ejecutar apt-get autoremove en todos los servidores Debian al mismo tiempo con un simple playbook de Ansible.

Para quienes no recuerden mi serie de artículos sobre Ansible, se trata de una herramienta de automation (automatización) que simplifica la gestión de una plataforma de infraestructura de TI. Gracias a Ansible es posible, por ejemplo, ejecutar tareas rutinarias en múltiples servidores al mismo tiempo. También es posible utilizar playbooks para automatizar la instalación y despliegue de servidores. Entre otros usos que se le puede dar.

En este caso necesitaba ejecutar un mismo comando (apt-get autoremove) en múltiples servidores, y no tenía ganas (ni tiempo) para loguearme uno por uno y hacerlo manualmente.

En la mayoría de las distribuciones GNU/Linux se suelen mantener varias copias (de diferentes versiones) del kernel. Esto generalmente se hace por precaución, para permitir un inicio alternativo en caso de fallo, en caso de que un kernel nuevo no pueda bootear, etc.

En Debian y derivados (según la configuración en el archivo /etc/kernel/postinst.d/apt-auto-removal) se suelen mantener dos o tres versiones diferentes del kernel Linux:

# Author: Steve Langasek <steve.langasek@canonical.com>
#
# Mark as not-for-autoremoval those kernel packages that are:
#  - the currently booted version
#  - the kernel version we've been called for
#  - the latest kernel version (determined using rules copied from the grub
#    package for deciding which kernel to boot)
#  - the second-latest kernel version, if the booted kernel version is
#    already the latest and this script is called for that same version,
#    to ensure a fallback remains available in the event the newly-installed
#    kernel at this ABI fails to boot
# In the common case, this results in exactly two kernels saved, but it can
# result in three kernels being saved.  It's better to err on the side of
# saving too many kernels than saving too few.
#
# We generate this list and save it to /etc/apt/apt.conf.d instead of marking
# packages in the database because this runs from a postinst script, and apt
# will overwrite the db when it exits.

Este script genera un archivo de configuración del gestor de paquetes APT que decide qué versiones del kernel Linux mantener (/etc/apt/apt.conf.d/01autoremove-kernels). Por ejemplo, en un sistema Debian Jessie se mantienen las siguientes versiones:

// DO NOT EDIT! File autogenerated by /etc/kernel/postinst.d/apt-auto-removal
APT::NeverAutoRemove
{
   "^linux-image-3\.16\.0-6-amd64$";
   "^linux-image-3\.16\.0-7-amd64$";
   "^linux-headers-3\.16\.0-6-amd64$";
   "^linux-headers-3\.16\.0-7-amd64$";
   "^linux-image-extra-3\.16\.0-6-amd64$";
   "^linux-image-extra-3\.16\.0-7-amd64$";
   "^linux-signed-image-3\.16\.0-6-amd64$";
   "^linux-signed-image-3\.16\.0-7-amd64$";
   "^kfreebsd-image-3\.16\.0-6-amd64$";
   "^kfreebsd-image-3\.16\.0-7-amd64$";
   "^kfreebsd-headers-3\.16\.0-6-amd64$";
   "^kfreebsd-headers-3\.16\.0-7-amd64$";
   "^gnumach-image-3\.16\.0-6-amd64$";
   "^gnumach-image-3\.16\.0-7-amd64$";
   "^.*-modules-3\.16\.0-6-amd64$";
   "^.*-modules-3\.16\.0-7-amd64$";
   "^.*-kernel-3\.16\.0-6-amd64$";
   "^.*-kernel-3\.16\.0-7-amd64$";
   "^linux-backports-modules-.*-3\.16\.0-6-amd64$";
   "^linux-backports-modules-.*-3\.16\.0-7-amd64$";
   "^linux-tools-3\.16\.0-6-amd64$";
   "^linux-tools-3\.16\.0-7-amd64$";
};

Ahora bien, cuando se acumulan muchas versiones antiguas del kernel Linux, es posible removerlas o desinstalarlas ejecutando apt-get autoremove. Este subcomando desinstala paquetes que se instalaron como dependencias para satisfacer las dependencias de otros paquetes, pero ya no son requeridos o necesarios.

Anteriormente demostré cómo implementar un playbook de Ansible con el objetivo de actualizar todos los servidores de forma automática. Este playbook utilizaba los módulos de Ansible "apt" y "yum" para actualizar los servidores Debian y CentOS respectivamente.

A fin de ejecutar apt-get autoremove, el módulo "apt" incluye la opción "autoremove". Si se establece en "yes", permite eliminar los paquetes que ya no son necesarios.

El siguiente playbook actualiza y a su vez ejecuta autoremove sobre todos mis sistemas Debian en producción (grupo "prod-debian" en la configuración de mi inventario):

---
# Este playbook actualiza los sistemas operativos de todos los servidores Debian en producción

- hosts: prod-debian
  become: yes
  tasks:
    - name: actualizar todos los servidores Debian de desarrollo con autoremove
      apt:
        update_cache: yes
        upgrade: safe
        autoremove: yes

Corrida de ejemplo

El playbook se lanza con el utilitario ansible-playbook:

ansible@hal9000:~$ ansible-playbook ansible_playbooks/autoremove-prod.yml

PLAY [prod-debian] *****************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [fs01.linuxito.com]
ok: [fsh01-db.linuxito.com]
ok: [www3.linuxito.com]
ok: [intranet.linuxito.com]
ok: [www2.linuxito.com]
ok: [nagios.linuxito.com]
ok: [www.linuxito.com]
ok: [eyf.linuxito.com]
ok: [ifx07.linuxito.com]
ok: [bi.linuxito.com]
ok: [intranet-db.linuxito.com]
ok: [eyf-db.linuxito.com]
ok: [ldaps.linuxito.com]
ok: [web.linuxito.com]
ok: [appgsd38.linuxito.com]
ok: [admin-db.linuxito.com]
ok: [web-db.linuxito.com]
ok: [appgsd38db.linuxito.com]
ok: [eyf17-db.linuxito.com]
ok: [appl3.linuxito.com]
ok: [bi17.linuxito.com]
ok: [fs.linuxito.com]
ok: [eyf17.linuxito.com]
ok: [domain.linuxito.com]

TASK [actualizar todos los servidores Debian de producción con autoremove] *********************************************
ok: [nagios.linuxito.com]
ok: [www3.linuxito.com]
ok: [bi.linuxito.com]
ok: [fs01.linuxito.com]
ok: [intranet.linuxito.com]
ok: [www2.linuxito.com]
ok: [fsh01-db.linuxito.com]
ok: [eyf.linuxito.com]
ok: [intranet-db.linuxito.com]
ok: [ldaps.linuxito.com]
ok: [eyf-db.linuxito.com]
ok: [web.linuxito.com]
ok: [web-db.linuxito.com]
 [WARNING]: Could not find aptitude. Using apt-get instead

ok: [appgsd38.linuxito.com]
ok: [appgsd38-db.linuxito.com]
ok: [admin-db.linuxito.com]
ok: [bi17.linuxito.com]
ok: [appl3.linuxito.com]
changed: [www.linuxito.com]
changed: [eyf17.linuxito.com]
changed: [eyf17-db.linuxito.com]
changed: [fs.linuxito.com]
changed: [ifx07.linuxito.com]
changed: [domain.linuxito.com]

PLAY RECAP *************************************************************************************************************
admin-db.linuxito.com     : ok=2    changed=0    unreachable=0    failed=0   
nagios.linuxito.com       : ok=2    changed=0    unreachable=0    failed=0   
bi.linuxito.com           : ok=2    changed=0    unreachable=0    failed=0   
appgsd38-db.linuxito.com  : ok=2    changed=0    unreachable=0    failed=0   
appgsd38.linuxito.com     : ok=2    changed=0    unreachable=0    failed=0   
bi17.linuxito.com         : ok=2    changed=0    unreachable=0    failed=0   
www2.linuxito.com         : ok=2    changed=0    unreachable=0    failed=0   
fsh01-db.linuxito.com     : ok=2    changed=0    unreachable=0    failed=0   
eyf-db.linuxito.com       : ok=2    changed=0    unreachable=0    failed=0   
fs01.linuxito.com         : ok=2    changed=0    unreachable=0    failed=0   
eyf.linuxito.com          : ok=2    changed=0    unreachable=0    failed=0   
web-db.linuxito.com       : ok=2    changed=0    unreachable=0    failed=0   
intranet.linuxito.com     : ok=2    changed=0    unreachable=0    failed=0   
web.linuxito.com          : ok=2    changed=0    unreachable=0    failed=0   
intranet-db.linuxito.com  : ok=2    changed=0    unreachable=0    failed=0   
www3.linuxito.com         : ok=2    changed=0    unreachable=0    failed=0   
ldaps.linuxito.com        : ok=2    changed=0    unreachable=0    failed=0   
appl3.linuxito.com        : ok=2    changed=0    unreachable=0    failed=0   
fs.linuxito.com           : ok=2    changed=1    unreachable=0    failed=0   
ifx07.linuxito.com        : ok=2    changed=1    unreachable=0    failed=0   
domain.linuxito.com       : ok=2    changed=1    unreachable=0    failed=0   
www.linuxito.com          : ok=2    changed=1    unreachable=0    failed=0   
eyf17-db.linuxito.com     : ok=2    changed=1    unreachable=0    failed=0   
eyf17.linuxito.com        : ok=2    changed=1    unreachable=0    failed=0   

Se observa que se han eliminado kernels antiguos en 6 servidores ("changed=1").

Referencias


Tal vez pueda interesarte


Compartí este artículo