Ejecutando apt-get autoremove con ansible

23

Mantengo una bandada de servidores EC2 con ansible. Los servidores se actualizan regularmente y se actualizan utilizando el módulo apt .

Cuando intenté actualizar un servidor manualmente, recibí el siguiente mensaje:

$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  linux-headers-3.13.0-29 linux-headers-3.13.0-29-generic
  linux-headers-3.13.0-32 linux-headers-3.13.0-32-generic
  linux-image-3.13.0-29-generic linux-image-3.13.0-32-generic
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

¿Hay alguna manera de correr sudo apt-get autoremovecon ansible?

Adam Matan
fuente
1
Siempre puede usar el commandmódulo para hacer un comando de shell sin formato.
ceejayoz

Respuestas:

26

El soporte para la apt-getopción --auto-removeahora está integrado en Ansible apt(opción autoremove) a partir de la versión 2.1 La documentación oficial se encuentra en http://docs.ansible.com/ansible/apt_module.html

- name: Remove dependencies that are no longer required
  apt:
    autoremove: yes

La fusión sucedió aquí .

Tenga en cuenta que autocleantambién está disponible a partir de 2.4

Oalders
fuente
¿Podría agregar un enlace de referencia?
Adam Matan
@AdamMatan Respuesta actualizada con un enlace a los documentos.
Oalders
1
Si marca aquí , verá que "autoremove" con una opción de "estado" se considera un error. El equipo de desarrollo de Ansible deberá definir si "autoremove" será solo una opción o una operación completa para Ansible 2.2 (espero ...)
Yonsy Solis
@YonsySolis alguien secuestró esta respuesta a través de una edición. Lo he revertido a su estado original.
Oalders
1
@flickerfly según los documentos, debería poder ejecutar esto sin tener que proporcionar un nombre de paquete. He actualizado mi respuesta para reflejar esto.
Oalders
14

Este método simplificado requiere solo una tarea

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
cortopia
fuente
Esta probablemente debería ser la respuesta aceptada.
ab77
9

Puedes hacerlo con command(sin probar):

  - name: Check if anything needs autoremoving
    shell: apt-get -y --dry-run autoremove | grep -q "0 to remove"
    register: check_autoremove
    ignore_errors: True
    changed_when: False
    always_run: True

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    when: "check_autoremove.rc != 0"

Sin embargo, creo que podría ser arriesgado correr autoremoveautomáticamente. Debido a los errores de administración del sistema que cometió en el pasado (estos podrían estar en su código ansible), es posible que un paquete que se necesita en algún momento se detecte falsamente como auto-removible, y esto podría detener el funcionamiento del servidor. Por otro lado, no es gran cosa dejar paquetes no utilizados en el sistema, y ​​no es muy común a menos que realice un cambio importante en la configuración del servidor.

Por lo tanto, me mantendría alejado de los paquetes de eliminación automática sin la confirmación de un humano.

Antonis Christofides
fuente
Ansible no marca necesariamente los paquetes como 'manuales', incluso si los ha instalado utilizando el módulo apt. Entonces 'autoremove' podría eliminar los paquetes incorrectos. Solución rápida: usoapt-mark manual <pkg>
Willem
1
En Ubuntu, si no realiza el movimiento automático, entonces su / boot podría llenarse hasta que esté lleno. En su mayoría, la eliminación automática solo ha eliminado el núcleo antiguo no utilizado. Debido a que esto requiere una verificación regular, debe ser automatizado. :-) En Fedora / RHEL, puede indicarle a yum / dnf que guarde solo una cierta cantidad de paquetes (como 3 versiones de kernel), para que nunca tenga este problema.
Huygens
6

Esta es una variación de la solución que Antonis Christofides proporcionó. Está probado y funciona para mí. Evité usar ignore_errors en el comando de verificación. De lo contrario, generalmente toma el mismo enfoque.

- name: Check if packages need to be autoremoved
  command: apt-get --dry-run autoremove
  register: check_autoremove
  changed_when: False
- name: Autoremove unused packages
  command: apt-get -y autoremove
  when: "'packages will be REMOVED' in check_autoremove.stdout"
Marwan Alsabbagh
fuente
¿Cuál es la razón de un --dry-runprimero? apt-get -y autoremoveno devuelve un estado distinto de cero. Por lo tanto, parece que podría ejecutar incondicionalmente sin el --dry-runy comprobar changed_whenla llamada de autoremove real, creo.
thom_nic
@ thom_nic Creo que tienes razón. Pude estructurar así: - nombre: autoremove, los paquetes no utilizados se convierten en: yes comando: apt-get -y autoremove register: check_autoremove changed_when: "'se eliminarán los paquetes' en check_autoremove.stdout"
Luke Hoersten,
2

Una variación que resalta el cambio en los paquetes (la primera tarea será de color verde o amarillo):

  - name: check if packages need to be autoremoved
    shell: apt-get --dry-run autoremove | grep "to remove" | sed "s/^[0-9]\+ upgraded, [0-9]\+ newly installed, \([0-9]\+\) to remove and [0-9]\+ not upgraded\.$/\1/"
    register: check_autoremove
    changed_when: check_autoremove.stdout != "0"

  - name: autoremove unused packages
    command: apt-get -y autoremove
    when: check_autoremove.changed
Martin Tapp
fuente
El problema con su cadena "sed" es que no es "portátil". La ejecución de apt-get --dry-run autoremove | grep "to remove"devoluciones en Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.pero en Ubuntu 15.04 devuelve lo 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.que su sed no coincide.
Huygens
Siempre es difícil hacer coincidir el cambio de texto. Probablemente reemplace installcon install(ed)?o algo así.
Martin Tapp
1

Me gusta este método simplificado , y agrego un mensaje de verificación e impresión para mí.

#!/usr/bin/env ansible-playbook
---

- name: Autoremove 'apt' package for Debian, Ubuntu
  hosts: all

  pre_tasks:
    - name: check storage space - before
      shell: df -h
      register: check_storage_space_before

    - name: print storage space
      debug:
        msg: "{{ check_storage_space_before.stdout_lines }}"

    - name: apt autoremove check 
      command: apt-get -y --dry-run autoremove
      register: apt_autoremove_output

    - name: print apt autoremove packages
      debug:
        msg: "{{ apt_autoremove_output.stdout_lines }}"

  tasks:    
    - name: autoremove unused packages
      become: yes
      command: apt-get -y autoremove
      changed_when: "'The following packages will be REMOVED' in apt_autoremove_output.stdout"

  post_tasks:
    - name: check storage space - after
      shell: df -h
      register: check_storage_space_after

    - name: print storage space
      debug:
        msg: "{{ check_storage_space_after.stdout_lines }}"

# vim: ft=ansible :

Gracias por la cortopy y Dave James Miller .

Chu-Saing Lai
fuente