Ansible jinja2 объединение списков в один список - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь перебрать список ["abc", "def", "ghi"], и каждая итерация генерирует список, который мне нужен, чтобы установить его в переменную ansible.

вот мой текущий скрипт:

- name: add checks
  set_fact:
    CHECKS: "{% for cKey in checkKey %} {{ CHECKS|default([]) }} + {{ CHECKSMAP | map(attribute=cKey ) | list |join(',')}} {% endfor %}"

, который генерирует следующий вывод, который является строкой, а не списком. Как мне добавить один список, аналогичный списку + = temp_list в цикле for

ok: [127.0.0.1] => {
"msg": "System  [] + [{u'check': u'system_checks'}, {u'check': u'lms_server_health'}]  [] + [{u'check': u'system_checks'}, {u'check': u'config-service_server_health'}, {u'check': u'config-service_server_restart'}] "   }

1 Ответ

0 голосов
/ 03 ноября 2018

, который генерирует следующий вывод, который является строкой, а не списком

Это строка по двум причинам: во-первых, вы вставили бит " + " текста в середину вашего выражения, а во-вторых, потому что вы позвонили join(','), и Джинджа весело сделал, как вы просили.

как я могу добавить в один список, аналогичный списку + = temp_list в цикле for

Ответ - сделать так, как вы сказали, и использовать промежуточную переменную:

CHECKS: >-
  {%- set tmp = CHECKS | default([]) -%}
  {%- for cKey in checkKey -%}
  {%-   set _ = tmp.extend(CHECKSMAP | map(attribute=cKey ) | list) -%}
  {%- endfor -%}
  {{ tmp }}

AFAIK , вы должны использовать этот .extend трюк, потому что set tmp = tmp + объявит новый tmp внутри цикла, а не присваивает tmp вне цикла

...