Ansible - Доступ к хостам (списку) в группе переменных (словарь) с помощью регулярных выражений или json_query (+ функции JSME) для group_name (ключ) - PullRequest
0 голосов
/ 03 октября 2018

у нас есть динамические имена групп в нашем файле инвентаря, которые основаны на соглашении об именах.Для этих целей я хотел бы получить доступ к узлам этих узлов, чтобы перебрать все из них, чтобы создать из них строку (например, через запятую).

Например:

    [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 %}" 

EDIT

ЧтоЧто касается использования json_query для этого, есть ли возможность запросить ключ словаря и затем получить доступ к элементам списка?

Этот будет работать для одной группы:

    {{ groups | json_query('misbe_test_a') | list | join(',') }}        

К сожалениюЯ не знаю, как выбрать, что они вводят в словарь с функциями JSME (например, начинается с или содержит http://jmespath.org/specification.html#functions).

1 Ответ

0 голосов
/ 03 октября 2018

Например, следующим образом:

  • итерации по 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 %}
...