Ansible获取子组中的所有主机



我在库存中有以下主机结构:

all:
children:
sc:
hosts:
sc-finder01a.com:
sc-finder01b.com:
vars:
default_port: 5679
version: 0.4.2-RELEASE
ms:
hosts:
ms-finder01a.com:
ms-finder01a.com:
vars:
default_port: 5679
version: 0.4.2-RELEASE

我在所有主机上运行,对于每个主机,我都想访问子组(sc/ms(中的另一个主机,以便在当前主机上执行之前检查条件,但我很难找到语法。此外,我必须防止Ansible在同一子组中的两个主机上并行执行该命令。

想法?

了解ansible的特殊变量。要控制执行,请查看剧本策略。

您可以使用group_names变量访问当前主机的组。如果您想控制主机执行顺序,delegate_to和run_once可能会有所帮助,您可以在其中分配一个run_once控制服务器并委派在组成员列表上循环的任务。

Q:"访问子组(sc/ms(中的其他主机,以便在当前主机上执行某个条件之前进行检查">

A: 迭代子组中的主机列表,例如

- debug:
msg: "Check a condition on {{ item }}"
loop: "{{ group_names|map('extract', groups)|flatten|unique|
difference([inventory_hostname]) }}"

给出

TASK [debug] *******************************************************
ok: [sc-finder01b.com] => (item=sc-finder01a.com) => 
msg: Check a condition on sc-finder01a.com
ok: [sc-finder01a.com] => (item=sc-finder01b.com) => 
msg: Check a condition on sc-finder01b.com
ok: [ms-finder01b.com] => (item=ms-finder01a.com) => 
msg: Check a condition on ms-finder01a.com
ok: [ms-finder01a.com] => (item=ms-finder01b.com) => 
msg: Check a condition on ms-finder01b.com

调试

库存

shell> cat hosts
all:
children:
sc:
hosts:
sc-finder01a.com:
sc-finder01b.com:
vars:
default_port: 5679
version: 0.4.2-RELEASE
ms:
hosts:
ms-finder01a.com:
ms-finder01b.com:
vars:
default_port: 5679
version: 0.4.2-RELEASE

显示所有主机

- debug:
var: groups
run_once: true

给出

TASK [debug] ***************************************************************
ok: [sc-finder01a.com] => 
groups:
all:
- sc-finder01a.com
- sc-finder01b.com
- ms-finder01a.com
- ms-finder01b.com
ms:
- ms-finder01a.com
- ms-finder01b.com
sc:
- sc-finder01a.com
- sc-finder01b.com
ungrouped: []

多个子组

如果主机是多个子组的成员,例如,则该代码也有效

shell> cat hosts
all:
children:
sc:
hosts:
sc-finder01a.com:
ms:
hosts:
ms-finder01a.com:
foo:
hosts:
foo-bar.com:
sc-finder01a.com:
ms-finder01a.com:

给出

TASK [debug] ******************************************************
ok: [sc-finder01a.com] => (item=foo-bar.com) => 
msg: Check a condition on foo-bar.com
ok: [sc-finder01a.com] => (item=ms-finder01a.com) => 
msg: Check a condition on ms-finder01a.com
ok: [foo-bar.com] => (item=sc-finder01a.com) => 
msg: Check a condition on sc-finder01a.com
ok: [ms-finder01a.com] => (item=foo-bar.com) => 
msg: Check a condition on foo-bar.com
ok: [foo-bar.com] => (item=ms-finder01a.com) => 
msg: Check a condition on ms-finder01a.com
ok: [ms-finder01a.com] => (item=sc-finder01a.com) => 
msg: Check a condition on sc-finder01a.com

最新更新