Uruchamianie apt-get autorove z ansible

23

Utrzymuję stado serwerów EC2 z ansible. Serwery są regularnie aktualizowane i uaktualniane za pomocą modułu apt .

Kiedy ręcznie próbowałem zaktualizować serwer, otrzymałem następujący komunikat:

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

Czy istnieje sposób na uruchomienie sudo apt-get autoremovez ansible?

Adam Matan
źródło
1
Zawsze możesz użyć commandmodułu, aby wykonać polecenie surowej powłoki.
ceejayoz

Odpowiedzi:

26

Obsługa tej apt-getopcji --auto-removejest teraz wbudowana w Ansible apt(opcja autoremove) od wersji 2.1 Oficjalna dokumentacja znajduje się na stronie http://docs.ansible.com/ansible/apt_module.html

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

Scalenie miało miejsce tutaj .

Pamiętaj, że autocleanjest również dostępny od wersji 2.4

oalders
źródło
Czy możesz dodać link referencyjny?
Adam Matan
@AdamMatan Zaktualizowana odpowiedź z linkiem do dokumentów.
oalders
1
jeśli sprawdzisz tutaj , zobaczysz, że „autorove” z opcją „stan” jest uważany za błąd. Zespół programistów Ansible będzie musiał określić, czy „autorove” będzie tylko opcją czy pełną operacją dla Ansible 2.2 (mam nadzieję ...)
Yonsy Solis,
@YonsySolis ktoś przechwycił tę odpowiedź przez edycję. Przywróciłem go do pierwotnego stanu.
oalders
1
@flickerfly zgodnie z dokumentacją powinieneś być w stanie uruchomić to bez konieczności podawania nazwy pakietu. Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić.
oalders
14

Ta uproszczona metoda wymaga tylko jednego zadania

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
kortykopia
źródło
prawdopodobnie powinna to być zaakceptowana odpowiedź.
ab77
9

Możesz to zrobić za pomocą command(nieprzetestowane):

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

Myślę jednak, że autoremoveautomatyczne uruchamianie może być ryzykowne . Z powodu błędów administrowania systemem, które popełniłeś w przeszłości (mogą być w kodzie ansible), możliwe, że potrzebny pakiet może w pewnym momencie zostać fałszywie wykryty jako autorovable, co może uniemożliwić działanie serwera. Z drugiej strony nie jest wielkim problemem pozostawianie nieużywanych pakietów w systemie i nie jest to zbyt częste, chyba że wprowadzisz poważną zmianę w konfiguracji serwera.

Dlatego trzymałbym się z dala od autorów paczek bez potwierdzenia od człowieka.

Antonis Christofides
źródło
Ansible niekoniecznie oznacza pakiety jako „ręczne”, nawet jeśli zainstalowałeś je za pomocą modułu apt. Dlatego „autorove” może usunąć niewłaściwe pakiety. Szybka poprawka: użyjapt-mark manual <pkg>
Willem
1
Na Ubuntu, jeśli nie robisz regularnych autorów, twój / boot może się zapełnić, aż będzie pełny! Głównie autorove usunął tylko starsze nieużywane jądro. Ponieważ wymaga to regularnej kontroli, należy ją zautomatyzować. :-) Na Fedorze / RHEL możesz poinstruować yum / dnf, aby zachował tylko pewną liczbę pakietów (jak 3 wersje jądra), więc nigdy nie masz tego problemu.
Huygens
6

Jest to odmiana dostarczonego rozwiązania Antonis Christofides. Jest przetestowany i działa dla mnie. Unikałem używania ignore_errors w poleceniu check. W przeciwnym razie ogólnie przyjmuje to samo podejście.

- 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
źródło
Jaki jest powód --dry-runpierwszego? apt-get -y autoremovenie zwraca stanu niezerowego. Wygląda więc na to, że można bezwarunkowo biec bez --dry-runi sprawdzić, changed_whenjak sądzę, z prawdziwym wezwaniem autorów.
thom_nic 14.04.15
@thom_nic Myślę, że masz rację. Udało mi się struktury tak: - nazwa: autoremove niewykorzystane pakiety stać: polecenie tak: apt-get -y autoremove zarejestrować: check_autoremove changed_when: „«pakiety zostaną usunięte»w check_autoremove.stdout”
Luke Hoersten
2

Odmiana podkreślająca zmianę w pakietach (pierwsze zadanie będzie odpowiednio oznaczone kolorem zielonym lub żółtym):

  - 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
źródło
Problem z łańcuchem „sed” polega na tym, że nie jest on „przenośny”. Wykonanie apt-get --dry-run autoremove | grep "to remove"zwrotów na Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.ale na Ubuntu 15.04 zwraca, 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.których twój sed nie pasuje.
Huygens,
Zawsze trudno dopasować zmieniający się tekst. Prawdopodobnie zastąpi installz install(ed)?lub coś podobnego.
Martin Tapp,
1

Podoba mi się ta uproszczona metoda i dodaję dla mnie wiadomość do sprawdzenia i wydrukowania.

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

Dziękuję za kortopię i Dave'a Jamesa Millera .

Chu-Saing Lai
źródło