我希望根据在主机上找到的信息将主机放入一个内存组中,我将在以后的播放中使用它。
我基于在控制节点上写入目标的主机名,然后使用此列表通过add_host
进行循环,因为add_host“ 绕过了主机循环,并且只运行一次剧中的主持人”(我引用了文档)。
简化示例:
---
- hosts: servers
tasks:
- name: check if this server has foo role based on file presence
stat:
path: /tmp/foo
register: role
- name: write server name in file on control node
lineinfile:
path: /tmp/servers_foo.txt
state: present
line: "{{ inventory_hostname }}"
delegate_to: 127.0.0.1
when: role.stat.isfile is defined and role.stat.isfile
- name: assign target to group
add_host:
name: "{{ item }}"
groups:
- foo
with_lines: cat /tmp/servers_foo.txt
- hosts: foo
tasks:
- name: test which servers are part of foo
ping:
...
此剧本的问题是lineinfile
任务似乎有问题,因为并非所有服务器都写入控制节点文件中。
…
TASK [lineinfile] ******************************************************************************
changed: [toto.foo -> 127.0.0.1]
changed: [tata.foo -> 127.0.0.1]
changed: [titi.foo -> 127.0.0.1]
changed: [tutu.foo -> 127.0.0.1]
TASK [assign target to group]
changed: [toto.foo] => (item=tata.foo)
changed: [toto.foo] => (item=tutu.foo)
…
这可以通过检查控制节点上的文件内容来确认
cat /tmp/servers_foo.txt
tata.foo
tutu.foo
我不确定为什么会有这个问题(文件访问的竞争条件吗?),但是要解决此问题,我在第一部戏中添加了serial: 1
,因此可以正常工作,但是如果我这样做我的速度会非常慢有数十台服务器和要实施的不同检查。
您是否可以更好,更快地实现这种用例,或者如何解决lineinfile
任务以使问题没有得到描述。