在我的playbook中,第一个任务会找到一些文件,如果发现它们在变量中注册,第二个任务将通过shell传递的命令删除文件,问题是第二个任务总是错误,即使变量{ {1}}设置为false。这是剧本:
cleanup
当cleanup设置为false时,将跳过第一个任务,但第二个错误显示为:tasks:
- name: Find tables
find:
paths: "{{ file path }}"
age: "1d"
recurse: yes
file_type: directory
when: cleanup
register: cleanup_files
- name: cleanup tables
shell: /bin/cleanup {{ item.path | basename }}
with_items: "{{ cleanup_files.files }} "
when: "cleanup or item is defined"
。
项目将被定义为上面没有运行的任务,所以它是否仍然不会跳过任务,因为"failed": true, "msg": "'dict object' has no attribute 'files'"}
设置为false?
我已经注意到如果我在第二个任务中将cleanup
更改为or
,它就可以完成任务。我不知道为什么。
答案 0 :(得分:1)
将剧本改为此代码(第二项任务中的更改),在代码之后您可以看到更改背后的逻辑:
tasks:
- name: Find tables
find:
paths: "/tmp"
age: "1000d"
recurse: yes
file_type: directory
when: cleanup
register: cleanup_files
- debug: var=cleanup_files
- name: cleanup tables
debug: msg="file= {{ item.path | basename }}"
when: "cleanup_files.files is defined"
with_items: "{{ cleanup_files.files }} "
当您使用cleanup=false
执行时,find
任务会将结果注册到cleanup_files
,但您会注意到它没有cleanup_files.files
属性。当您使用cleanup=true
执行时,您将获得cleanup_files.files
,如果找不到符合find
条件的文件,它将为空。
因此,第二项任务只需要知道cleanup_files.files
是否已定义。如果已定义,则可以继续运行。如果没有找到符合条件的文件,with_items
子句将正确处理它(没有文件=>没有迭代)。
我添加了debug
任务来检查cleanup_files
,您可以在以下情况下运行并查看其结构:
希望有所帮助
答案 1 :(得分:-1)
我认为您需要将第二个WHEN更改为
when: "cleanup and cleanup_files.files is defined"
您也可以考虑将cleanup
作为标记。