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

Ansible变量相对路径访问Docker目录失败问题求助

问题分析与解决

核心问题

报错的本质是错误使用了remote_src: yes参数:
当设置remote_src: yes时,Ansible会认定你指定的src路径位于**远程目标主机(如azure)**上,但你的docker文件夹实际存放在Semaphore运行的控制节点(本地仓库)中,远程主机根本不存在/tmp/semaphore/repository_1_14/playbooks/../docker/watchtower这个路径,因此触发文件不存在的报错。

解决步骤

1. 移除remote_src: yes参数

所有从控制节点复制文件到远程主机的copy任务,都不需要该参数——Ansible默认就是从控制节点读取源文件。修正后的关键任务如下:

- name: Copy Docker Compose directories to vps hosts
  copy:
    src: "{{ playbook_dir }}/../docker/{{ item }}"
    dest: "/opt/stacks/"
  with_items:
    - watchtower
    - dockerproxy
    - portainer-agent
  when: 'vps' in group_names

- name: Copy uptime-kuma directory to oracle
  copy:
    src: "{{ playbook_dir }}/../docker/uptime-kuma"
    dest: "/opt/stacks/"
  when: inventory_hostname == 'oracle'

2. 修复未定义的stack_dirs变量

原Playbook中第二个copy任务引用了{{ stack_dirs.results }},但未提前注册该变量。需先添加stat任务检查本地路径状态,再执行后续逻辑:

- name: Check local Docker stack directories exist
  stat:
    path: "{{ playbook_dir }}/../docker/{{ item }}"
  with_items:
    - watchtower
    - dockerproxy
    - portainer-agent
  register: stack_dirs
  when: 'vps' in group_names

- name: Copy missing Docker Compose directories to vps hosts
  copy:
    src: "{{ playbook_dir }}/../docker/{{ item.item }}"
    dest: "/opt/stacks/"
  with_items: "{{ stack_dirs.results }}"
  when: item.stat.exists == false and 'vps' in group_names

注:若你的实际需求是本地路径存在时才复制,请将when条件改为item.stat.exists == true。

3. 验证路径正确性

可在Playbook开头添加debug任务,确认playbook_dir解析的路径是否符合预期:

- name: Show playbook directory path
  debug:
    msg: "Playbook dir: {{ playbook_dir }}"

执行后查看输出,确认{{ playbook_dir }}/../docker确实指向Git仓库根目录下的docker文件夹。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:26:04