Рейтинг:3

Итерация по вложенному списку/словарю с использованием шаблонов Jinja2

флаг ph

Я пытаюсь динамически настроить несколько серверов NFS в своей системе, создавая их файлы /etc/exports с помощью Ansible. Я надеюсь, что смогу сделать это с помощью шаблона jinja2. Это шаблон jinja2, который я не могу понять, основываясь на своем списке экспорта.

У меня есть следующие переменные, определенные в моей роли nfs:

site_nfs_servers: ['ansibletarget1', 'ansibletarget2']

экспорт:
  - сервер: "ansibletarget1"
    акции:
      - путь: "/мой/первый/общий/путь"
        клиент: "*"
        опции: "rw,синхронизировать"
      - путь: "/моя/вторая/доля/путь"
        клиент: "*"
        опции: "rw,sync,root_squash"
  - сервер: "ansibletarget2"
    акции:
      - путь: "/другой/общий/путь/другой/сервер"
        клиент: "*"
        опции: "ро,синхронизировать"

Затем у меня есть следующая игра для создания шаблона:

- имя: Создать файл экспорта.
  шаблон:
    источник: экспорт.j2
    место назначения: /etc/экспорт
    владелец: корень
    группа: корень
    режим: '0750'

Мой шаблон в настоящее время выглядит так:

{% для экспорта в экспорте %}
{% if ansible_hostname в export.server %}
{% для доли в акциях %}
{{share.path}} {{share.client}} {{share.options}}
{% конец для %}
{% конец%}
{% конец для %}

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

Рейтинг:3
флаг in

Вам не хватает ссылки на экспорт во втором цикле.

{% для экспорта в экспорте %}
{% if ansible_hostname в export.server %}
{% для доли в export.shares %}
{{share.path}} {{share.client}} {{share.options}}
{% конец для %}
{% конец%}
{% конец для %}

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

Рейтинг:2
флаг br

Создать инвентарь

оболочка> кошачьи хосты
[site_nfs_servers]
ansibletarget1
ansibletarget2

и положить акции в host_vars

оболочка> кошка host_vars/ansibletarget1.yml 
акции:
  - путь: "/мой/первый/общий/путь"
    клиент: "*"
    опции: "rw,синхронизировать"
  - путь: "/моя/вторая/доля/путь"
    клиент: "*"
    опции: "rw,sync,root_squash"
оболочка> кошка host_vars/ansibletarget2.yml 
акции:
  - путь: "/другой/общий/путь/другой/сервер"
    клиент: "*"
    опции: "ро,синхронизировать"

Создайте упрощенную роль для тестирования

оболочка> дерево ролей/my_nfs_role/
роли/my_nfs_role/
ââ задачи
âââ main.yml
ââ шаблоны
    âââ экспорт.j2

2 каталога, 2 файла
оболочка> cat roles/my_nfs_role/tasks/main.yml 
- шаблон:
    источник: экспорт.j2
    место назначения: /etc/exports.test
оболочка> cat roles/my_nfs_role/templates/exports.j2 
{% для доли в акциях %}
{{share.path}} {{share.client}} {{share.options}}
{% конец для %}

Затем используйте группу инвентаризации и роль в плейбуке.

оболочка> cat playbook.yml
- хосты: site_nfs_servers
  роли:
    - my_nfs_role

Запустите playbook и создайте файлы

shell> ansible-playbook -i hosts playbook.yml

ИГРАТЬ [site_nfs_servers] **************************************************** **

ЗАДАЧА [my_nfs_role : шаблон] ************************************************
изменено: [ansibletarget1]
изменено: [ansibletarget2]
 ...
оболочка> ssh admin@ansibletarget1 cat /etc/exports.test
/мой/первый/общий/путь * rw,sync
/my/second/share/path * rw,sync,root_squash

оболочка> ssh admin@ansibletarget2 cat /etc/exports.test
/другой/общий/путь/другой/сервер * ро, синхронизировать

Видеть Пример установки Ansible.


Если вы хотите сохранить доли в одном объекте, поместите список в groups_vars. Чтобы упростить код, преобразуйте список в словарь. Ты можешь использовать community.general.groupby_as_dict Например

оболочка> cat group_vars/all.yml
экспорт:
  - сервер: "ansibletarget1"
    акции:
      - путь: "/мой/первый/общий/путь"
        клиент: "*"
        опции: "rw,синхронизировать"
      - путь: "/моя/вторая/доля/путь"
        клиент: "*"
        опции: "rw,sync,root_squash"
  - сервер: "ansibletarget2"
    акции:
      - путь: "/другой/общий/путь/другой/сервер"
        клиент: "*"
        опции: "ро,синхронизировать"

exports_dict: "{{ exports|community.general.groupby_as_dict('сервер') }}"

дает

  экспорт_дикт:
    доступная цель1:
      сервер: ansibletarget1
      акции:
      - клиент: '*'
        опции: RW, синхронизация
        путь: /мой/первый/доля/путь
      - клиент: '*'
        варианты: rw, синхронизация, root_squash
        путь: /моя/вторая/доля/путь
    доступная цель2:
      сервер: ansibletarget2
      акции:
      - клиент: '*'
        опции: ro, синхронизация
        путь: /другой/общий/путь/другой/сервер

Затем измените шаблон. Это должно создать те же файлы, что и раньше.

оболочка> cat roles/my_nfs_role/templates/exports.j2 
{% для доли в exports_dict[inventory_hostname]['shares'] %}
{{share.path}} {{share.client}} {{share.options}}
{% конец для %}

Ответить или комментировать

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