首页 > 解决方案 > 如何在 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 实践™,所以我决定使用findfile模块的组合。

tasks:
  - name: Find files to remove by patterns
    find:
      paths: "/some_dir/dir_*/"
      patterns: "file_*"

但是,通配符似乎在find's中不起作用paths,它们被视为文字。

有没有办法解决这些限制?

笔记:

  1. 我知道我可以递归搜索file_[A-Z]some_dir但它可能会捕获/some_dir/very_important_stuff/file_0(如果一切都失败,我将采用该解决方案)
  2. 我可能可以使用 shell 命令或脚本在远程主机上使用 shell 扩展,然后解析其标准输出以获取文件列表,但这听起来像是一个容易出错的 hack
  3. 在这种特殊情况下,我可以运行两个find任务:查找所有dir_*in some_dir,然后将它们用作paths查找file_*s 的列表,但是由于此任务是更大的真实剧本的一部分,因此使用起来太复杂了在任意位置 ( /some_dir/dir_*/other/cruft/subdirs/*.cache)带有通配符的路径。

标签: ansiblefindwildcardglob

解决方案


直接使用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

推荐阅读