Kirim Environment Variable dari GitLab CI ke Ansible Shell

5 menit baca.
Tags: devopsgitlabci-cdansible

Kirim environment variable dari GitLab CI ke Ansible shell task itu sebenarnya simpel, asal kamu tidak mengandalkan export dari task sebelumnya.

Poin utamanya: setiap Ansible task jalan di proses sendiri. Jadi export di task A tidak otomatis ada di task B.

Kenapa variable hilang antar Ansible shell task

Pola ini terlihat benar, tapi tidak persisten:

- name: Set token
  shell: |
    export APP_TOKEN=my-token

- name: Use token
  shell: |
    echo "$APP_TOKEN"

Di task kedua, APP_TOKEN akan kosong.

Untuk pipeline GitLab CI, cara aman adalah kirim value langsung dari CI variable ke Ansible, lalu inject tepat di task yang butuh.

Kirim GitLab CI variable ke ansible-playbook

Set CI variable di GitLab (Settings > CI/CD > Variables), lalu pass ke Ansible lewat extra-vars:

deploy:
  stage: deploy
  image: python:3.12
  variables:
    ANSIBLE_HOST_KEY_CHECKING: "False"
  script:
    - pip install ansible
    - ansible-playbook -i inventory.ini deploy.yml -e "app_token=$APP_TOKEN"

$APP_TOKEN di sini berasal dari GitLab CI. Kalau sensitif, set sebagai Masked dan Protected.

Pakai variable itu di Ansible shell task

Pakai environment di level task supaya shell command menerima variable sebagai env var:

- name: Run deploy script with token
  shell: ./deploy.sh
  args:
    chdir: /opt/my-app
  environment:
    APP_TOKEN: "{{ app_token }}"

Di deploy.sh, kamu bisa akses seperti biasa:

#!/usr/bin/env bash
set -euo pipefail

curl -H "Authorization: Bearer $APP_TOKEN" https://api.example.com/deploy

Ini jauh lebih jelas daripada mencoba membawa state export antar task.

Alternatif: baca langsung dari environment di Ansible

Kalau mau, kamu juga bisa baca env langsung di playbook:

- name: Use CI variable directly
  shell: ./deploy.sh
  environment:
    APP_TOKEN: "{{ lookup('env', 'APP_TOKEN') }}"

Ini bekerja kalau proses runner memang sudah punya APP_TOKEN. Di GitLab CI job biasanya iya.

Catatan security

Untuk secret di GitLab CI dan Ansible:

  • simpan secret sebagai Masked + Protected variable di GitLab
  • hindari print nilai secret ke log (echo $APP_TOKEN)
  • pakai no_log: true di task yang berpotensi mengekspos output sensitif

Contoh:

- name: Deploy with secret token
  shell: ./deploy.sh
  environment:
    APP_TOKEN: "{{ app_token }}"
  no_log: true

Kesimpulan

Untuk kirim environment variable dari GitLab CI ke Ansible shell task, teruskan lewat -e atau lookup('env', ...), lalu inject dengan task-level environment. Jangan bergantung pada export di shell task sebelumnya karena state itu tidak persisten.

Related Posts