运行 Ansible 处理程序基于多个循环中的更改结果
Run Ansible handlers based on changed results in multiple loops
我有一个包含 Web 服务器列表的 Ansible 变量(都在同一主机上):
servers:
- foo
- bar
- baz
以及更改其配置文件并将结果注册到变量中的任务:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed
还有一个处理程序,它只重启在该任务运行时更改的服务器:
- name: restart changed servers
command: restart-my-server {{ item.item.name }}
when: item.changed
with_items: "{{ servers_changed.results }}"
我的问题是,我现在需要像上面那样的多项任务,它们会更改不同的配置文件。但如果我这样做,他们将覆盖 servers_changed
变量,因此只会使用最后一个变量。
我可以在每个任务中注册不同的变量,但是我需要为每个任务使用不同的处理程序。这会变得混乱。有没有更好的方法?
使用servers_changed
作为复合列表并连接每个任务的结果:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed_now
- set_fact:
servers_changed: "{{ servers_changed | default([]) | union(servers_changed_now.results|default([]) }}"
和
- name: restart changed servers
command: restart-my-server {{ item.item.name }}
when: item.changed
with_items: "{{ servers_changed }}"
我找到了我喜欢的方法。这将创建一个变量 restart_servers
,其中包含需要重新启动的服务器名称数组。更新配置文件后,将更改的项目添加到变量中。
变量:
servers:
- name: server1
port: 1000
- name: server2
port: 1001
任务:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed
- name: remember which servers need to restart
set_fact:
restart_servers: "{{ restart_servers | default([]) + [item.item.name] }}"
when: item.changed
with_items: "{{ servers_changed.results }}"
处理程序:
- name: restart changed servers
command: restart-my-server {{ item.name }}
when: item.name in restart_servers | default([])
with_items: "{{ servers }}"
缺点是在每个可能触发重启的任务之后,您需要第二个任务根据更改的服务器调用 set_fact。
优点是容易理解,避免了重复的处理程序或重复的重启。
我有一个包含 Web 服务器列表的 Ansible 变量(都在同一主机上):
servers:
- foo
- bar
- baz
以及更改其配置文件并将结果注册到变量中的任务:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed
还有一个处理程序,它只重启在该任务运行时更改的服务器:
- name: restart changed servers
command: restart-my-server {{ item.item.name }}
when: item.changed
with_items: "{{ servers_changed.results }}"
我的问题是,我现在需要像上面那样的多项任务,它们会更改不同的配置文件。但如果我这样做,他们将覆盖 servers_changed
变量,因此只会使用最后一个变量。
我可以在每个任务中注册不同的变量,但是我需要为每个任务使用不同的处理程序。这会变得混乱。有没有更好的方法?
使用servers_changed
作为复合列表并连接每个任务的结果:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed_now
- set_fact:
servers_changed: "{{ servers_changed | default([]) | union(servers_changed_now.results|default([]) }}"
和
- name: restart changed servers
command: restart-my-server {{ item.item.name }}
when: item.changed
with_items: "{{ servers_changed }}"
我找到了我喜欢的方法。这将创建一个变量 restart_servers
,其中包含需要重新启动的服务器名称数组。更新配置文件后,将更改的项目添加到变量中。
变量:
servers:
- name: server1
port: 1000
- name: server2
port: 1001
任务:
- name: create server configs
template: ...
with_items: "{{ servers }}"
notify: restart changed servers
register: servers_changed
- name: remember which servers need to restart
set_fact:
restart_servers: "{{ restart_servers | default([]) + [item.item.name] }}"
when: item.changed
with_items: "{{ servers_changed.results }}"
处理程序:
- name: restart changed servers
command: restart-my-server {{ item.name }}
when: item.name in restart_servers | default([])
with_items: "{{ servers }}"
缺点是在每个可能触发重启的任务之后,您需要第二个任务根据更改的服务器调用 set_fact。
优点是容易理解,避免了重复的处理程序或重复的重启。