如果存在,则从Ansible Playbook中删除不起作用

7

我是一名 Ansible 新手,在我的一个 playbook 中遇到了以下问题:

Ansible playbook 任务代码:

- name: Delete existing dist folder
  shell: "[ -d {{ base_path }}/dist ] && rm -rf {{ base_path }}/dist"

输出:

fatal: [masked.amazonaws.com]: FAILED! => {
"changed": true,
"cmd": "[ -d /home/centos/masked/masked/dist ] && rm -rf /home/centos/masked/masked/dist",
"delta": "0:00:00.098034",
"end": "2018-09-26 20:26:06.940872",
"invocation": {
    "module_args": {
        "_raw_params": "[ -d /home/centos/masked/masked/dist ] && rm -rf /home/centos/masked/masked/dist",
        "_uses_shell": true,
        "argv": null,
        "chdir": null,
        "creates": null,
        "executable": null,
        "removes": null,
        "stdin": null,
        "warn": true
    }
},
"msg": "non-zero return code",
"rc": 1,
"start": "2018-09-26 20:26:06.842838",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []

如果我手动运行这个命令,它可以正常工作。

[ -d /home/centos/masked/masked/dist ] && rm -rf 
/home/centos/masked/masked/dist

有没有人知道可能出了什么问题?

非常感谢你们的回复。

提前致谢。


正如Elliot所指出的,你的返回代码是问题所在。但是为什么要检查目录是否存在呢?如果它不是一个目录,你还会删除它吗? - Jack
2个回答

17
使用 file 模块来删除目录,而不是使用 shell
- name: Delete existing dist folder
  file:
    path: "{{ base_path }}/dist"
    state: absent
根据文档,它与rm -rf非常接近:

如果设置为absent,目录将被递归删除,并且文件或符号链接将被取消链接。请注意,如果路径不存在,则absent不会导致文件执行失败,因为状态未更改。


太棒了。我不知道为什么没有使用文件,而是被 shell 命令的方法所困扰。这个方法可以运行,并且是使用 Ansible 更好的方式。感谢 sduthil。 - Banyanbat

2

非零返回码

如果使用[ -d {{ base_path }}/dist ]时左侧计算结果为假,则会返回一个非零代码。请改用三行形式。或编写一个shell脚本并调用它。

if [ -d {{ base_path }}/dist ]; then
    rm -rf {{ base_path }}/dist
fi

我尝试了,是的,shell脚本也可以工作。但在Ansible中,这三行语法似乎不能很好地工作。但最终,sduthil建议的方法更好,因为它使用ansible,导致少维护一个文件和处理少一个错误情况,因为ansible不会因为缺少目录而失败。无论如何,谢谢Elliott。 - Banyanbat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接