在复杂列表变量中使用模板
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 }}" }
我有一个如下所示的 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 }}" }