Назад | Перейти на главную страницу

Ansible получает элемент словаря с динамически скомпилированным именем ключа

В одной из пьес Ansible я включил файл переменных, который содержит одну такую ​​переменную:

dictionaries:
  - host1:
    - key1:
      - name: "Foo"
        params:
        - bar: "Baz"
  - host2:
    - key1:
      - name: "Foo2"
        params:
        - bar: "Baz2"
  - host3:
    - key1:
      - name: "Foo3"
        params:
        - bar: "Baz3"

Я хочу взять только элемент списка, имя ключа которого является Ansible {{inventory_hostname}} хоста, на котором Ansible выполняет playbook.

Так, например, если я выполню playbook на host2 Я хочу получить словарь:

- key1:
  - name: "Foo2"
    params:
    - bar: "Baz2"

Я пытаюсь использовать плагин поиска, но не знаю, как мне его использовать в этой ситуации.

После моего комментария выше давайте попробуем ответить, я считаю, что это правильная структура данных. Вот как я бы это изменил:

dictionaries:
  host1:
    key1:
      name: "Foo"
      params:
        bar: "Baz"
  host2:
    key1:
      name: "Foo2"
      params:
        bar: "Baz2"
  host3:
    key1:
      name: "Foo3"
      params:
        bar: "Baz3"
    key2:
      name: "toto"
      params:
        titi: "tata"

Теперь предположим, что вы хотите получить доступ к имени key2 для host3, ваша строка шаблона jinja2 будет

"{{ dictionnaries.host3.key2.name }}"

Вы также можете использовать для этого скобки, т.е.

"{{ dictionnaries['host3']['key2']['name'] }}"

... или комбинация (все это эквивалентные, неполный список примеров)

"{{ dictionnaries['host3'].key2.name }}"
"{{ dictionnaries['host3']['key2'].name }}"
"{{ dictionnaries.host3.key2['name'] }}"

Вернемся к вашему вопросу: теперь вы хотите получить доступ к хеш-карте ключей для определенного хоста при запуске playbook. Я считаю само собой разумеющимся, что ключи в вашем dictionnaries переменные названы в честь хоста в вашем инвентаре. Поэтому я использую inventory_hostname магическая переменная который содержит это имя при работе на определенном хосте

---
- name: debug vars from my dict
  hosts: whatever_group

  vars:
    dictionaries:
      host1:
        key1:
          name: "Foo"
          params:
            bar: "Baz"
      host2:
        key1:
          name: "Foo2"
          params:
        bar: "Baz2"
      host3:
        key1:
          name: "Foo3"
          params:
            bar: "Baz3"
        key2:
          name: "toto"
          params:
            titi: "tata"

  tasks:
    - name: debug hashmap per host
      debug:
        msg: "{{ dictionaries[inventory_hostname] }}"

Все это, как говорится, является своего рода изобретением колеса, поскольку в ansible уже есть механизм объявления переменных для каждого хоста в вашем инвентаре. Вы можете объявить свои хэш-карты в host_vars/<hostname>.yml файл для каждого из ваших хостов. Тогда все, что вам нужно сделать, это использовать эти переменные как есть.

Посмотри на доступная документация по инвентаризации и, более конкретно, глава о организация переменных хоста и группы