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?


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


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"

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.


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"

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

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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.