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虚拟机vm1和vm2的返回:
vm1
vm2
Run Code Online (Sandbox Code Playgroud)
创建文件/ tmp/host2_test以模拟guest虚拟机vm3和vm4的返回:
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)
在第二次播放中,如何调用所有主机(vm1,vm2,vm3和vm4)?
如你所说,有一件事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可以为每个主机执行.
| 归档时间: |
|
| 查看次数: |
6664 次 |
| 最近记录: |