【问题标题】:How to copy files using Ansible from local to remote with regex?如何使用 Ansible 使用正则表达式将文件从本地复制到远程?
【发布时间】:2020-10-05 13:48:51
【问题描述】:

我需要将文件从本地服务器(ansible 主机)复制到远程机器。但需要先用正则表达式过滤它。 我尝试使用 with_items 来执行此操作,但似乎它仅在远程计算机上执行命令。 我也尝试使用 with_fileglob 来做到这一点,但似乎它不理解正则表达式。 怎么可能做到这一点?

我试过这样:

 - name: Prepare list of packages to copy
    find:
      paths: "/srv/test_files/"
      patterns: '(^((?!.*dbg).)*arm64.*$)'
      use_regex: yes
    register: file_list

  - name: Copying deb packaged to {{deb_path}} on a remote host
    copy:
      src: "{{item.path}}"
      dest: "/srv/tmp/"
    with_items:
      - "{{file_list.files}}"

在这种情况下,ansible 会尝试从远程复制准备好的列表,而不是从本地机器。

【问题讨论】:

  • 欢迎来到 SO。请更新问题并在regexwith_* 周围显示一些无效的代码。请参阅how to ask
  • 您是要在 Ansible 控制机器上还是在目标上查找文件列表?
  • 需要在 Ansible 控制机器(挂载的 NAS)上找到列表并将该列表复制到远程。我用正则表达式过滤文件,因为没有找到其他合适的方法。
  • 那么find应该使用delegate_to: localhost在Ansible控制机器上运行。
  • 天啊。你真棒。请将此作为答案发布,我会将其标记为正确答案。非常感谢!

标签: regex ansible


【解决方案1】:

在这种情况下,ansible 会尝试从远程复制准备好的列表,而不是从本地机器。

这是因为find操作也在运行目标节点。由于文件在 Ansible 控制机器上,find 应该在同一机器上运行。

您的find 任务中的一个小改动应该可以解决这个问题:

 - name: Prepare list of packages to copy
    find:
      paths: "/srv/test_files/"
      patterns: '(^((?!.*dbg).)*arm64.*$)'
      use_regex: yes
    register: file_list
    delegate_to: localhost       # search files on localhost instead of target

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2017-06-03
    • 2012-07-03
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    相关资源
    最近更新 更多