You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible Copy命令使用远程主机通配符失效问题求助

解决Ansible Copy模块使用通配符目标路径失败的问题

你的问题出在Ansible的copy模块不支持在dest参数中直接使用通配符。当你把dest设为~/JEE/ABC/config_files/ABC-FULL/ABC*_1_DRF221时,Ansible会把这个带通配符的字符串当作一个固定的目录名去解析,而不是去匹配符合模式的目录,自然就找不到对应的路径,抛出"Not a directory"的错误了。

下面给你两种可行的解决方案:

方案一:先定位目标目录再复制(推荐)

用find模块先找出所有符合通配符模式的目标目录,再通过循环逐个复制文件过去,这种方式更稳妥,支持匹配多个目录的场景:

- name: 查找匹配通配符的目标目录
  find:
    paths: ~/JEE/ABC/config_files/ABC-FULL/
    patterns: "ABC*_1_DRF221"
    file_type: directory
  register: target_dirs

- name: 复制增量更新文件到所有匹配的ABC目录
  copy:
    src: /opt/SP/users/runner/DEV/ABC/DRF221/DELTA_UPDATE/
    dest: "{{ item.path }}/"
    mode: preserve
  loop: "{{ target_dirs.files }}"
  tags:
    - storage

注意点:

  • dest参数末尾的/必须加上,这样Ansible才会把文件复制到目标目录内部,而不是尝试把源目录重命名为目标路径。
  • 如果远程主机上没有符合模式的目录,copy任务会被跳过,不会报错。

方案二:直接用shell/command模块调用系统cp命令

如果能确定只有一个目录匹配通配符模式,也可以直接用shell模块执行系统的cp命令(系统原生的cp支持通配符匹配):

- name: 使用cp命令复制增量更新文件
  shell: cp -rp /opt/SP/users/runner/DEV/ABC/DRF221/DELTA_UPDATE/* ~/JEE/ABC/config_files/ABC-FULL/ABC*_1_DRF221/
  tags:
    - storage

注意点:

  • cp命令的-r参数用于递归复制目录,-p用于保留权限(对应你原来的mode: preserve)。
  • 如果匹配到多个目录,这个命令会报错,所以只适合单一匹配的场景。

内容的提问来源于stack exchange,提问作者Anuj Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:27:29