改善ansible中add_host的使用

时间:2018-07-14 12:11:26

标签: ansible

我希望根据在主机上找到的信息将主机放入一个内存组中,我将在以后的播放中使用它。

我基于在控制节点上写入目标的主机名,然后使用此列表通过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任务以使问题没有得到描述。

0 个答案:

没有答案