Невозможно передать переменные из части скрипта конвейера Jenkins в Ansible playbook

У меня проблема с частичной передачей переменных из конвейера Jenkins в Ansible playbook.

Мои переменные в конвейере:

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') }}"

Как правильно определить переменные, чтобы перейти к плейбуку Ansible из блока скрипта конвейера Jenkins?

"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
1
0
1 198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сделать переменные env доступными для задачи bash, которая выполняет ansible, вы можете использовать шаг 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'                  
       }
[...]
                

большое спасибо за ответ и ссылку на документацию.

Vasyl Stepulo 21.12.2020 18:10

У меня похожая ситуация, однако использование withEnv не совсем работает, потому что переменная jenkins, которую я передаю в ansible, исходит из withCredentials (это пароль), поэтому к тому времени, когда ansible подбирает ее из среды, я думаю, что значение запутывается в переменной окружения. Единственный способ, которым я могу успешно перейти от переменной env Credentials в моем конвейере к шагу ansible sh, — это передать ее в ansible с --extra-vars. Я не уверен, в чем разница между этим и просто попыткой получить его из окружающей среды через environment: MY_PASSWORD: "{{ lookup('env','MY_PASSWORD') }}"

timblaktu 19.03.2021 21:33

Другие вопросы по теме