У меня есть группа серверов EC2 с ансиблем. Серверы регулярно обновляются и модернизируются с использованием модуль 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
с ансиблем?
Поддержка 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
Этот упрощенный метод требует только одной задачи
- 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
автоматически. Из-за ошибок системного администрирования, которые вы сделали в прошлом (они могут быть в вашем коде доступа), возможно, что необходимый пакет в какой-то момент может быть ошибочно определен как автоматически удаляемый, и это может остановить работу сервера. С другой стороны, нет ничего страшного в том, чтобы оставить неиспользуемые пакеты в системе, и это не очень распространено, если вы не внесете серьезные изменения в настройку сервера.
Поэтому я бы держался подальше от автоматического удаления пакетов без подтверждения от человека.
Это вариант решения, предложенного Антонисом Христофидесом. Проверено и у меня работает. Я избегал использования 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 и Дэйв Джеймс Миллер.