Frage Apt-get wird automatisch mit ansible ausgeführt


Ich halte eine Herde von EC2 Servern mit ansible. Die Server werden regelmäßig aktualisiert und aktualisiert das Apt-Modul.

Als ich manuell versucht habe, einen Server zu aktualisieren, habe ich die folgende Nachricht erhalten:

$ 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 einen Weg zu rennen? sudo apt-get autoremove mit ansible?


23
2017-11-13 12:56


Ursprung


Sie können immer die command Modul, um einen rohen Shell-Befehl auszuführen. - ceejayoz


Antworten:


Unterstützung für die apt-get Möglichkeit --auto-remove ist jetzt in Ansible eingebaut apt (Möglichkeit autoremove) ab Version 2.1 Offizielle Dokumentation ist bei http://docs.ansible.com/ansible/apt_module.html

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

Die Zusammenführung ist passiert Hier.

Beachten Sie, dass autoclean ist auch verfügbar ab 2.4


20
2018-04-14 13:46



Könnten Sie bitte einen Referenzlink hinzufügen? - Adam Matan
@AdamMatan Aktualisierte Antwort mit einem Link zu den Dokumenten. - oalders
wenn du nachschaust Hier Sie werden sehen, dass "autoremove" mit einer "state" -Option als Fehler angesehen wird. Ansible Dev Team muss definieren, ob "autoremove" nur eine Option oder eine vollständige Operation für Ansible 2.2 sein wird (hoffe ich ...) - Yonsy Solis
@YonsySolis jemand hat diese Antwort über eine Bearbeitung geklaut. Ich habe es in seinen ursprünglichen Zustand zurückversetzt. - oalders
@flickerfly gemäß den Dokumenten, die Sie ausführen können, ohne einen Paketnamen angeben zu müssen. Ich habe meine Antwort aktualisiert, um dies zu berücksichtigen. - oalders


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"

14
2018-06-15 18:53



Dies sollte wahrscheinlich die akzeptierte Antwort sein. - ab77


Du kannst es mit machen 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, es könnte riskant sein zu laufen autoremove automatisch. Aufgrund von Systemverwaltungsfehlern, die Sie in der Vergangenheit gemacht haben (dies könnte in Ihrem Antwortcode enthalten sein), ist es möglich, dass ein benötigtes Paket zu einem bestimmten Zeitpunkt fälschlicherweise als autoregreifbar erkannt wird und dies den Server daran hindern kann zu arbeiten. Auf der anderen Seite ist es keine große Sache, unbenutzte Pakete auf dem System zu lassen, und es ist nicht sehr üblich, es sei denn, Sie ändern die Einrichtung des Servers erheblich.

Daher würde ich ohne Bestätigung durch einen Menschen fern von Autoreparaturpaketen bleiben.


9
2017-11-13 13:55



Ansible markiert Pakete nicht unbedingt als "manuell", auch wenn Sie sie mit dem apt-Modul installiert haben. So 'Autoremove' könnte die falschen Pakete entfernen. Schnellkorrektur: verwenden apt-mark manual <pkg> - Willem
Wenn Sie unter Ubuntu nicht regelmäßig autoremove machen, wird Ihr / boot möglicherweise voll, bis es voll ist! Meistens hat Autoremove nur ältere unbenutzte Kernel entfernt. Weil 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 zu behalten (wie 3 Kernel-Versionen), so dass Sie dieses Problem nie haben. - Huygens


Dies ist eine Variante der von Antonis Christofides vorgeschlagenen Lösung. Es ist getestet und funktioniert für mich. Ich habe es vermieden, ignore_errors im check-Befehl zu verwenden. Sonst nimmt es im Allgemeinen den gleichen Ansatz.

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

6
2018-04-14 08:22



Was ist der Grund für ein? --dry-run zuerst? apt-get -y autoremove gibt keinen Nicht-Null-Status zurück. So scheint es, du könntest bedingungslos ohne die --dry-run und prüfe changed_when gegen den eigentlichen Autoremove Anruf denke ich. - thom_nic
@thom_nic Ich denke du hast Recht. Ich konnte so strukturieren: - Name: Autoremove unbenutzte Pakete werden: ja Befehl: apt-get -y Autoremove register: check_autoremove geändert_when: '' Pakete werden entfernt in check_autoremove.stdout " - Luke Hoersten


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

  - 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

2
2018-06-17 18:25



Problem mit Ihrem "sed" String ist, dass es nicht "tragbar" ist. Die Ausführung von apt-get --dry-run autoremove | grep "to remove" gibt auf Ubuntu 14.04 zurück, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. aber auf Ubuntu 15.04 kommt es zurück 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade. was dein sed nicht passt. - Huygens
Immer schwierig, sich ändernden Text anzupassen. Wahrscheinlich ersetzen install mit install(ed)? oder sowas ähnliches. - Martin Tapp


ich mag diese vereinfachte Methode, und ich füge eine Check- und Drucknachricht 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 :

Danke für Kortopy und Dave James Miller.


1
2017-10-11 05:11