Ansible通过文件名列表删除thumbor缓存文件失败问题排查
问题:Ansible清理Thumbor缓存指定文件失败
已获取待删除文件的SHA1哈希文件名列表,执行下方Ansible任务后,任务标记为已变更,但实际文件未被删除。这些文件位于两层子目录下,请问该shell脚本是否存在问题?
原Ansible任务
shell: find . -name {{ item }} -exec rm \"{}\" \\; args: chdir: \"{{ thumbor_data_path }}\" ignore_errors: true loop: - deletion_hash when: file_url is defined and deletion_hash | length > 0
deletion_hash列表示例
"msg": [ "115b744b9f6b23bbad3b6181c858cb953136", "f52f17b2cca937e5586751ff2e938979890b", "1c39661a0925b3cdb3b524983aaf6cccd6ee", "1afc79a9e0e3c07ff0e95e1af3b5cb7ae54c", "424e9159fe652f47c8e01d0aa85a86fbefed", "11e4994789f24537d6feea085d2bf39c355b", "a1d2fe0e122d37555df4062d4c0a5d10b651", "aef976fc897a87091be5a8d5a11698e19591", "e79f3ee1e6ccb3caff288b0028e031d75d77", "9448e5e49679c908263922debdffff68eecb", "a3933be52277a341906751c3da2dfb07ccd8", "bef3370862a7504f7857be396d5a3139f5c0", "8cc0cbe847234af96c0463d49c258c85d50f", "1e7bf6110dcf994d1270682939e14416fc6e", "d21dae2c047895129e7c462f6ddc4e512a58", "c107b29b3185171ec46b479352fab6c97ad2" ]
问题分析与修正
核心问题
- 循环遍历错误:原任务
loop中写- deletion_hash,只会循环一次,遍历的是字符串deletion_hash而非列表中的每个哈希值,相当于执行find . -name deletion_hash ...,自然找不到目标文件。 - 命令引号与转义问题:
{{ item }}未加引号,且-exec rm的转义写法在Ansible shell模块中可能被解析错误,导致实际执行命令不符合预期。 - 命令效率问题:
find ... -exec rm不如直接用find ... -delete简洁高效,还能避免转义麻烦。
修正后的Ansible任务
shell: find . -name "{{ item }}" -delete args: chdir: "{{ thumbor_data_path }}" ignore_errors: true loop: "{{ deletion_hash }}" when: file_url is defined and deletion_hash | length > 0
补充说明
原任务标记为“已变更”是因为find命令即使没找到文件,退出码也是0,Ansible会判定命令执行成功,因此标记任务有变更,但实际未删除任何文件。修正后,循环会遍历每个哈希值,find找到对应文件后直接删除,确保操作生效。
内容的提问来源于stack exchange,提问作者Shuy
相关产品推荐
相关产品推荐

