在我的Ansible剧本中,我将此列表作为变量:
collections: [customers licenses system]
该列表用于多个地方
在一个地方,我需要复制包含我的数据的现有文件(customers.json
,licenses.json
,system.json
)。
这不起作用:
- copy: src="{{ item }}.json" dest=~/import/
with_items: "{{ collections }}"
它首先连接列表然后连接我的文件扩展名,所以它就像files/customers licenses system.json
。
这也不起作用:
- copy: src={{ item ~ ".json" }} dest=~/import/
with_items: "{{ collections }}"
在这种情况下,它忽略了文件扩展名,第一项看起来像files/customers
。
有没有办法可以让它在不重复变量或重命名文件的情况下工作?
答案 0 :(得分:3)
问题是这个当前定义的变量只是一个字符串,而不是3个项目的列表:
collections: [customers licenses system]
以下是一个快速举例说明:
- hosts: localhost
vars:
collections: [customers licenses system]
tasks:
- debug: var=item
with_items: collections
以上的输出是:
TASK: [debug var=item] ********************************************************
ok: [localhost] => (item=customers licenses system) => {
"item": "customers licenses system"
}
所以ansible将collections
视为一个列表,其中包含一个项目。定义列表的正确方法是:
collections: ['customers', 'licenses', 'system']
或者,您也可以这样定义:
collections:
- customers
- licenses
- system
当您将collections
更改为其中之一时,上述测试的输出将变为:
TASK: [debug var=item] ********************************************************
ok: [localhost] => (item=customers) => {
"item": "customers"
}
ok: [localhost] => (item=licenses) => {
"item": "licenses"
}
ok: [localhost] => (item=system) => {
"item": "system"
}
更改列表的定义方式,复制模块应该按照您的预期工作。