Azure DevOps Pipeline中Ansible路径解析问题求助
核心问题拆解
你在Azure DevOps Pipeline中用Ansible向VM部署配置时,遇到copy模块报错源路径不存在的问题,同时对copy模块的路径机制存在疑惑——明明copy的src应该指向构建代理(控制节点)的本地路径,但用shell模块看到的是远程主机的目录,这其实是两类模块的执行上下文差异导致的。
先明确Ansible copy模块的工作逻辑
ansible.builtin.copy的src参数**永远指向控制节点(这里就是Azure DevOps的构建代理机器)**的本地路径,和远程目标主机的文件系统无关。而ansible.builtin.shell是在远程主机上执行命令,所以返回的pwd是远程主机的目录,这是完全正常的,两者的执行环境不一样。
报错原因及解决步骤
报错Source /__w/1238/s/monitoring/config/ not found,说明构建代理机器上这个路径要么不存在,要么权限不足,按以下步骤排查:
1. 先验证构建代理上的源路径
在Azure DevOps的bash任务中,执行ansible-playbook之前,先加两行验证命令:
echo "当前构建代理的源码目录:$(Build.SourcesDirectory)" ls -la $(Build.SourcesDirectory)/monitoring/config/
确认这个路径存在,且目录下有需要复制的文件,同时当前执行任务的账号有读取权限。
2. 确认变量传递正确
执行ansible-playbook时,要确保变量azdo_workspace正确传递,命令格式应为:
ansible-playbook 你的主剧本文件名.yml -e "azdo_workspace=$(Build.SourcesDirectory)"
如果变量传递错误,{{ azdo_workspace }}会指向错误的路径,导致找不到源文件。
3. 修正copy任务的配置
确保角色中的copy任务配置正确,注意目录复制的细节:
- name: 复制Prometheus配置文件到远程VM ansible.builtin.copy: src: "{{ azdo_workspace }}/monitoring/config/" dest: "/opt/buka2/prometheus/config/" owner: root group: root mode: '0644' directory_mode: '0755'
- 如果
src末尾加了/,会把config目录下的所有内容复制到dest指定的目录中; - 如果
src末尾不加/,会把整个config目录复制到dest目录下(最终路径会变成/opt/buka2/prometheus/config/config/),根据你的需求调整。
额外验证技巧
如果还是有问题,可以在Ansible任务中添加debug模块,确认变量值是否正确:
- name: 打印azdo_workspace变量值 ansible.builtin.debug: var: azdo_workspace
执行后查看输出,确认变量指向的路径和构建代理上的实际路径一致。
内容的提问来源于stack exchange,提问作者Verthais

