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: truedi 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.