无法将变量从 Jenkins 管道的脚本部分传递到 Ansible 剧本
Not able to pass variables from Jenkins pipeline's script part to Ansible playbook
我在将变量从 Jenkins 管道部分传递到 Ansible 剧本时遇到问题。
我在管道中的变量:
pipeline {
agent {
label agentLabel
}
parameters {
string(
defaultValue: 'build/promo-api.zip',
description: 'name and path of the artifact',
name: 'ARTIFACT_ZIP')
string(
defaultValue: 'qa-promoapi-mbo.example.com',
description: 'name and path of the vhost QA',
name: 'QA_NGINX_VHOST')
}
stages {
[...]
stage ('Deploy') {
steps {
script {
if (env.DEPLOY_ENV == 'staging') {
echo 'Run LUX-staging build'
def ENV_SERVER = '192.168.1.30'
def UML_SUFFIX = 'stage-mon'
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
echo 'Run STAGE SG deploy'
ENV_SERVER = 'stage-sg-mbo-api.example.com'
UML_SUFFIX = 'stage-sg'
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
} else {
echo 'Run QA build'
def ENV_SERVER = '192.168.1.28'
def UML_SUFFIX = 'qa'
sh "ansible-playbook nginx-depl.yml --limit 127.0.0.1"
}
}
}
}
}
使用此命令,我可以在参数部分定义的 Ansible 范围变量中看到 - ARTIFACT_ZIP 和 QA_NGINX_VHOST:
tasks:
- name: "Ansible | List all known variables and facts"
debug:
var: hostvars[inventory_hostname]
问题是我无法从脚本部分传递变量 - ENV_SERVER 和 UML_SUFFIX(这些变量对于每个服务器都是唯一的,必须相应地更改)。
在 playbook 中,变量定义如下:
vars:
params_ENV_SERVER: "{{ lookup('env', 'ENV_SERVER') }}"
params_ARTIFACT_ZIP: "{{ lookup('env', 'ARTIFACT_ZIP') }}"
params_STG_NGINX_VHOST: "{{ lookup('env', 'STG_NGINX_VHOST') }}"
params_UML_SUFFIX: "{{ lookup('env', 'UML_SUFFIX') }}"
如何正确定义变量,从 Jenkins 管道脚本块传递到 Ansible 剧本?
要使env变量对执行ansible的bash任务可用,可以使用withEnv步骤如下:
[...]
script {
if (env.DEPLOY_ENV == 'staging') {
echo 'Run LUX-staging build'
withEnv(["ENV_SERVER=192.168.1.30","UML_SUFFIX=stage-mon"]) {
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
}
[...]
我在将变量从 Jenkins 管道部分传递到 Ansible 剧本时遇到问题。
我在管道中的变量:
pipeline {
agent {
label agentLabel
}
parameters {
string(
defaultValue: 'build/promo-api.zip',
description: 'name and path of the artifact',
name: 'ARTIFACT_ZIP')
string(
defaultValue: 'qa-promoapi-mbo.example.com',
description: 'name and path of the vhost QA',
name: 'QA_NGINX_VHOST')
}
stages {
[...]
stage ('Deploy') {
steps {
script {
if (env.DEPLOY_ENV == 'staging') {
echo 'Run LUX-staging build'
def ENV_SERVER = '192.168.1.30'
def UML_SUFFIX = 'stage-mon'
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
echo 'Run STAGE SG deploy'
ENV_SERVER = 'stage-sg-mbo-api.example.com'
UML_SUFFIX = 'stage-sg'
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
} else {
echo 'Run QA build'
def ENV_SERVER = '192.168.1.28'
def UML_SUFFIX = 'qa'
sh "ansible-playbook nginx-depl.yml --limit 127.0.0.1"
}
}
}
}
}
使用此命令,我可以在参数部分定义的 Ansible 范围变量中看到 - ARTIFACT_ZIP 和 QA_NGINX_VHOST:
tasks:
- name: "Ansible | List all known variables and facts"
debug:
var: hostvars[inventory_hostname]
问题是我无法从脚本部分传递变量 - ENV_SERVER 和 UML_SUFFIX(这些变量对于每个服务器都是唯一的,必须相应地更改)。
在 playbook 中,变量定义如下:
vars:
params_ENV_SERVER: "{{ lookup('env', 'ENV_SERVER') }}"
params_ARTIFACT_ZIP: "{{ lookup('env', 'ARTIFACT_ZIP') }}"
params_STG_NGINX_VHOST: "{{ lookup('env', 'STG_NGINX_VHOST') }}"
params_UML_SUFFIX: "{{ lookup('env', 'UML_SUFFIX') }}"
如何正确定义变量,从 Jenkins 管道脚本块传递到 Ansible 剧本?
要使env变量对执行ansible的bash任务可用,可以使用withEnv步骤如下:
[...]
script {
if (env.DEPLOY_ENV == 'staging') {
echo 'Run LUX-staging build'
withEnv(["ENV_SERVER=192.168.1.30","UML_SUFFIX=stage-mon"]) {
sh 'ansible-playbook nginx-depl.yml --limit 127.0.0.1'
}
[...]