шаблон от json до jinja - PullRequest
       3

шаблон от json до jinja

0 голосов
/ 21 февраля 2019

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

my_dict:
  name1:
    { path=/x/y/z, action=all, filter=no },
    { path=/a/b/c, action=some, filter=yes }
  name2:
    { path=/z/y/x, action=nothing, filter=no },
    { path=/c/b/a, action=all, filter=yes }

 tasks:
   - name: generate check config
     template:
       src: check.j2
       dest: "{{ config_dir }}/{{ item.key }}-directories.json"
       owner: Own
       group: Wheel
       mode: 0644
     with_dict:
       - "{{ my_dict }}"
     when:
       - my_dict is defined
     become: true

Мой шаблон выглядит как

{
"configs": [

{% for value in my_dict %}
{
"path": "{{ value.path }}",
"action": "{{ value.action }}",
{% if value.filter is defined %}
"filter": "{{ value.filter }}"
{% endif %}
}{% if !loop.last %},{% endif %}
{% endfor %}
]
}

Итак, я протестировал такМногое, что сейчас я не вижу в лесах причины слишком большого количества деревьев.

Выше должно получиться 2 файла.Имя файла = name1-directoryies.json Содержимое:

{
"configs": [
{
"path": /x/y/z,
"action": all,
"filter": no
},
{
"path": /a/b/c,
"action": some,
"filter": yes
}
]
}

Заранее

1 Ответ

0 голосов
/ 25 февраля 2019

Позвольте мне начать со следующего.Я вижу некоторые проблемы с вашим текущим решением.

  1. Ваш шаблон ссылается на значение элементов массива с value.<key>, когда вместо него следует читать item.value.<key>.
  2. with_dict ожидает диктовку, но выпередавая массив, содержащий dict как единственный элемент.В yaml - обозначает элементы массива.Чтобы использовать это правильно, вы просто пишете: with_dict: "{{ my_dict }}"
  3. Использование сокращенного синтаксиса yaml не приветствуется в ansible, так как это затрудняет чтение книг.

Я бы посоветовал вам сделать следующее:

Существует фильтр jinja2, который просто преобразует ваш диктант в json:

{{ dict_variable | to_json }} # or
{{ dict_variable | to_nice_json }}

Второй делает егочеловек читаемый.То, что вы сейчас пытаетесь сделать, может сработать (не рассматривал это так подробно), но это не красиво и не подвержено ошибкам.

Чтобы заставить его работать с фильтром jinja2, реструктурируйте ваши переменные вверху, как показано ниже.way:

    my_dict:
      - name1:
          configs:
            - path: /x/y/z
              action: all
              filter: no
            - path: /a/b/c
              action: some
              filter: yes
      - name2:
          configs:...

Когда VAR отформатированы следующим образом, вы можете просто использовать модуль copy, чтобы распечатать файлы конфигурации следующим образом:

    - name: Print the configs to the files
      copy:
        content: "{{ item.value | to_nice_json }}"
        dest: "{{ config_dir }}/{{ item.key }}-directories.json"
      with_dict: "{{ my_dict }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...