Выполнение apt-get autoremove with 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с ansible?

Адам Матан
источник
1
Вы всегда можете использовать commandмодуль для выполнения необработанной команды оболочки.
ceejayoz

Ответы:

26

Поддержка этой apt-getопции --auto-removeтеперь встроена в Ansible 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

oalders
источник
Не могли бы вы добавить ссылку ссылку?
Адам Матан
@AdamMatan Обновленный ответ со ссылкой на документы.
oalders
1
Если вы отметите здесь, то увидите, что «автоудаление» с опцией «состояние» считается ошибкой. Команда разработчиков Ansible должна будет определить, будет ли «автоудаление» только опцией или полной операцией для Ansible 2.2 (надеюсь ...)
Йонси Солис,
@YonsySolis кто-то похитил этот ответ с помощью редактирования. Я вернул его в исходное состояние.
oalders
1
@flickerfly в соответствии с документацией, вы должны иметь возможность запустить это без указания имени пакета. Я обновил свой ответ, чтобы отразить это.
Олдерс
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"
cortopy
источник
это, вероятно, должен быть принятый ответ.
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автоматически может быть рискованно . Из-за ошибок системного администрирования, которые вы допустили в прошлом (это может быть в вашем коде ANSI), вполне возможно, что необходимый пакет может в какой-то момент быть ошибочно определен как автоматически удаляемый, и это может помешать работе сервера. С другой стороны, нет ничего страшного в том, чтобы оставить неиспользуемые пакеты в системе, и это не очень часто, если вы не внесете серьезные изменения в настройку сервера.

Таким образом, я бы держался подальше от автоматического удаления пакетов без подтверждения от человека.

Антонис Христофидес
источник
Ansible не обязательно помечает пакеты как «ручные», даже если вы установили их с помощью модуля apt. Таким образом, «autoremove» может удалить неправильные пакеты. Быстрое исправление: использованиеapt-mark manual <pkg>
Виллем
1
В Ubuntu, если вы не выполняете обычное автоматическое удаление, ваш / boot может заполняться до тех пор, пока он не будет заполнен! В основном autoremove удаляет только старые неиспользуемые ядра. Потому что это требует регулярной проверки, это должно быть автоматизировано. :-) В Fedora / RHEL вы можете указать yum / dnf хранить только определенное количество пакетов (например, 3 версии ядра), чтобы у вас никогда не возникало этой проблемы.
Гюйгенс
6

Это вариант решения, предоставленного Антонисом Христофидесом. Это проверено и работает для меня. Я избегал использования ignore_errors в команде проверки. В противном случае обычно используется тот же подход.

- 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 Я думаю, ты прав. Я смог структурировать так: - name: autoremove неиспользуемые пакеты становятся: yes команда: apt-get -y autoremove register: check_autoremove updated_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 :

Спасибо за Cortopy и Дейв Джеймс Миллер .

Чу-Саинг Лай
источник