ansible - Ansible:使用 yaml 库存的两个主机组的交集
问题描述
我有 2 个组,每个组都有名为dev
和的子组test
。我正在尝试使用模式定位( ) 中的test
主机。group2
four.example.com
group2:&test
鉴于 yaml 库存:
all:
children:
group1:
children:
dev:
hosts:
one.example.com:
test:
hosts:
two.example.com:
group2:
children:
dev:
hosts:
three.example.com:
test:
hosts:
four.example.com:
和剧本:
- name: health check
hosts: group2:&test
tasks:
- name: Ping hosts
ping:
我从two
和都收到了 ping 命令four
。
我只 希望 ping 来自four
.
虽然它确实two
是一个名为 的组的一部分test
,但它不是该组的一部分,group2
因此我不希望将它视为相交的一部分。
就好像它在做一个逻辑或 (||),而不是一个逻辑与 (&&)
使用具有非唯一子名称的嵌套组时,这是 Ansible 的限制吗?
解决方案
问:“在使用具有非唯一子名称的嵌套组时,这是 Ansible 的限制吗? ”
答:Ansible by design 不存储库存树。这似乎是一个限制。引用 如何合并变量
默认情况下,变量在播放运行之前被合并/展平到特定主机。这使 Ansible 专注于主机和任务,因此组在库存和主机匹配之外并不能真正生存。
任何属于子组成员的主机都会自动成为父组的成员。
有2个含义
- 模式“ group2 :&test ”是自相矛盾的。组测试包含主机:二和四。通过尝试过交叉点,您同意这一点。否则,交叉点就没有意义了。但是引用的声明说test的成员自动成为group1和group2的成员。换句话说,Ansible 无法区分 1)保留所有主机的组测试和 2) 将组测试作为group1或group2的子项。例如,下面的清单等同于问题中的清单
all:
children:
group1:
children:
dev:
hosts:
one.example.com:
three.example.com:
test:
hosts:
two.example.com:
four.example.com:
group2:
children:
dev:
test:
all:
children:
dev:
hosts:
one.example.com:
three.example.com:
test:
hosts:
two.example.com:
four.example.com:
group1:
children:
dev:
test:
group2:
children:
dev:
test:
- 具有非唯一子名称的嵌套组不符合此用例的目的。试试下面的库存
all:
children:
group1:
hosts:
one.example.com:
two.example.com:
group2:
hosts:
three.example.com:
four.example.com:
dev:
hosts:
one.example.com:
three.example.com:
test:
hosts:
two.example.com:
four.example.com:
笔记
- 如果使用 groups_vars 的合并顺序,库存之间可能存在差异。请参阅如何合并变量。