Попытка пройти по спискам jinja в шаблоне cloud-init

Вопрос или проблема

Возможно ли итерировать несколько списков jinja? Я пытаюсь создать массив со значениями, а затем перебрать эти значения в выводе.

Вот что я попробовал, цикл for, похоже, только итерирует список пользователей. Я пытаюсь заполнить данные пользователя из определенных списков jinja (user, hash, key), а затем отобразить значения для каждого пользователя.

## шаблон: jinja
#cloud-config
{% set users = ['usr1','usr2'] %}
{% set hashes = ['$6$usr1-hash/','$6$usr2-hash'] %}
{% set keys = ['ssh-ed25519 usr1-key','ssh-ed25519 usr2-key'] %}
{% for user in users %}

пользователи:
  - имя: {{ user }}
{% set group = 'wheel' %}
    группы: {{ group }}
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: false
    passwd: {{ hashes }}
    ssh_authorized_keys:
      - {{ keys }}
    shell: /bin/bash
user = {{ user }}
hash = {{ hash }}
key = {{ key }}

{% endfor %}

Это просто заполняет весь список, каков правильный синтаксис, чтобы перебрать все три списка? Я пробовал индексные значения (например: hashes.1), и это дает мне одно и то же значение для каждого пользователя.

Ответ или решение

При использовании шаблонов Jinja в cloud-init для управления конфигурацией системы, существует необходимость в итерации по нескольким спискам с целью создания сложных структур данных, таких как массивы пользователей с конкретными свойствами. В вашем вопросе указано, что вы хотите итерировать три списка: пользователей, хешей и SSH-ключей, чтобы создать правильную конфигурацию для каждого пользователя.

Давайте рассмотрим, как можно правильно реализовать эту задачу, сохраняя синтаксис и логику Jinja.

Решение

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

Вот корректная версия вашего шаблона:

## template: jinja
#cloud-config
{% set users = ['usr1', 'usr2'] %}
{% set hashes = ['$6$usr1-hash/', '$6$usr2-hash'] %}
{% set keys = ['ssh-ed25519 usr1-key', 'ssh-ed25519 usr2-key'] %}

users:
{% for index, user in enumerate(users) %}
  - name: {{ user }}
    groups: wheel
    sudo: ALL=(ALL) NOPASSWD:ALL
    lock_passwd: false
    passwd: {{ hashes[index] }}  # Используем индекс для выбора хеша
    ssh_authorized_keys:
      - {{ keys[index] }}  # Используем индекс для выбора ключа
    shell: /bin/bash
{% endfor %}

Объяснение кода

  1. Использование enumerate: В данном случае мы применяем функцию enumerate, которая позволяет получать как индекс (позицию) элемента в списке, так и сам элемент. Это позволяет эффективно связывать элементы из трёх списков между собой.

  2. Индексы: Мы используем индекс для доступа к соответствующим элементам в списках hashes и keys. Это гарантирует, что для каждого пользователя будет использован правильный хеш пароля и SSH-ключ.

  3. Форматирование вывода: Структурируем вывод в едином формате, чтобы cloud-init мог правильно интерпретировать конфигурацию пользователей.

Заключение

Данный подход позволяет вам динамически генерировать конфигурации пользователей на основе трех связанных списков. Следуя приведенному примеру, вы сможете эффективно управлять пользователями через cloud-init с использованием шаблонов Jinja, что значительно упростит процесс конфигурации и повысит его гибкость. Не забывайте проверять вашу конфигурацию на наличие синтаксических ошибок, чтобы избежать потенциальных проблем при развертывании.

Оцените материал
Добавить комментарий

Капча загружается...