在复杂列表变量中使用模板

时间:2019-11-27 16:34:54

标签: ansible jinja2 ansible-template

我有一个如下所示的var文件,并且两个项目的工作方式不同:第一个被视为JSON对象,并且我可以访问其属性,例如{ "data": [ { "id": "112", "name": "john", "phone": "XXXXXXXXX" }, { "id": "213", "name": "mike", "phone": "XXXXXXXXX" }, { "id": "246", "name": "jess", "phone": "XXXXXXXXX" } ] } ,但事实并非如此第二个项目似乎是纯字符串。

如何以可以访问其属性的方式定义列表的第二个元素?

script.name

更多详细信息-我在这样的循环中使用列表:

---

file2: script2.j2

scripts_list:
  - { name: script1, file: script1.j2 }
  - "{ name: script2, file: {{ file2 }} }"

列表中的第一项工作正常,但是第二项在访问其# main.yml - include_tasks: script.yml loop: "{{ scripts_list }}" loop_control: loop_var: script # script.yml - debug: msg: "loop variable = {{ script }}" - debug: msg: "loop variable name = {{ script.name }}" 属性时返回错误。

输出似乎显示出第一项被视为JSON结构,而第二项只是一个纯字符串:

name

1 个答案:

答案 0 :(得分:1)

  

如何以可以访问其属性的方式定义列表的第二个元素?

好吧,IMO是解决此问题的最佳方法,因为您要在yaml文件中定义脚本信息,就是对所有脚本都使用yaml定义,并使用jinja2模板适当地引用元素。

scripts_list:
  - name: script1
    file: script1.j2
  - name: script2
    file: "{{ file2 }}"

如果出于某种原因您想要保留jsonish定义,则以下内容应可按预期工作:

scripts_list:
  - { name: script1, file: script1.j2 }
  - { name: script2, file: "{{ file2 }}" }