Ansible jinja2将列表合并到单个列表

时间:2018-11-02 07:56:41

标签: python list for-loop 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'}] "   }

1 个答案:

答案 0 :(得分:0)

  

生成以下输出,该输出是字符串而不是列表

这是一个字符串,有两个原因:首先,您在表达式中间嵌入了" + "位文本,其次是因为您打电话给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技巧,因为set tmp = tmp +将在循环内声明一个新的tmp,而不是在外部分配tmp循环