让我们假设我有下一个简单的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方式”,但它是一种选择 .
一个为什么你可以这样做是通过使用
lsof
找到所有需要重新启动的pid
并将此信息传递给systemd以获取每个pid的服务名称 . 然后查看服务列表并重新启动它们 .有人准备写了一个像这样的perl-script - 见这里的例子:https://rwmj.wordpress.com/2014/07/10/which-services-need-restarting-after-an-upgrade/
另一种选择是debian-goodies repo / package中的restart-services脚本 .