如何将变量作为凭据传入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凭据的方式解决:
- 在主流水线中,将获取到的凭据信息创建为临时Jenkins凭据,生成唯一ID
- 将临时凭据ID作为参数传入
trigger_job trigger_job的Ansible步骤直接使用该ID- 任务完成后删除临时凭据,避免遗留
修改后主流水线代码:
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
相关产品推荐
相关产品推荐

