Как создать список для with_item из включенного списка - PullRequest
0 голосов
/ 26 августа 2018

У меня есть этот список:

"mylist": [
   { "files": [{"path": "path11"}, {"path": "path12"}] },
   { "files": [{"path": "path21"}, {"path": "path22"}] } 
]

, и мне нужно запустить роль с with_items , где элементы должны быть path элементами из моего списка.

Например:

- debug: msg="{{ item }}"
  with_items: "{{ mylist | some_magic }}"

Необходимый вывод:

TASK [test : debug] **********************************
ok: [host] => (item=path11 ) => {
    "msg": "path11"
}
ok: [host] => (item=path12 ) => {
    "msg": "path12"
}
ok: [host] => (item=path21 ) => {
    "msg": "path21"
}
...

Возможно ли это?


Это то, что я уже пробовал:

Конструкции выглядят так:

- debug: msg="{{ item }}"
  with_items: "{% for files in mylist | map(attribute='files') %}{% for file in files %}{{file.path}}{% endfor %}{% endfor %}"

Возвращаемое значение, как и ожидалось, не является списком.

Неправильные конструкции выглядят так:

- debug: msg="{{ item }}"
  with_items: "{{ mylist | map(attribute='files') | map(attribute='path') | list }}"

1 Ответ

0 голосов
/ 26 августа 2018

Это устаревший with_subelements шаблон петли .

Используя ключевое слово loop (Ansible 2.5 и более поздние версии), вы можете выполнять итерации с помощью:

- debug:
    msg: "{{ item.1.path }}"
  loop: "{{ mylist | subelements('files') }}"

Или то же самое, используя JMESPath (это показывает, как создать список из всей структуры данных):

- debug:
    msg: "{{ item }}"
  loop: "{{ mylist | json_query('[].files[].path') }}"
...