我怎么能得到在Ansible儿童群体的列表



我有一个清单文件,看起来像这样:

[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

相关内容

  • 没有找到相关文章

最新更新