条件失败时的Ansible倍数

时间:2018-05-26 16:31:10

标签: ansible

在我的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,它就可以完成任务。我不知道为什么。

2 个答案:

答案 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. 清理=真
  2. 清理=假
  3. 希望有所帮助

答案 1 :(得分:-1)

我认为您需要将第二个WHEN更改为

when: "cleanup and cleanup_files.files is defined"

您也可以考虑将cleanup作为标记。