Ansible-通过正则表达式或group_name(键)上的json_query(+ JSME函数)访问组变量(字典)中的主机(列表)

时间:2018-10-03 15:30:42

标签: ansible jinja2

我们在清单文件中有基于命名约定的动态组名。对于这些,我想访问这些宿主以遍历所有宿主,以便从中创建一个字符串(例如,逗号分隔)。

例如:

    [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)在字典中选择它们的键。

1 个答案:

答案 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 %}