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
相关产品推荐
相关产品推荐

