我有一个清单文件,看起来像这样:
[master]
host01
[nl]
host02
[us]
host03
[satellites:children]
nl
us
我如何获得以satellites
为父组的组列表?
我正在寻找一个类似于这样的解决方案:
- debug: msg="{{ item }}"
with_items: "{{ groups['satellites:children'] }}"
更新:
我能想到的唯一解决方案是:
- debug: {{ item }}
with_items: "{{ groups }}"
when: item != "master" and item != "satellites" and item != "all" and item != "ungrouped"
但是这不是很灵活
您可以尝试以下方法:
vars:
parent: 'satellites'
tasks:
# functional style
- debug: msg="{{hostvars[item].group_names | select('ne', parent) | first}}"
with_items: "{{groups[parent]}}"
# set style
- debug: msg="{{hostvars[item].group_names | difference(parent) | first}}"
with_items: "{{groups[parent]}}"
另外,select('ne', parent)
可以与reject('equalto', parent)
互换,这取决于您更容易阅读。
链接:
集合论算子
选择和拒绝过滤器
根据评论更新答案。灵感来自这个帖子。
vars:
parent: 'satellites'
tasks:
- name: build a subgroups list
set_fact: subgroups="{{ ((subgroups | default([])) + hostvars[item].group_names) | difference(parent) }}"
with_items: "{{groups[parent]}}"
- debug: var=subgroups
输出: "subgroups": [
"nl",
"us"
]
还有另一种方法,使用bash命令(如awk
如果文件的内容是
cat /tmp/test.ini
[group1]
host1
host2
[group2]
host3
host4
[first_two_groups:children]
group1
group2
[group3]
host5
host6
[group4]
host7
host8
当文件有Linux EOL时,可以使用如下命令:
awk "/first_two_groups:children/,/^$/" /tmp/test.ini | grep -v children
group1
group2
Where group to find children ' s called first_two_groups
,它可以在文件中的任何位置。只要在组定义之后有空行,该空行用作锚点来结束awk流,命令就可以工作。我想大多数人为了可读性在目录文件中添加空行,我们可以利用这个事实。
如果文件恰好有Windows EOL,则命令为
awk "/first_two_groups:children/,/^[\r]$/" /tmp/test.ini | grep -v children
与一个可行的例子,像这样:
- name: get group children
shell: awk "/first_two_groups:children/,/^$/" /tmp/test.ini | grep -v children
register: chlldren
#returns list of the children groups to loop through later
- debug: var=children.stdout_lines
上面的没有经过完全测试,但如果有问题,那么它最多可能是在shell模块中转义特殊字符。记住-当你在shell模块中传递特殊字符时,如冒号,使用jinja展开-而不是:
,使用{{ ':' }}
此外,为了保持bash行为的一致性,建议通过在任务
args:
executable: /bin/bash