Apt-get autoremove mit ansible ausführen

23

Ich unterhalte eine Herde von EC2-Servern mit ansible. Die Server werden regelmäßig mit dem apt-Modul aktualisiert und aktualisiert .

Als ich manuell versuchte, einen Server zu aktualisieren, erhielt ich die folgende Meldung:

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

Gibt es eine Möglichkeit sudo apt-get autoremovemit ansible zu rennen?

Adam Matan
quelle
1
Sie können das commandModul jederzeit verwenden , um einen Roh-Shell-Befehl auszuführen.
Ceejayoz

Antworten:

26

Die Unterstützung für die apt-getOption --auto-removeist ab Version 2.1 in Ansible apt(Option autoremove) integriert. Die offizielle Dokumentation finden Sie unter http://docs.ansible.com/ansible/apt_module.html

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

Die Zusammenführung geschah hier .

Beachten Sie, dass autocleanauch ab 2.4 verfügbar ist

oalders
quelle
Könnten Sie bitte einen Referenzlink hinzufügen?
Adam Matan
@AdamMatan Aktualisierte Antwort mit einem Link zu den Dokumenten.
Oalders
1
Wenn Sie hier ankreuzen , werden Sie feststellen, dass "Autoremove" mit der Option "State" als Fehler eingestuft wird. Ansible Entwickler-Team muss definieren, ob "Autoremove" nur eine Option oder eine vollständige Operation für Ansible 2.2 sein wird (ich hoffe ...)
Yonsy Solis
@YonsySolis jemand hat diese Antwort über eine Bearbeitung gekapert. Ich habe es in seinen ursprünglichen Zustand zurückgesetzt.
Oalders
1
@flickerfly Laut Dokumentation solltest du dies ausführen können, ohne einen Paketnamen angeben zu müssen. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln.
Oalders
14

Diese vereinfachte Methode erfordert nur eine Aufgabe

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
Kortopie
quelle
Dies sollte wahrscheinlich die akzeptierte Antwort sein.
ab77
9

Du kannst es machen mit command(ungetestet):

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

Ich denke jedoch, dass es riskant sein könnte, autoremoveautomatisch zu laufen . Aufgrund von Systemadministrationsfehlern, die Sie in der Vergangenheit gemacht haben (diese können sich in Ihrem nicht lesbaren Code befinden), kann es vorkommen, dass ein benötigtes Paket fälschlicherweise als automatisch entfernbar erkannt wird und der Server dadurch nicht mehr funktioniert. Auf der anderen Seite ist es keine große Sache, nicht verwendete Pakete auf dem System zu belassen, und es kommt nur dann häufig vor, wenn Sie eine wesentliche Änderung in der Serverkonfiguration vornehmen.

Daher würde ich mich von der automatischen Entfernung von Paketen fernhalten, ohne eine Bestätigung durch einen Menschen zu erhalten.

Antonis Christofides
quelle
Ansible markiert Pakete nicht unbedingt als 'manuell', auch wenn Sie sie mit dem apt-Modul installiert haben. 'Autoremove' könnte also die falschen Pakete entfernen. Schnellkorrektur: Verwenden Sieapt-mark manual <pkg>
Willem
1
Wenn Sie unter Ubuntu keine regelmäßige automatische Entfernung durchführen, wird Ihr / boot möglicherweise voll, bis es voll ist! Meist hat autoremove nur ältere, nicht verwendete Kernel entfernt. Da dies regelmäßig überprüft werden muss, sollte es automatisiert werden. :-) Unter Fedora / RHEL können Sie yum / dnf anweisen, nur eine bestimmte Anzahl von Paketen (wie 3 Kernel-Versionen) zu behalten, damit Sie dieses Problem nie haben.
Huygens
6

Dies ist eine Variation der von Antonis Christofides bereitgestellten Lösung. Es ist getestet und funktioniert bei mir. Ich habe die Verwendung von ignore_errors im check-Befehl vermieden. Ansonsten wird im Allgemeinen derselbe Ansatz gewählt.

- 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
quelle
Was ist der Grund für eine --dry-runPremiere? apt-get -y autoremovegibt keinen Nicht-Null-Status zurück. Es scheint also, dass Sie bedingungslos ohne das ausführen --dry-runund changed_whengegen den tatsächlichen Autoremove-Aufruf prüfen könnten, denke ich.
thom_nic
@ thom_nic Ich denke du hast recht. Ich konnte wie folgt strukturieren: - Name: nicht verwendete Pakete automatisch entfernen werden: Ja Befehl: apt-get -y Automatisch entfernen Registrieren: check_autoremove changed_when: "'Pakete werden ENTFERNT' in check_autoremove.stdout"
Luke Hoersten 07.08.15
2

Eine Variation, die die Änderung in Paketen hervorhebt (erste Aufgabe wird entsprechend grün oder gelb gefärbt):

  - 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
quelle
Das Problem mit deiner "sed" -Saite ist, dass sie nicht "portabel" ist. Die Ausführung von apt-get --dry-run autoremove | grep "to remove"Returns auf Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.aber auf Ubuntu 15.04 gibt es zurück, mit 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.denen Ihr Sed nicht übereinstimmt.
Huygens
Immer schwer zu ändernden Text zu entsprechen. Wahrscheinlich ersetzen installmit install(ed)?oder so ähnlich.
Martin Tapp
1

Ich mag diese vereinfachte Methode , und ich füge einige Scheck- und Drucknachrichten für mich hinzu.

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

Vielen Dank für Cortopy und Dave James Miller .

Chu-Saing Lai
quelle