Запуск apt-get autoremove з ansible


23

Я підтримую зграю серверів EC2 з ansible. Сервери регулярно оновлюються та оновлюються за допомогою модуля apt .

Коли я вручну намагався оновити сервер, я отримав таке повідомлення:

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

Чи є спосіб бігти sudo apt-get autoremoveз ансиле?


1
Ви завжди можете використовувати commandмодуль, щоб виконувати необмежену команду оболонки.
ceejayoz

Відповіді:


26

Підтримка apt-getопції --auto-removeтепер вбудована в Ansible's apt(опція autoremove) версії 2.1 Офіційна документація знаходиться на веб-сторінці http://docs.ansible.com/ansible/apt_module.html

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

Злиття сталося тут .

Зауважте, що autocleanце також доступно з 2.4


Не могли б ви додати посилання?
Адам Матан

@AdamMatan Оновлена ​​відповідь із посиланням на документи.
ольдер

1
якщо ви перевірте тут, ви побачите, що "autoremove" з опцією "state" вважається помилкою. Команді Ansible Dev потрібно буде визначити, чи "autoremove" буде лише варіантом або повноцінною операцією для Ansible 2.2 (сподіваюся ...)
Yonsy Solis

@YonsySolis хтось захопив цю відповідь за допомогою редагування. Я повернув його до початкового стану.
ольдери

1
@flickerfly, згідно з документами, ви повинні мати можливість це запустити, не вказуючи назву пакета. Я оновив свою відповідь, щоб це відобразити.
oalders

14

Цей спрощений метод вимагає лише одного завдання

  - name: Autoremove unused packages
    command: apt-get -y autoremove
    register: autoremove_output
    changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"

це, мабуть, має бути прийнятою відповіддю.
ab77

9

Ви можете зробити це за допомогою command(не перевіреного):

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

Однак я думаю, що ризикувати autoremoveавтоматично можна. Через помилки в системному адмініструванні, які ви робили раніше (вони могли бути у вашому коді ansible), можливо, що потрібний пакет може бути в якийсь момент помилково виявлений як автовідмінний, і це може зупинити роботу сервера. З іншого боку, залишати невикористані пакети в системі не складно, і це не дуже часто, якщо ви не зробите серйозних змін у налаштуваннях сервера.

Тому я б тримався подалі від пакетів для автоматичного переміщення без підтвердження від людини.


Ansible не обов'язково позначає пакунки як "вручну", навіть якщо ви встановили їх за допомогою модуля apt. Тож "autoremove" може видалити неправильні пакети. Швидке виправлення: використанняapt-mark manual <pkg>
Віллем

1
У Ubuntu, якщо ви не робите регулярний режим автореморації, ваш / завантажувальний механізм може заповнюватися до повного заповнення! Переважно авторемонтація видалила лише старі невикористані ядра. Оскільки для цього потрібна регулярна перевірка, її слід автоматизувати. :-) У Fedora / RHEL ви можете доручити yum / dnf зберігати лише певну кількість пакунків (наприклад, 3 версії ядра), тому у вас ніколи не виникне ця проблема.
Гюйгенс

6

Це варіація щодо рішення Антоніса Кристофідеса. Це перевірено і працює для мене. Я уникав використання ignore_errors в команді check. Інакше, як правило, застосовується однаковий підхід.

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

У чому причина --dry-runпершого? apt-get -y autoremoveне повертає ненульовий статус. Тож, здається, ви могли беззастережно запуститись --dry-runі не перевірити changed_whenфактичний виклик авторемонту.
thom_nic

@thom_nic Я думаю, ти маєш рацію. Мені вдалося структурувати так: - ім'я: autoremove невикористані пакети стають: так команда: apt-get -y зареєструватися autoremove: check_autoremove change_when: "'пакети будуть ВІДКЛЮЧЕНІ' у check_autoremove.stdout"
Лука Хоерстен

2

Варіант, який підкреслює зміну пакетів (перше завдання буде відповідним кольором зеленого або жовтого):

  - 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

Проблема вашого рядка "sed" полягає в тому, що він не "портативний". Виконання apt-get --dry-run autoremove | grep "to remove"повернень на Ubuntu 14.04, 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.але на Ubuntu 15.04 - це повернення, 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.яке не відповідає вашому sed.
Гюйгенс

Завжди важко відповідати зміні тексту. Можливо, замінити installна install(ed)?щось подібне.
Мартін Тапп

1

Мені подобається цей спрощений метод , і я додаю для мене кілька повідомлень про перевірку та друк.

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

Дякую за кортопію та Дейву Джеймсу Міллеру .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.