如何将Jenkins多行文本参数正确传递给Ansible Playbook
解决方案
问题根因
你遇到的ansible-playbook -e devices=参数为空报错,是因为未做特殊处理的多行字符串被shell识别为多个独立参数,变量值被截断;同时模板写法错误导致最终生成的YAML格式不符合要求。
第一步:修正Jenkins侧参数拼接逻辑
对多行参数做单引号转义和包裹,避免shell解析异常:
// 转义参数内容中的单引号,避免shell语法错误 def escaped_devices = params.DEVICES.replace("'", "'\\''") // 用单引号包裹整个变量值,完整保留换行和列表格式 def extra_args = "-e 'devices=${escaped_devices}'" sh "ansible-playbook ${extra_args} deploy_lab.yml"
第二步:修正Jinja2模板
去掉变量外层的双引号,用缩进过滤器保证YAML层级正确,修改devices.j2内容为:
--- devices_from_jenkins_param: {{ devices | indent(4, first=False) }}
可选无转义传参方案(适合含大量特殊字符的场景)
如果参数中存在大量特殊字符,转义处理成本高,可以通过临时文件传递参数,完全规避shell解析问题:
- Jenkins侧写入参数到临时文件:
writeFile file: '.tmp_device_list.yml', text: params.DEVICES sh "ansible-playbook -e device_list_path=.tmp_device_list.yml deploy_lab.yml"
- Ansible模板直接读取文件内容生成配置:
--- devices_from_jenkins_param: {{ lookup('file', device_list_path) | indent(4, first=False) }}
内容的提问来源于stack exchange,提问作者average_coder25
相关产品推荐
相关产品推荐

