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

Using template in complex list variable

我有一个如下所示的 var 文件,这两个项目的工作方式不同:第一个被视为 JSON 对象,我可以访问它的属性,例如 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 }}"

列表中的第一项工作正常,但第二个 returns 在访问其 name 属性.

时出错

输出似乎表明第一项被视为 JSON 结构,而第二项只是一个普通字符串:

TASK [test : debug] ******************************************************************************************************************************************************************************************************************************
ok: [test] => {
    "msg": "loop variable = {u'name': u'script1', u'file': u'script1.j2'}"
}

TASK [test : debug] ******************************************************************************************************************************************************************************************************************************
ok: [test] => {
    "msg": "loop variable name = script1"
}

TASK [test : debug] ******************************************************************************************************************************************************************************************************************************
ok: [test] => {
    "msg": "loop variable = { name: script2, file: script2.j2 }"
}

TASK [test : debug] ******************************************************************************************************************************************************************************************************************************
fatal: [test]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'unicode object' has no attribute 'name'\n"}

How can I define the second element of the list in such a way that I can access its properties?

由于您在 yaml 文件中定义脚本信息,IMO 解决此问题的最佳方法是对所有脚本信息使用 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 }}" }