我已经使用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
答案 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}}