You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:05:22