Jinja2 выбрать все значения из списка директорий - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу извлечь список всех пользователей (читателей) из файла YAML с помощью Jinja2 (Ansible).

- name: queue1
  readers: 
    - user1
    - user5
- name: queue2
  readers: 
    - user1
    - user6

Я написал следующий код:

{% set l_readers = [] %}
{% for q in [{'name': 'queue1', 'readers': ["user1","user5"]}, {'name': 'queue2', 'readers': ["user6","user3"]}] %}
{% l_readers.extend(q['readers']) %}
{% endfor %}

Ошибка:

Encountered unknown tag 'l_readers'

Из всех проведенных мной испытаний я думаю, что l_reader из третьей строки не является l_reader, который я определил в первой строке, но я не понимаю, почему.

Онлайн-валидатор

Я проверил тот же фрагмент кода с помощью онлайн-валидатора (http://jinja.quantprogramming.com/), чтобы убедиться, что это ничто Ansible связанные с. Я получаю ту же ошибку.

Error: template rendering failed.
Encountered unknown tag 'l_readers'. Jinja was looking for the following tags: 'endfor' or 'else'. The innermost block that needs to be closed is 'for'.

1 Ответ

0 голосов
/ 27 апреля 2020

Чтобы получить список всех пользователей из этой структуры данных, вы можете использовать фильтр json_query, например:

data|json_query('[*].readers')|flatten

, который предполагает, что ваши данные находятся в переменной с именем data. Мы можем продемонстрировать это в книге воспроизведения:

- hosts: localhost
  gather_facts: false
  vars:
    data:
      - name: queue1
        readers: 
          - user1
          - user5
      - name: queue2
        readers: 
          - user1
          - user6

  tasks:
    - set_fact:
        list_of_readers: "{{ data|json_query('[*].readers')|flatten }}"

    - debug:
        msg: "{{ list_of_readers }}"

Вышеприведенная книга воспроизведения выдаст:


PLAY [localhost] ******************************************************************************

TASK [set_fact] *******************************************************************************
ok: [localhost]

TASK [debug] **********************************************************************************
ok: [localhost] => {
    "msg": [
        "user1",
        "user5",
        "user1",
        "user6"
    ]
}

PLAY RECAP ************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Фильтр json_query использует синтаксис JMESPath . На веб-сайте есть интерактивный инструмент запросов, который можно использовать для экспериментов с выражениями запросов.

...