使用Ansible升级已安装软件包的正确方法是什么

时间:2017-08-03 19:06:08

标签: nginx ansible ansible-handlers

让我们假设我有下一个简单的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 个答案:

答案 0 :(得分:1)

这不是" Ansible方式",但它是一个选项。

为什么你能做到这一点的原因是使用pid查找需要重新启动的所有=并将此信息传递给systemd以获取每个pid的服务名称。然后查看服务列表并重新启动它们。

有人准备写了perl-script这样的话   - 请参阅此处的示例:https://rwmj.wordpress.com/2014/07/10/which-services-need-restarting-after-an-upgrade/

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