如何用Groovy脚本在Jenkins流水线中读取Ansible主机清单
Jenkins流水线读取Ansible主机清单实现方案
核心实现思路
替换硬编码的主机列表,改为从指定路径ansible/inventories/preprod/hosts的Ansible主机清单中动态读取主机名,核心步骤为拉取Ansible仓库、解析清单文件、提取主机列表并在流水线中复用。
完整Groovy示例脚本
pipeline { agent any stages { stage('拉取Ansible配置仓库') { steps { git url: '你的Ansible仓库地址', branch: 'main' } } stage('解析Ansible主机清单') { steps { script { def inventoryPath = 'ansible/inventories/preprod/hosts' def inventoryFile = new File(inventoryPath) def hostList = [] // 解析INI格式的主机清单 inventoryFile.eachLine { line -> // 跳过注释、空行、组定义行 def trimmedLine = line.trim() if (trimmedLine && !trimmedLine.startsWith('#') && !trimmedLine.startsWith('[')) { // 提取主机名(忽略主机后的变量配置,比如ansible_host=xxx) def host = trimmedLine.split()[0] hostList.add(host) } } // 去重并输出验证 hostList = hostList.unique() echo "提取到的目标主机: ${hostList}" // 把主机列表存入环境变量,供后续阶段调用 env.TARGET_HOSTS = hostList.join(',') } } } stage('批量执行目标任务') { steps { script { def hosts = env.TARGET_HOSTS.split(',') hosts.each { host -> echo "开始处理主机: ${host}" // 替换为你的实际任务逻辑,比如调用Ansible Playbook // sh "ansible-playbook -i ansible/inventories/preprod/hosts playbooks/deploy.yml --limit ${host}" } } } } } }
关键细节说明
- 适配YAML格式清单:如果你的清单是YAML格式,替换解析逻辑为Groovy的
YamlSlurper,示例代码片段:def yaml = new groovy.yaml.YamlSlurper().parse(inventoryFile) hostList = yaml.all_hosts ?: yaml.children.keySet() // 根据你的YAML结构调整 - 权限检查:确保Jenkins运行用户有读取该清单文件的权限,避免出现
Permission Denied错误 - 去重处理:避免清单中重复出现的主机被多次执行任务
- 变量传递:通过
env.TARGET_HOSTS将主机列表传递到后续阶段,支持跨stage复用
参考学习资源
- 《Jenkins权威指南》:涵盖流水线脚本编写、外部文件读取、变量管理等核心内容
- Ansible官方文档:详细说明主机清单的INI/YAML格式规范,帮助你适配不同的清单解析逻辑
- Jenkins内置示例库:在Jenkins控制台的"流水线示例"中,可找到文件读取、动态变量处理的实操案例
内容的提问来源于stack exchange,提问作者Vitaliy
相关产品推荐
相关产品推荐

