【问题标题】:How to use wildcard paths with Ansible `find` module?如何在 Ansible `find` 模块中使用通配符路径?
【发布时间】:2019-01-20 16:03:22
【问题描述】:

我正在尝试使用 Ansible playbook 从远程主机上的多个目录中删除剩余文件

/some_dir
├── dir_1
│   └── file_A
├── dir_2
│   └── file_B
└── dir_3
    └── file_C

例如,如果我使用 shell 脚本,我会使用像 rm -rf /some_dir/dir_*/file_* 这样的简单 glob,它已经足够具体了。不过,我想坚持最佳 Ansible 实践™,所以我决定结合使用 findfile 模块。

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

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

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

注意事项:

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

【问题讨论】:

    标签: ansible find wildcard glob


    【解决方案1】:

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

    【讨论】:

    • 但是 fileglob 在本地主机上扩展,而我需要在远程主机上进行。
    • 啊,好吧,我错过了。据我所知,您将不得不完成两项任务或使用command
    • 编辑了我的答案。
    • 谢谢,但正如我在我的 Notes 的 p.2 中提到的,这对我来说太过分了。正如规则 34 所述,“您不应解析 ls 输出
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多