Ansible:如何为播放的所有主机调用模块`add_host`

Nel*_* G. 5 ansible ansible-inventory

我用这个剧本创建了一本剧本:

在主机上hypervisors:

  • 从所有主机检索虚拟机列表
  • 使用模块add_host将所有这些添加到名为的新库存组中guests

我的库存:

[hypervisors]
host1
host2
Run Code Online (Sandbox Code Playgroud)

我的剧本:

- hosts: hypervisors
  - shell: virsh list | awk 'NR>2' | awk '{print $2}'
    register: result_virsh
  - add_host:
      name: "{{ item }}"
      group: "guests"
    with_items: "{{ result_virsh.stdout_lines }}"
Run Code Online (Sandbox Code Playgroud)

模块add_host 绕过播放主机循环,仅对播放中的所有主机运行一次.

然后它被调用一次(对于host1),这是使用这个模块的特殊情况(参见上面的链接),好像该变量run_once被隐式修复true.

如何将它用于组中的所有主机hypervisors

编辑:仅使用localhost在计算机上重现它的示例

创建文件/ tmp/host1_test以模拟guest虚拟机vm1vm2的返回:

vm1
vm2
Run Code Online (Sandbox Code Playgroud)

创建文件/ tmp/host2_test以模拟guest虚拟机vm3vm4的返回:

vm3
vm4
Run Code Online (Sandbox Code Playgroud)

将此清单(test_add_host.ini)与两台主机一起使用,这两台主机都具有固定IP地址127.0.0.1:

[hypervisors]
host1 ansible_host=127.0.0.1 test_filename=/tmp/host1_test
host2 ansible_host=127.0.0.1 test_filename=/tmp/host2_test
Run Code Online (Sandbox Code Playgroud)

使用这个剧本(test_add_host.yml):

- hosts: hypervisors
  gather_facts: no
  tasks:
  - shell: "cat {{ test_filename }}"
    register: result_virsh
  - add_host:
      name: "{{ item }}"
      group: "guests"
    with_items: "{{ result_virsh.stdout_lines }}"

- hosts: guests
  gather_facts: no
  tasks:
  - local_action: ping
Run Code Online (Sandbox Code Playgroud)

使用命令在本地调用此playbook:

ansible-playbook -c local -i test_add_host.ini test_add_host.yml
Run Code Online (Sandbox Code Playgroud)
  • 首先播放呼叫主机host1host2
  • 第二次播放呼叫主机vm1vm2

在第二次播放中,如何调用所有主机(vm1,vm2,vm3vm4)?

Kon*_*rov 8

如你所说,有一件事add_host:BYPASS_HOST_LOOP = True.
所以这是一种强迫run_once.

如果你不介意hypervisors以顺序方式运行,你可以简单地使用serial: 1:

- hosts: hypervisors
  serial: 1
  tasks:
    - shell: virsh list | awk 'NR>2' | awk '{print $2}'
      register: result_virsh
    - add_host:
        name: "{{ item }}"
        group: "guests"
      with_items: "{{ result_virsh.stdout_lines }}"
Run Code Online (Sandbox Code Playgroud)

这可以确保每个播放批处理只包含一个主机,因此add_host可以为每个主机执行.