如何从复制模块上的列表项中汇编文件名?

时间:2015-05-27 13:52:02

标签: ansible ansible-playbook

在我的Ansible剧本中,我将此列表作为变量:

 collections: [customers licenses system]

该列表用于多个地方 在一个地方,我需要复制包含我的数据的现有文件(customers.jsonlicenses.jsonsystem.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

有没有办法可以让它在不重复变量或重命名文件的情况下工作?

1 个答案:

答案 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"
}

更改列表的定义方式,复制模块应该按照您的预期工作。