Ansible迭代条件为

时间:2018-02-06 15:57:56

标签: python configuration ansible devops

我已经使用ansible了很长一段时间,偶然发现了一个超出我谷歌搜索技巧的问题。我在这个片段中有一个vars结构:

artifacts:

  - name: demo
    version: v1

    templates:
      - source: "/opt/source/file.txt"
        destination: "/opt/destination/file.txt"

我现在想在下一个片段中迭代这个结构:

- name: "Archive files"
  synchronize:
    src: "{{ item.1.destination }}"
    dest: "/some/backup/dir/"
    archive: yes
  delegate_to: "{{ inventory_hostname }}"
  when: item[1].destination.isfile
  with_subelements:
    - "{{ artifacts }}"
    - templates

由于条件错误定义,它显然失败了:

  when: item[1].destination.isfile

我正在寻找最优雅的编写我的剧本的方法,以便检查文物中定义的文件是否正确。模板目标存在于文件系统中。我最初考虑使用stat模块并添加一个块,我将在其中迭代同一组子元素,但根据此链接,ansible目前不支持:https://github.com/ansible/ansible/issues/13262

2 个答案:

答案 0 :(得分:0)

不,这种when声明似乎不可能。它应该依赖已有的事实。

因此,您要么将其拆分为两个任务,例如stat + archive ...

如果您不关心丢失文件,只需添加--ignore-missing-args,例如:

- name: "Archive files"
  synchronize:
    src: "{{ item.1.destination }}"
    dest: "/some/backup/dir/"
    archive: yes
    rsync_opts: ['--ignore-missing-args']
  delegate_to: "{{ inventory_hostname }}"
  with_subelements:
    - "{{ artifacts }}"
    - templates

请注意,--ignore-missing-args中提供了3.06+

答案 1 :(得分:0)

根据康斯坦丁的建议,我最终将其分为两个任务:

- name: "Check if the file exists"
  stat:
    path: "{{ artifact.1.destination }}"
  register: stat_result

- name: "Archive files"
  synchronize:
    src: "{{ artifact.1.destination }}"
    dest: "/some/backup/dir/"
    archive: yes
  delegate_to: "{{ inventory_hostname }}"
  when: stat_result.stat.exists == True

archive.yml:

{{1}}