我试图使用Ansible将一些jinja2模板放入目录,例如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"
]
}
那么这里可能出了什么问题呢?ansible 2.1.0.0
那么这里可能出了什么问题?
有一些事情在起作用。
最重要的是,你错过了with_nested:
的金贾替代品;我根本不知道你为什么会得到"a"one_answers"b",因为这显然是你给with_nested:
的str
中的list
。我相信你想要with_nested: "{{ test_var }}"
。ansible可能"帮助"了你,因为你使用的是令人难以置信、令人不安的古代版本的ansible,但现代版本不会自动将该名称强制转换为变量,所以要注意。
然而,即使修复它也不能解决您的问题,因为with_nested:
想要list
的list
,而不是dict
的list
;正如你从精细手册中看到的,它实际上是在调用{{ with_nested[0] | product(with_nested[1]) }}
,而dict
的乘积是.keys()
的tuple
的list
,这解释了你看到的的"a"one_answers"b">
如果您希望src
和dest
分别是a
和b
密钥的值,那么跳过伪装并以这种方式构造with_nested:
:
with_nested:
- '{{ test_var | map(attribute="a") | list }}'
- '{{ test_var | map(attribute="b") | list }}'