Создание шаблонов jinja 2 переменных для ansible

#ansible #jinja2

#ansible #jinja2

Вопрос:

У меня следующий сценарий: переменные, названные как:

 size_1: 1
size_2: 2
size_3: 3
nb_of_sizes: 3
 

И я хочу создать их шаблон в файле jinja2 с итерацией, чтобы получить что-то вроде:

NB-1-01

NB-1-02

NB-2-01

NB-2-02

NB-3-01

NB-3-02

Индекс в конце имени не важен, поскольку мне удалось его получить.

Важно то, как шаблонировать значение параметра size.

Я попробовал с 2 циклами for, первый работает нормально (с индексом), но я не знаю, как заменить вторую переменную {{ index2}} в имени размера: size_{{ index2}}

Это моя попытка:

 {% for index in range(1, nb_of_servers   1) %}
{% for index2 in range(1, number_of_sizes   1) %}
  - name: "NB-{{ index2 }}-0{{ index }}"
    size: "{{ size_{{ index2 }} }}"
{% endfor %}
{% endfor %}
 

Комментарии:

1. Вы не можете вложить маркеры jinja2. Более того, поскольку вы ищете переменную «верхнего уровня» динамически, вам придется использовать vars lookup => `size: «{{ lookup(‘vars’, ‘size_’ index2) }}»

Ответ №1:

Проблема, похоже, в том, что вы заключили size_ внутри маркеров шаблонов Jinja {{ .

Как вам кажется, требуется только size_1 , size_2 , и т.д. Простое изменение, подобное приведенному ниже, должно сделать:

 {% for index in range(1, num_servers 1) %}
{% for index2 in range(1, num_sizes 1) %}
  - name: "NB-{{ index2 }}-0{{ index }}"
    size: "size_{{ index2 }}"
{% endfor %}
{% endfor %}
 

Комментарии:

1. Но если я передам значение, подобное этому, size_{{ index2}}, то конечным значением параметра «size» не будет size: size_1, хотя на самом деле я хочу, чтобы size был целочисленным значением, например size: 1, size: 2

2. Тогда этого было бы size: {{ index2 }} недостаточно?

3. Нет, потому что размер будет другим, например 100, 200. и index2 увеличится максимум до 4.