Ansible delegate_to 是否与处理程序一起工作?
Does Ansible delegate_to work with handlers?
我写了一个剧本来修改几个远程系统的IP地址。我写剧本一次只更改几个系统,所以我想使用 delegate_to 在每个系统被修改时更改名称服务器上的 DNS 记录,而不是添加一个单独的针对名称服务器的剧本一次更改所有主机 IP。
但是,似乎处理程序正在 运行 主要剧本目标上,而不是我的 delegate_to 目标上。有人有解决此问题的建议吗?
这是我的剧本:
---
host: hosts-to-modify
serial: 1
tasks:
- Modify IP for host-to-modify
//snip//
- name: Modify DNS entry
delegate_to: dns-servers
become: yes
replace:
args:
backup: yes
regexp: '^{{ inventory_hostname }}\s+IN\s+A\s+[\d\.]+$'
replace: "{{ inventory_hostname }} IN A {{ new_ip }}"
dest: /etc/bind/db.my.domain
notify:
- reload dns service
handlers:
- name: reload dns service
become: yes
service:
args:
name: bind9
state: reloaded
使用如下清单文件:
[dns-servers]
ns01
ns02
[hosts-to-modify]
host1 new_ip=10.1.1.10
host2 new_ip=10.1.1.11
host3 new_ip=10.1.1.12
host4 new_ip=10.1.1.13
输出片段,包括错误消息:
TASK [Modify DNS entry] ********************************************************
Friday 02 September 2016 14:46:09 -0400 (0:00:00.282) 0:00:35.876 ******
changed: [host1 -> ns01]
changed: [host1 -> ns02]
RUNNING HANDLER [reload dns service] *******************************************
Friday 02 September 2016 14:47:00 -0400 (0:00:38.925) 0:01:27.385 ******
fatal: [host1]: FAILED! => {"changed": false, "failed": true, "msg": "no service or tool found for: bind9"}
首先,您的示例剧本在几个方面是无效的:剧本语法有缺陷,delegate_to
无法针对一组主机。
如果你想委托给多个服务器,你应该迭代它们。
并回答您的主要问题:是的,您可以将 delegate_to
与处理程序一起使用:
handlers:
- name: reload dns service
become: yes
service:
args:
name: bind9
state: reloaded
delegate_to: "{{ item }}"
with_items: "{{ groups['dns-servers'] }}
我写了一个剧本来修改几个远程系统的IP地址。我写剧本一次只更改几个系统,所以我想使用 delegate_to 在每个系统被修改时更改名称服务器上的 DNS 记录,而不是添加一个单独的针对名称服务器的剧本一次更改所有主机 IP。
但是,似乎处理程序正在 运行 主要剧本目标上,而不是我的 delegate_to 目标上。有人有解决此问题的建议吗?
这是我的剧本:
---
host: hosts-to-modify
serial: 1
tasks:
- Modify IP for host-to-modify
//snip//
- name: Modify DNS entry
delegate_to: dns-servers
become: yes
replace:
args:
backup: yes
regexp: '^{{ inventory_hostname }}\s+IN\s+A\s+[\d\.]+$'
replace: "{{ inventory_hostname }} IN A {{ new_ip }}"
dest: /etc/bind/db.my.domain
notify:
- reload dns service
handlers:
- name: reload dns service
become: yes
service:
args:
name: bind9
state: reloaded
使用如下清单文件:
[dns-servers]
ns01
ns02
[hosts-to-modify]
host1 new_ip=10.1.1.10
host2 new_ip=10.1.1.11
host3 new_ip=10.1.1.12
host4 new_ip=10.1.1.13
输出片段,包括错误消息:
TASK [Modify DNS entry] ********************************************************
Friday 02 September 2016 14:46:09 -0400 (0:00:00.282) 0:00:35.876 ******
changed: [host1 -> ns01]
changed: [host1 -> ns02]
RUNNING HANDLER [reload dns service] *******************************************
Friday 02 September 2016 14:47:00 -0400 (0:00:38.925) 0:01:27.385 ******
fatal: [host1]: FAILED! => {"changed": false, "failed": true, "msg": "no service or tool found for: bind9"}
首先,您的示例剧本在几个方面是无效的:剧本语法有缺陷,delegate_to
无法针对一组主机。
如果你想委托给多个服务器,你应该迭代它们。
并回答您的主要问题:是的,您可以将 delegate_to
与处理程序一起使用:
handlers:
- name: reload dns service
become: yes
service:
args:
name: bind9
state: reloaded
delegate_to: "{{ item }}"
with_items: "{{ groups['dns-servers'] }}