Запуск apt-get с автоматическим удалением ansible
Я поддерживаю множество серверов 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
с ансайбл?
6 ответов
Поддержка для 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
Этот упрощенный метод требует только одну задачу
- name: Autoremove unused packages
command: apt-get -y autoremove
register: autoremove_output
changed_when: "'The following packages will be REMOVED' in autoremove_output.stdout"
Вы можете сделать это с 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), вполне возможно, что необходимый пакет может в какой-то момент быть ошибочно определен как автоматически удаляемый, и это может помешать работе сервера. С другой стороны, нет ничего страшного в том, чтобы оставить неиспользуемые пакеты в системе, и это не очень часто, если вы не внесете серьезные изменения в настройку сервера.
Таким образом, я бы держался подальше от автоматического удаления пакетов без подтверждения от человека.
Это вариант решения, предоставленного Антонисом Христофидесом. Это проверено и работает для меня. Я избегал использования 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"
Вариант, который выделяет изменения в пакетах (первая задача будет соответствующим образом окрашена в зеленый или желтый цвет):
- 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
Мне нравится этот упрощенный метод, и я добавляю некоторые проверки и распечатать сообщение для меня.
#!/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 и Дейв Джеймс Миллер.