Esecuzione di apt-get autoremove con ansible


23

Mantengo uno stormo di server EC2 con ansible. I server vengono regolarmente aggiornati e aggiornati utilizzando il modulo apt .

Quando ho provato manualmente ad aggiornare un server, ho ricevuto il seguente messaggio:

$ 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.

C'è un modo di correre sudo apt-get autoremovecon ansible?


1
È sempre possibile utilizzare il commandmodulo per eseguire un comando shell grezzo.
Ceejayoz,

Risposte:


26

Il supporto per l' apt-getopzione --auto-removeè ora integrato in Ansible apt(opzione autoremove) dalla versione 2.1 La documentazione ufficiale è disponibile all'indirizzo http://docs.ansible.com/ansible/apt_module.html

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

La fusione è avvenuta qui .

Si noti che autocleanè disponibile anche dalla 2.4


Potresti aggiungere un link di riferimento?
Adam Matan,

@AdamMatan Risposta aggiornata con un collegamento ai documenti.
Oalders

1
se controlli qui vedrai che "autoremove" con un'opzione "state" è considerato un bug. Il team di sviluppatori Ansible dovrà definire se "autoremove" sarà solo un'opzione o un'operazione completa per Ansible 2.2 (spero ...)
Yonsy Solis,

@YonsySolis qualcuno ha dirottato questa risposta tramite una modifica. L'ho riportato al suo stato originale.
Oalders,

1
@flickerfly secondo i documenti dovresti essere in grado di eseguirlo senza dover fornire un nome di pacchetto. Ho aggiornato la mia risposta per riflettere questo.
Oalders,

14

Questo metodo semplificato richiede solo un'attività

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"

questa dovrebbe probabilmente essere la risposta accettata.
ab77,

9

Puoi farlo con command(non testato):

  - 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"

Tuttavia, penso che potrebbe essere rischioso eseguire autoremoveautomaticamente. A causa degli errori di amministrazione del sistema che hai commesso in passato (questi potrebbero essere nel tuo codice di risposta), è possibile che un pacchetto necessario possa a un certo punto essere erroneamente rilevato come modificabile, e ciò potrebbe impedire al server di funzionare. D'altra parte, non è un grosso problema lasciare pacchetti inutilizzati sul sistema e non è molto comune a meno che non si apportino modifiche sostanziali alla configurazione del server.

Pertanto, starei lontano dai pacchetti di spostamento automatico senza conferma da parte di un essere umano.


Ansible non contrassegna necessariamente i pacchetti come 'manuali', anche se li hai installati usando il modulo apt. Quindi 'autoremove' potrebbe rimuovere i pacchetti sbagliati. Soluzione rapida: utilizzareapt-mark manual <pkg>
Willem

1
Su Ubuntu, se non esegui il normale autoremove, il tuo / boot potrebbe riempirsi fino a quando non è pieno! Per lo più autoremove ha rimosso solo i kernel non utilizzati più vecchi. Perché, questo richiede un controllo regolare, dovrebbe essere automatizzato. :-) Su Fedora / RHEL, puoi indicare a yum / dnf di conservare solo un certo numero di pacchetti (come 3 versioni del kernel), così non avrai mai questo problema.
Huygens,

6

Questa è una variante della soluzione fornita da Antonis Christofides. È testato e funziona per me. Ho evitato di usare ignore_errors nel comando check. In caso contrario, generalmente utilizza lo stesso approccio.

- 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"

Qual è la ragione per la --dry-runprima? apt-get -y autoremovenon restituisce uno stato diverso da zero. Quindi sembra che tu possa eseguire incondizionatamente senza il --dry-rune verificare changed_whencontro l'attuale chiamata autoremove penso.
thom_nic,

@thom_nic Penso che tu abbia ragione. Sono stato in grado di strutturare in questo modo: - nome: autoremove i pacchetti non utilizzati diventano: sì comando: apt-get -y autoremove register: check_autoremove change_when: "'i pacchetti verranno RIMOSSI' in check_autoremove.stdout"
Luke Hoersten

2

Una variazione che evidenzia la modifica dei pacchetti (la prima attività sarà opportunamente colorata in verde o giallo):

  - 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

Il problema con la tua stringa "sed" è che non è "portatile". L'esecuzione dei apt-get --dry-run autoremove | grep "to remove"ritorni su Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.ma su Ubuntu 15.04 restituisce 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.che la tua sed non corrisponde.
Huygens,

Sempre difficile far corrispondere il cambiamento del testo. Probabilmente sostituire installcon install(ed)?o qualcosa del genere.
Martin Tapp,

1

Mi piace questo metodo semplificato e aggiungo qualche messaggio di verifica e stampa per me.

#!/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 :

Grazie per cortopy e Dave James Miller .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.