Exécuter apt-get autoremove avec ansible

23

Je maintiens un troupeau de serveurs EC2 avec ansible. Les serveurs sont régulièrement mis à jour et mis à niveau à l' aide du module apt .

Lorsque j'ai essayé manuellement de mettre à niveau un serveur, j'ai reçu le message suivant:

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

Existe-t-il un moyen de fonctionner sudo apt-get autoremoveavec Ansible?

Adam Matan
la source
1
Vous pouvez toujours utiliser le commandmodule pour exécuter une commande shell brute.
ceejayoz

Réponses:

26

La prise en charge de l' apt-getoption --auto-removeest désormais intégrée à Ansible apt(option autoremove) à partir de la version 2.1 La documentation officielle est disponible à l' adresse http://docs.ansible.com/ansible/apt_module.html

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

La fusion s'est produite ici .

Notez qu'il autocleanest également disponible à partir de la version 2.4

oalders
la source
Pourriez-vous s'il vous plaît ajouter un lien de référence?
Adam Matan
@AdamMatan Réponse mise à jour avec un lien vers les documents.
oalders
1
si vous cochez ici, vous verrez que "autoremove" avec une option "state" est considéré comme un bug. L'équipe de développement d'Ansible devra définir si "autoremove" ne sera qu'une option ou une opération complète pour Ansible 2.2 (j'espère ...)
Yonsy Solis
@YonsySolis quelqu'un a détourné cette réponse via une modification. Je l'ai ramené à son état d'origine.
oalders
1
@flickerfly selon les documents, vous devriez pouvoir l'exécuter sans avoir à fournir de nom de package. J'ai mis à jour ma réponse pour refléter cela.
oalders
14

Cette méthode simplifiée nécessite une seule tâche

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
cortopie
la source
ce devrait probablement être la réponse acceptée.
ab77
9

Vous pouvez le faire avec command(non testé):

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

Cependant, je pense qu'il pourrait être risqué de s'exécuter autoremoveautomatiquement. En raison d'erreurs d'administration système que vous avez commises dans le passé (celles-ci pourraient être dans votre code ansible), il est possible qu'un package nécessaire soit à un moment donné détecté à tort comme amovible, ce qui pourrait empêcher le serveur de fonctionner. D'un autre côté, ce n'est pas grave de laisser des paquets inutilisés sur le système, et ce n'est pas très courant à moins que vous n'apportiez un changement majeur dans la configuration du serveur.

Par conséquent, je resterais à l'écart des paquets à suppression automatique sans confirmation d'un humain.

Antonis Christofides
la source
Ansible ne marque pas nécessairement les packages comme «manuels», même si vous les avez installés à l'aide du module apt. Ainsi, «autoremove» peut supprimer les mauvais packages. Solution rapide: utilisationapt-mark manual <pkg>
Willem
1
Sur Ubuntu, si vous ne faites pas de suppression automatique régulière, votre / boot peut se remplir jusqu'à ce qu'il soit plein! Généralement, la suppression automatique n'a supprimé que les anciens noyaux inutilisés. Parce que cela nécessite un contrôle régulier, il doit être automatisé. :-) Sur Fedora / RHEL, vous pouvez demander à yum / dnf de ne garder qu'un certain nombre de paquets (comme 3 versions du noyau), donc vous n'aurez jamais ce problème.
Huygens
6

Il s'agit d'une variante de la solution proposée par Antonis Christofides. Il est testé et fonctionne pour moi. J'ai évité d'utiliser ignore_errors dans la commande check. Sinon, il adopte généralement la même approche.

- 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
la source
Quelle est la raison d'une --dry-runpremière? apt-get -y autoremovene renvoie pas un état différent de zéro. Il semble donc que vous puissiez exécuter sans condition --dry-runet vérifier par changed_whenrapport à l'appel réel de suppression automatique, je pense.
thom_nic
@thom_nic Je pense que vous avez raison. J'ai pu structurer comme ceci: - nom: autoremove les paquets inutilisés deviennent: oui commande: apt-get -y autoremove registre: check_autoremove changé_when: "'les paquets seront supprimés' dans check_autoremove.stdout"
Luke Hoersten
2

Une variation qui met en évidence le changement dans les packages (la première tâche sera de couleur verte ou jaune appropriée):

  - 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
la source
Le problème avec votre chaîne "sed" est qu'elle n'est pas "portable". L'exécution des apt-get --dry-run autoremove | grep "to remove"retours sur Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.mais sur Ubuntu 15.04, il renvoie 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.ce que votre sed ne correspond pas.
Huygens
Toujours difficile de faire correspondre le texte changeant. Remplacez probablement installpar install(ed)?ou quelque chose comme ça.
Martin Tapp
1

J'aime cette méthode simplifiée et j'ajoute un message de vérification et d'impression pour moi.

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

Merci pour cortopy et Dave James Miller .

Chu-Saing Lai
la source