首页 > 解决方案 > Ansible jinja2 将列表合并到单个列表

问题描述

我正在尝试迭代一个列表 ["abc","def","ghi"] & 每次迭代都会生成一个列表,我需要将其设置为 ansible 中的变量。

这是我当前的脚本:

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

它生成以下输出,它是一个字符串而不是一个列表我如何在 for 循环中附加到类似于 list += temp_list 的单个列表

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'}] "   }

标签: pythonlistfor-loopansiblejinja2

解决方案


它生成以下输出,它是一个字符串而不是一个列表

它是一个字符串有两个原因:首先,您" + "在表情中间嵌入了一些文本,其次是因为您打电话join(','),而 jinja 高兴地按照您的要求做。

如何在 for 循环中附加到类似于 list += temp_list 的单个列表

答案是完全按照你说的做,并使用一个中间变量:

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

AFAIK,您必须使用该.extend技巧,因为 aset tmp = tmp +将在循环内声明一个新tmp的,而不是分配tmp循环外


推荐阅读