我们在清单文件中有基于命名约定的动态组名。对于这些,我想访问这些宿主以遍历所有宿主,以便从中创建一个字符串(例如,逗号分隔)。
例如:
[misbe_test_a]
host1
host2
[misbe_test_b]
host2
host3
host4
该变量将是一个字典,其中每个项目都包含一个列表:
"misbe_test_a": [
"host1",
"host2"
],
"misbe_test_b": [
"host2",
"host3",
"host4"
]
对于一个特定的群体当然可以解决什么:
{% for host in (groups["misbe_test_a"] | unique) %}{{ host }}{% endfor %}
但是,我需要访问所有组而不知道misbe_后面跟着什么。当然,此解决方案将无法解决:
{% for host in (groups["misbe_*"] | unique) %}{{ host }}{% endfor %}
有什么想法我可以用一根眼线笔解决吗?我想省略的是以下内容(另外,它会将host2两次添加到我的字符串>中,就像在不同的组中一样):
{% for group_name in (groups | select('match','misbe.*') | list | unique) %}
{% for host in groups[group_name] %}
{{ host }}
{% endfor %}
{% endfor %}"
编辑
为此使用json_query怎么样,是否有可能查询字典的键然后访问列表中的项?
这将适用于一组:
{{ groups | json_query('misbe_test_a') | list | join(',') }}
不幸的是,我不知道如何使用JSME函数(例如,starts_with或包含http://jmespath.org/specification.html#functions)在字典中选择它们的键。
答案 0 :(得分:0)
例如这种方式:
在groups
上迭代并使用正则表达式选择所需的内容
连接上述每个组的主机列表
从该串联列表中选择要打印的唯一主机
{% set ns = namespace(all_hosts=[]) %}
{% for group_name in (groups | select('match','misbe.*')) %}
{% set ns.all_hosts = ns.all_hosts + groups[group_name] %}
{% endfor %}
{% for host in (ns.all_hosts | unique) %}{{ host }}{% endfor %}