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

如何将变量作为凭据传入Jenkins调用Ansible Playbook构建步骤

问题描述

需求

我在Jenkins流水线脚本中从外部源获取带轮换密码的SSH凭据并存入变量,随后尝试在同一流水线中触发另一个参数化任务,将该凭据变量传入,但不知如何将此输入参数变量用作Invoke Ansible Playbook构建步骤的SSH凭据——因为该步骤仅识别已存在的Jenkins凭据ID。

当前代码

pipeline {
    agent any
    stages {
        stage('Trigger Cyberark Job') {
            steps {
                script {
                    def job1= build propagate: false, job: 'fetch_credential'
                    cred = job1.getBuildVariables()
                    def job2= build propagate: false, job: 'trigger_job', parameters: [string(name: 'INPUT', value: cred)]

核心问题

无法在trigger_job的Invoke Ansible Playbook构建步骤中使用变量cred作为SSH凭据,该如何处理?


解决方案

方法一:临时创建Jenkins凭据(适配插件步骤)

由于Invoke Ansible Playbook插件仅支持选择已存在的Jenkins凭据ID,可通过临时创建SSH凭据的方式解决:

  1. 在主流水线中,将获取到的凭据信息创建为临时Jenkins凭据,生成唯一ID
  2. 将临时凭据ID作为参数传入trigger_job
  3. trigger_job的Ansible步骤直接使用该ID
  4. 任务完成后删除临时凭据,避免遗留

修改后主流水线代码:

pipeline {
    agent any
    stages {
        stage('Trigger Cyberark Job') {
            steps {
                script {
                    def job1 = build propagate: false, job: 'fetch_credential'
                    def credVars = job1.getBuildVariables()
                    // 生成唯一临时凭据ID
                    def tempCredId = "temp-ssh-${UUID.randomUUID()}"

                    // 创建临时用户名密码型SSH凭据(如果是私钥凭据,替换为对应类)
                    def tempCredential = new com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl(
                        com.cloudbees.plugins.credentials.CredentialsScope.GLOBAL,
                        tempCredId,
                        "临时自动生成SSH凭据",
                        credVars.username, // 替换为实际用户名字段名
                        credVars.password  // 替换为实际密码字段名
                    )

                    // 将凭据添加到Jenkins系统存储
                    def systemCredStore = Jenkins.instance.getExtensionList(com.cloudbees.plugins.credentials.SystemCredentialsProvider.class)[0].getStore()
                    systemCredStore.addCredentials(com.cloudbees.plugins.credentials.domains.Domain.global(), tempCredential)

                    // 触发子任务,传入临时凭据ID
                    def job2 = build propagate: true, job: 'trigger_job', parameters: [
                        string(name: 'TEMP_SSH_CRED_ID', value: tempCredId)
                    ]

                    // 子任务完成后删除临时凭据
                    systemCredStore.removeCredentials(com.cloudbees.plugins.credentials.domains.Domain.global(), tempCredential)
                }
            }
        }
    }
}

在trigger_job的Invoke Ansible Playbook步骤中,将SSH凭据选项设置为${TEMP_SSH_CRED_ID}即可。

注意:需确保流水线执行用户拥有Jenkins凭据管理权限(如Credentials/Create、Credentials/Delete)。


方法二:直接调用Ansible命令(绕过插件限制)

如果不想依赖Jenkins凭据存储,可修改trigger_job,跳过Invoke Ansible Playbook插件,直接用Shell命令执行Playbook,将凭据变量直接传入:

trigger_job流水线代码示例:

pipeline {
    agent any
    parameters {
        string(name: 'INPUT', description: '包含SSH用户名和密码的变量')
    }
    stages {
        stage('Execute Ansible Playbook') {
            steps {
                script {
                    // 解析传入的凭据变量(假设为JSON格式,根据实际结构调整)
                    def cred = readJSON text: params.INPUT
                    // 直接执行ansible-playbook,传入凭据信息
                    sh """
                        ansible-playbook your-playbook.yml \
                            --user ${cred.username} \
                            --extra-vars "ansible_ssh_pass=${cred.password}"
                    """
                }
            }
        }
    }
    // 可选:使用maskPasswords插件隐藏控制台输出的密码
    post {
        always {
            maskPasswords(varPasswordPairs: [[password: cred.password]])
        }
    }
}

这种方式无需创建临时凭据,直接将轮换后的密码传给Ansible,更适配动态密码场景,但需注意控制台日志的密码掩码,避免泄露。


内容的提问来源于stack exchange,提问作者gjvignesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:12:11