根据多个循环中更改的结果运行Ansible处理程序

JW.*_*JW. 6 ansible ansible-playbook

我有一个Ansible变量,包含一个Web服务器列表(全部在同一主机上):

servers:
  - foo
  - bar
  - baz
Run Code Online (Sandbox Code Playgroud)

并且任务更改其配置文件,并将结果注册到变量中:

- name: create server configs
  template: ...
  with_items: "{{ servers }}"
  notify: restart changed servers
  register: servers_changed
Run Code Online (Sandbox Code Playgroud)

还有一个处理程序,它只重新启动运行该任务时更改的服务器:

- name: restart changed servers
  command: restart-my-server {{ item.item.name }}
  when: item.changed
  with_items: "{{ servers_changed.results }}"
Run Code Online (Sandbox Code Playgroud)

我的问题是,我现在需要多个任务,如上面的那个,它们会改变不同的配置文件.但如果我这样做,他们将覆盖servers_changed变量,因此只会使用最后一个变量.

我可以在每个任务中注册不同的变量,但是每个任务都需要一个不同的处理程序.这会变得混乱.有没有更好的办法?

tec*_*raf 5

使用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([]) }}"
Run Code Online (Sandbox Code Playgroud)

- name: restart changed servers
  command: restart-my-server {{ item.item.name }}
  when: item.changed
  with_items: "{{ servers_changed }}"
Run Code Online (Sandbox Code Playgroud)


JW.*_*JW. 5

我找到了一种我更喜欢的方法。这将创建一个变量restart_servers,其中包含需要重新启动的服务器名称数组。更新配置文件后,将更改的项目添加到变量中。

变量:

servers:
- name: server1
  port: 1000
- name: server2
  port: 1001
Run Code Online (Sandbox Code Playgroud)

任务:

- 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 }}"
Run Code Online (Sandbox Code Playgroud)

处理程序:

- name: restart changed servers
  command: restart-my-server {{ item.name }}
  when: item.name in restart_servers | default([])
  with_items: "{{ servers }}"
Run Code Online (Sandbox Code Playgroud)

缺点是在每个可能触发重启的任务之后,您需要第二个任务根据更改的服务器调用 set_fact。

优点是易于理解,并且避免了重复的处理程序或重复的重启。