我可以通知另一个主机上的处理程序吗?



我正在配置的应用程序涉及运行在多台机器上的从服务,它们都从单个主服务器下载配置文件。(这台编排机器根本没有运行服务。)主机都在同一个目录中,但是属于不同的组(例如:[servers][client])。

我们已经有了一个处理程序,当本地方面发生变化时,可以重新启动这些服务。

但我不能弄清楚,如何通知相同的处理程序-在多台机器上-当主配置文件更改时。

在今天的Ansible中,这样的事情——来自相同库存的其他主机上的处理程序的通知——是可能的吗?

您将无法使用处理程序做到这一点,但您可以通过显式播放来做到这一点。例如,假设你有一个剧本,目标是你的servers组,并做了一个改变,需要你的clients上的东西重新启动。我们可以这样做:

- hosts: servers
gather_facts: false
tasks:
# this task could be anything. the important thing is
# that it correctly reports a "changed" result and that
# you register that in a variable.
- command: cat /tmp/{{ inventory_hostname }}.status
register: result
changed_when: result.stdout == "changed"
- set_fact:
something_changed: "{{ result is changed }}"

- hosts: clients
gather_facts: false
tasks:
- debug:
msg: "restart all the things!"
when: >-
groups.servers |
map('extract', hostvars, 'something_changed') |
select() |
list

在服务器上,我们注册一个something_changed变量,该变量具有一个布尔值,告诉我们是否发生了变化。

在客户机上,我们检查是否有任何服务器报告了更改,并且如果是,则重新启动服务或执行其他操作必要的。