0

假设我有下一个简单的 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 时才以某种方式触发此句柄?

我想知道这个案例的最佳实践。有没有比在升级所有已安装软件包的任务之前移动所有单独的安装任务(应该在其更改时触发处理程序)更好的方法?

谢谢!

4

1 回答 1

1

这不是“Ansible 方式”,但它是一种选择。

您可以这样做的一个原因是使用lsof查找所有pid需要重新启动的 's 并将此信息传递给 systemd 以获取每个 pid 的服务名称。然后检查服务列表并重新启动每个服务。

有些人已经准备好了这样的perl 脚本- 请参见此处的示例:https ://rwmj.wordpress.com/2014/07/10/which-services-need-restarting-after-an-upgrade/

另一个选项是debian-goodies repo/package中的restart-services脚本。

于 2017-08-04T07:42:21.430 回答