Jenkins Pipeline运行Ansible playbook时include_vars加载变量失败求助
问题根因
你观察到的sh步骤输出的工作目录正确,但Ansible执行时PWD取值错误,是因为Jenkins的Ansible插件启动ansible-playbook进程时,不会继承Pipeline中sh步骤的环境变量上下文,此时lookup('env','PWD')读取到的是Jenkins Agent进程本身的工作目录/data/jenkins_agent,而非当前任务的工作空间目录。
解决方案(按优先度排序)
- 方案1:使用Ansible内置变量(最稳定,无环境依赖)
Ansible自带playbook_dir内置变量,固定指向当前运行的playbook文件所在的目录,无需依赖外部环境变量。修改你的playbook中include_vars的配置即可:
- name: "Include files" include_vars: file: "{{ playbook_dir }}/../inventory/deploiements/vars"
该方案本地手动执行和Jenkins执行均可正常生效,不需要修改Jenkins Pipeline配置。
- 方案2:使用sh步骤直接执行ansible命令
如果你不想修改playbook,可以直接替换Jenkins Pipeline中的ansiblePlaybook插件调用为sh步骤执行,sh步骤会完整继承任务的工作目录环境变量,原playbook的PWD读取逻辑可以正常运行:
pipeline { agent any stages { stage('test') { steps { sh 'pwd' sh 'ansible-playbook playbooks/test.yml -vvv' } } } }
- 方案3:显式传入工作空间变量
如果要保留Ansible插件的使用,也可以在调用插件时显式把Jenkins的内置WORKSPACE环境变量作为参数传入playbook:
修改Pipeline配置:
ansiblePlaybook playbook: 'playbooks/test.yml', extras: '-vvv', extraVars: [jenkins_workspace: env.WORKSPACE]
再修改playbook的变量引入路径:
file: "{{ jenkins_workspace }}/inventory/deploiements/vars"
内容的提问来源于stack exchange,提问作者Wrest
相关产品推荐
相关产品推荐

