ansible - 如何在 Ansible `find` 模块中使用通配符路径?
问题描述
我正在尝试使用 Ansible playbook从远程主机上的多个目录中删除剩余文件。
/some_dir
├── dir_1
│ └── file_A
├── dir_2
│ └── file_B
└── dir_3
└── file_C
例如,如果我使用 shell 脚本,我会使用简单的 glob like rm -rf /some_dir/dir_*/file_*
,它已经足够具体了。不过,我想坚持最好的 Ansible 实践™,所以我决定使用find
和file
模块的组合。
tasks:
- name: Find files to remove by patterns
find:
paths: "/some_dir/dir_*/"
patterns: "file_*"
但是,通配符似乎在find
's中不起作用paths
,它们被视为文字。
有没有办法解决这些限制?
笔记:
- 我知道我可以递归搜索
file_[A-Z]
,some_dir
但它可能会捕获/some_dir/very_important_stuff/file_0
(如果一切都失败,我将采用该解决方案) - 我可能可以使用 shell 命令或脚本在远程主机上使用 shell 扩展,然后解析其标准输出以获取文件列表,但这听起来像是一个容易出错的 hack
- 在这种特殊情况下,我可以运行两个
find
任务:查找所有dir_*
insome_dir
,然后将它们用作paths
查找file_*
s 的列表,但是由于此任务是更大的真实剧本的一部分,因此使用起来太复杂了在任意位置 (/some_dir/dir_*/other/cruft/subdirs/*.cache
)带有通配符的路径。
解决方案
直接使用ansible是不可能的。您必须使用以下shell
命令:
---
- name: TEST
hosts: host1
gather_facts: False
tasks:
- name: shell
shell: "ls -1 /some_dir/dir_*/*"
register: result
- name: debug
debug:
var: result.stdout
推荐阅读
- html - 滚动手势传递给正在滚动的元素下方的元素
- java - 如何将大型json数据发送到spring控制器
- angularjs - 使用 AngularJS 对 Dialogflow API v2 进行身份验证
- c# - 将 Window 的属性绑定到 DataGridCell 的 DataTrigger
- reactjs - 我们能像看到 Real DOM 一样看到 React 的虚拟 DOM 吗?
- azure-keyvault - 密钥保留 | 检索旧密钥
- laravel - 如何在 laravel 中使用 setOpion() 和 getOption() 方法?
- flutter - 找出 ListView 中的哪些项目是可见的
- c# - 如何使用 C# 表达式 API 使对象列表成为 Lamba 中的参数
- css - 如何去掉搜索栏上的“X”