我试图使用Ansible将一些jinja2模板放到目录中,例如npm run <script name>
。
在我的path/from/*.j2 to path/to/*.txt
中:
./defaults/main.yml
在我的---
test_var:
- a: 1
b: 2
- a: 10
b: 20
中:
./tasks/main.yml
在我的---
- name: "Copy file"
include: copy-files.yml
with_nested:
- test_var
loop_control:
loop_var: test_loop
中:
./tasks/copy-files.yml
我遇到以下错误:
---
- name: "copy {{ test_loop }}"
template:
src: "{{ test_loop.0.a }}"
dest: "{{ test_loop.0.b }}"
然后我使用调试,发现变量丢失了。
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'unicode object' has no attribute 'b'"}
那么这里可能出什么问题了?
task path: ./tasks/main.yml
Wednesday 06 February 2019 01:15:10 +0000 (0:00:00.286) 0:00:04.308 ****
ok: [localhost] => {
"msg": [
{
"a": 1,
"b": 2
},
{
"a": 10,
"b": 20
}
]
}
TASK [./ : Copy files] ********
task path: ./tasks/main.yml
Wednesday 06 February 2019 01:15:11 +0000 (0:00:00.064) 0:00:04.373 ****
TASK [./ : debug] *******************************
task path: ./tasks/copy-files.yml
Wednesday 06 February 2019 01:15:11 +0000 (0:00:00.089) 0:00:04.463 ****
ok: [localhost] => {
"msg": [
"a",
"b"
]
}
答案 0 :(得分:1)
那么这里可能出什么问题了?
有些事情在起作用。
首先,您缺少with_nested:
的Jinja替换;我不知道您为什么还会得到“ a”和“ b”,因为很显然这是您喂给list
的{{1}}中的str
。我相信您想要with_nested:
。 Ansible可能是“帮助”您的,因为您使用的是令人难以置信的,令人不安的古老版本,但是现代版本不会自动将其强制转换为变量,因此请注意。 / p>
但是,即使解决该问题也无法解决您的问题,因为with_nested: "{{ test_var }}"
想要with_nested:
的{{1}},而不是list
的{{1}};从the fine manual中可以看出,它实际上是在调用list
的{{1}},而list
的{{1}}是其{{ 1}},说明您看到的“ a”和“ b”
如果您想让dict
和{{ with_nested[0] | product(with_nested[1]) }}
分别是dict
和list
键的值,则跳过假装并构造tuple
方式:
.keys()