我正在尝试使用 Groovy 脚本创建 Jenkins 管道来调用 Ansible 剧本。我需要将几个变量和值对传递给 ansible 剧本。我使用一个函数来调用剧本,Groovy 看起来像这样:
void RunAnsiblePlaybook(String playbookPath, String playbookParam = '') {
for (item in playbookParam) {
extras += " -e ${item}"
}
ansiblePlaybook become: true,
colorized: true,
extras: extras,
installation: 'ansible',
vaultCredentialsId: 'AnsibleVaultPassword',
playbook: playbookPath
}
pipeline {
agent any
stage('Get prod copy') {
steps {
script {
RunAnsiblePlaybook("",
"jenkins/ansible_playbooks/try.yml",
"['source_instance=${env.SOURCE_INSTANCE}','source_instance=${env.TARGET_INSTANCE}','specific_snapshot_name=${A_SPECIFIC_SNAPSHOT_NAME}']")
}
变量
SOURCE_INSTANCE
、TARGET_INSTANCE
和 A_SPECIFIC_SNAPSHOT_NAME
在管道中定义。
我希望 RunAnsiblePlaybook 函数将
-e source_instance=apple -e source_instance=orange -e specific_snapshot_name=berry
传递给剧本,但相反,这是我从输出中看到的:
11:58:18 [test_grovvy_script] $ ansible-playbook _new/google/ansible/ansible-root/playbooks/utility/prodcopy/dry.yml -b --become-user root --vault-password-file /var/lib/jenkins/workspace/_migration_jobs/test_ppc/vault6368263148356134694.password --private-key=**** -vvv
-e [ -e " -e s -e o -e u -e r -e c -e e -e _ -e i -e n -e s -e t -e a -e n -e c -e e -e = -e a -e p -e p -e l -e e " -e , -e " -e t -e a -e r -e g -e e -e t -e _ -e i -e n -e s -e t -e a -e n -e c -e e -e = -e o -e r -e a -e n -e g -e e ............]
它将每个字母作为一个项目拾取。
我怎样才能接载
-e source_instance=apple -e source_instance=orange -e specific_snapshot_name=berry
?
谢谢, 菲利普
这看起来符合预期,因为您的
playbookParam
是 String
。由于它是 Groovy,我认为您实际上可以省略类型,或者使用 List
。
但一般来说,我建议不要使用 Groovy 包装器,并建议使用
sh
管道步骤、inventories 和 Ansible 环境变量(只要可能)以降低复杂性并保持执行字符串尽可能短且易于理解。您还可以从文件中传递额外的变量,或使用env
查找从环境变量中获取变量值。