我遇到了障碍,一辈子都无法解决这个问题。我有一个库存文件,其中包含动态数量的行,每行将包含动态数量的机架。
---
all:
vars:
rows:
- {name: "row1", racks: ["row1-rack1", "row1-rack2"]}
- {name: "row2", racks: ["row2-rack1", "row2-rack2"]}
# I may have several more rows here
#- {name: "row3", racks: ["row3-rack1", "row3-rack2"]}
# I may have more racks
#- {name: "row4", racks: ["row4-rack1", "row4-rack2", "row4-rack3"]}
hosts:
host[1:8].example.com:
children:
somegroup1:
hosts:
host1.example.com:
somegroup2:
hosts:
host4.example.com:
row1-rack1:
hosts:
host[1:2].example.com:
row1-rack2:
hosts:
host[3:4].example.com:
row2-rack1:
hosts:
host[5:6].example.com:
row2-rack2:
hosts:
host[7:8].example.com:
racks:
children:
row1-rack1:
row1-rack2:
row2-rack1:
row2-rack2:
我可以很容易地获得机架列表:
- set_fact:
racks: "{{ racks|d([]) + [ row.1 ] }}"
with_subelements:
- "{{ rows }}"
- racks
loop_control:
loop_var: row
这给了我这个变量来使用:
"racks": [
"row1-rack1",
"row1-rack2",
"row2-rack1",
"row2-rack2",
]
我需要做的基本上是为机架和该机架的主机的每个组合运行一个简单的 shell 命令,如下所示。 (请记住,这是动态的行数和每行的机架数)。
somecommand -host groups[racks[0]][0] -rack racks[0]
somecommand -host groups[racks[0]][1] -rack racks[0]
somecommand -host groups[racks[0]][N] -rack racks[0]
somecommand -host groups[racks[1]][0] -rack racks[1]
somecommand -host groups[racks[1]][1] -rack racks[1]
somecommand -host groups[racks[1]][N] -rack racks[1]
somecommand -host groups[racks[2]][0] -rack racks[2]
somecommand -host groups[racks[2]][1] -rack racks[2]
somecommand -host groups[racks[2]][N] -rack racks[2]
somecommand -host groups[racks[3]][0] -rack racks[3]
somecommand -host groups[racks[3]][1] -rack racks[3]
somecommand -host groups[racks[3]][N] -rack racks[3]
...
somecommand -host groups[racks[N]][0] -rack racks[N]
somecommand -host groups[racks[N]][1] -rack racks[N]
somecommand -host groups[racks[N]][N] -rack racks[N]
乍一看似乎很可行。不确定是缺乏睡眠还是什么,但我已经尝试了将循环结构用于不同库存格式的所有方法。
如果能够获得just作为我的“row-rack”组的子组列表,我会很高兴,但我一生都不能这样做,因为 some_group1 和 some_group2 的存在其他“可能存在或不存在”的群体。无法过滤掉这些并构建排除这些的列表...因为子组的数量也是动态的。 非常感谢您的帮助。
example
且内容为的库存文件
all:
vars:
rows:
- {name: "row1", racks: ["row1-rack1", "row1-rack2"]}
- {name: "row2", racks: ["row2-rack1", "row2-rack2"]}
hosts:
host[1:8].example.com:
children:
somegroup1:
hosts:
host1.example.com:
somegroup2:
hosts:
host4.example.com:
row1-rack1:
hosts:
host[1:2].example.com:
row1-rack2:
hosts:
host[3:4].example.com:
row2-rack1:
hosts:
host[5:6].example.com:
row2-rack2:
hosts:
host[7:8].example.com:
racks:
children:
row1-rack1:
row1-rack2:
row2-rack1:
row2-rack2:
命令
ansible-inventory --inventory example racks --graph
将产生的输出
ansible-inventory --inventory example racks --graph
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Not replacing invalid character(s) "{'-'}" in group name (row1-rack2)
Not replacing invalid character(s) "{'-'}" in group name (row2-rack1)
Not replacing invalid character(s) "{'-'}" in group name (row2-rack2)
@racks:
|--@row1-rack1:
| |--host1.example.com
| |--host2.example.com
|--@row1-rack2:
| |--host3.example.com
| |--host4.example.com
|--@row2-rack1:
| |--host5.example.com
| |--host6.example.com
|--@row2-rack2:
| |--host7.example.com
| |--host8.example.com
一个最小的示例手册
---
- hosts: :*rack2
become: false
gather_facts: false
tasks:
- debug:
var: ansible_play_hosts
run_once: true
通过调用
ansible-playbook --inventory example main.yml
将产生的输出
TASK [debug] *************
ok: [host3.example.com] =>
ansible_play_hosts:
- host3.example.com
- host4.example.com
- host7.example.com
- host8.example.com
或
hosts: row1*
进入
TASK [debug] *************
ok: [host1.example.com] =>
ansible_play_hosts:
- host1.example.com
- host2.example.com
- host3.example.com
- host4.example.com
文档