Как правильно обновить установленные пакеты с помощью Ansible?
Давайте предположим, что у меня есть следующая простая книга игр Ansible:
---
tasks:
- name: Upgrade installed packages
become: true
apt:
upgrade: safe
- name: Install NGINX web server
become: true
apt:
name: nginx
state: latest
notify:
- Restart NGINX
handlers:
- name: Restart NGINX
become: true
service:
name: nginx
state: restarted
Как видите, я сначала обновляю установленные пакеты APT, а затем проверяю, что у меня установлена последняя версия Nginx. Проблема в том, что если есть обновление для Nginx, оно будет установлено в первой задаче, и если так, вторая задача не будет помечена как измененная, и обработчик не будет запущен. Это правда? Или Ansible достаточно умен, чтобы каким-то образом запускать этот дескриптор, только когда Nginx был обновлен в первой задаче?
Интересно о лучшей практике для этого случая. Есть ли лучший способ, чем перенести все отдельные задачи установки (которые должны запускать обработчики при их изменении) до задачи, которая обновляет все установленные пакеты?
Спасибо!
1 ответ
Это не "The Ansible way", но это вариант.
одна из причин, почему вы можете сделать это с помощью lsof
найти все pid
Необходимо перезапустить и передать эту информацию в systemd, чтобы получить имя службы для каждого pid. А затем просмотрите список служб и перезапустите каждый из них.
кто-то все готовый написал такой Perl-скрипт - см. пример здесь: https://rwmj.wordpress.com/2014/07/10/which-services-need-restarting-after-an-upgrade/
другой вариант, но такой же, как скрипт restart-services из репозитория / пакета debian-goodies.