Вложенный хеш в Ansible

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

Пройдя через доступные циклы, я думаю, что смогу добиться этого с помощью loop-control . Как бы то ни было, я не мог этого добиться. Может ли кто-нибудь помочь мне здесь.

Версия Ansible: 2.0.2.0

Мой хеш

users:
  ankit:
    name: ankit
    access:
      opt: /opt/data
      tmp: /tmp
  gupta:
    name: gupta
    access:
      data: /opt/data/gupta

Ожидается, что выполнение будет выполняться в цикле с использованием указанного выше хеша.

- file: path=/opt/data state=directory owner:ankit mode=0755
- file: path=/tmp state=directory owner:ankit mode=0755
- file: path=/opt/data/gupta state=directory owner:gupta mode=0755

Примечание. Это измененный пример. Я не создаю папки в реальной задаче. Я создаю темы Kafka, если они не существуют на основе топологии Storm. Как бы то ни было, структура хэша такая же, и мне нужно использовать эти элементы

Повторно разместил вопрос с фактическими фактами (https://stackoverflow.com/questions/37182895/nested-hash-in-ansible)


person Ankit Gupta    schedule 12.05.2016    source источник


Ответы (2)


Моя ошибка заключалась в том, что я пытался использовать loop_control с Ansible 2.0, поэтому это было не работает. вместо этого я должен использовать loops-and-includes- ин-2-0 и set_fact.

main.yml

- include: kafka_topic.yml
  with_dict: project.topology

kafka_topic.yml

- set_fact:
    outer_item: "{{item}}"

- debug:
    msg: "inner item={{item.value}}"
    with_dict: outer_item.value.kafka_topic
person Ankit Gupta    schedule 12.05.2016

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

with_dict не будет обрабатывать подэлементы. with_subelements работал бы, если бы у вас был список, а не диктовка. С этой структурой данных:

users:
  - name: ankit
    access:
      - /opt/data
      - /tmp
  - name: gupta
    access:
      - /opt/data/gupta

... вы могли бы сделать что-то вроде этого:

- file: "path={{ item.1 }} state=directory owner={{ item.0.name }} mode=0755"
  with_subelements:
     - "{{ users }}"
     - access

Если вы не можете изменить структуру данных, она станет более сложной. Вы можете использовать некрасивый обходной путь, например, сначала использовать with_dict зацикливание пользователей вместе с задачей include, а затем добавить еще with_dict во включенный файл, где вы перебираете элементы access.

Или сделайте это правильно / аккуратно и создайте свой собственный плагин поиска. С небольшими знаниями Python вы можете перебирать любую структуру данных.

person udondan    schedule 12.05.2016
comment
Я не могу изменить структуру, так как я использую тот же хеш для других задач, где мне нужны имена папок в зависимости от работы. т.е. в моих файлах шаблонов я использую users.ankit.access.opt, users.gupta.access.data и т. д. Примечание: это измененный пример. Я не создаю папки в реальной задаче. Я создаю темы Kafka, если они не существуют на основе топологии Storm. Как бы то ни было, структура хэша такая же, и мне нужно использовать эти элементы - person Ankit Gupta; 12.05.2016
comment
Тогда лучшим вариантом будет настраиваемый плагин поиска. - person udondan; 12.05.2016
comment
Спасибо за помощь. Моя ошибка заключалась в том, что я пытался использовать loop_control с Ansible 2.0, поэтому не работал. вместо этого я должен использовать циклы-и-включает -in-2-0 и set_fact. - person Ankit Gupta; 12.05.2016