Ansible Vault #
Setiap project Ansible yang serius menyimpan data sensitif: password database, API key, private key, token autentikasi. Menyimpan nilai-nilai ini dalam plaintext di repository Git adalah risiko keamanan yang tidak bisa diterima. Ansible Vault adalah solusi bawaan Ansible untuk masalah ini — enkripsi file atau string individual menggunakan AES-256, sehingga data sensitif bisa disimpan aman di Git tanpa risiko bocor.
Dua Mode Vault: File dan String #
Vault bisa mengenkripsi dalam dua granularitas yang berbeda, masing-masing cocok untuk skenario berbeda.
Enkripsi file penuh — seluruh file dienkripsi menjadi ciphertext:
# Enkripsi file yang sudah ada
ansible-vault encrypt group_vars/production/vault.yml
# Buat file terenkripsi baru langsung
ansible-vault create group_vars/production/vault.yml
# Edit file terenkripsi (decrypt, buka editor, encrypt kembali)
ansible-vault edit group_vars/production/vault.yml
# Lihat isi tanpa mengubah file
ansible-vault view group_vars/production/vault.yml
# Decrypt permanen (hati-hati!)
ansible-vault decrypt group_vars/production/vault.yml
Enkripsi string individual — hanya nilai sensitifnya yang dienkripsi, bukan seluruh file:
# Enkripsi sebuah string
ansible-vault encrypt_string 'SuperSecret123' --name 'db_password'
Output yang dihasilkan:
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653339316533393634313636353535623135623
3365663636343365623062323438353563373832663430640a633138623430383
...
String terenkripsi ini bisa langsung ditempel ke file YAML mana pun dan Ansible akan mendekripnya saat runtime.
Mengelola Vault Password #
Vault password adalah kunci enkripsi — siapa yang punya password ini bisa mendekripsi semua file vault. Ada beberapa cara menyediakannya ke Ansible:
# Cara 1: Prompt interaktif (baik untuk penggunaan manual)
ansible-playbook site.yml --ask-vault-pass
# Cara 2: File password (baik untuk otomasi, tapi jaga keamanan file-nya)
ansible-playbook site.yml --vault-password-file ~/.vault_pass
# Cara 3: Variabel environment
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass
ansible-playbook site.yml
# ansible.cfg — set vault password file sebagai default
[defaults]
vault_password_file = ~/.vault_pass
Jangan pernah commit file vault password ke Git. Tambahkan ke
.gitignoresegera setelah membuatnya. File yang berisi kunci enkripsi semua secret kamu adalah target yang sangat berharga bagi penyerang.# .gitignore .vault_pass *.vault_pass vault_pass.txt
Struktur File vault yang Direkomendasikan #
Pola terbaik adalah memisahkan variabel biasa dari variabel sensitif ke dua file berbeda:
inventory/production/group_vars/
└── dbservers/
├── vars.yml # Variabel biasa — TIDAK dienkripsi, aman di Git
└── vault.yml # Variabel sensitif — DIENKRIPSI
# group_vars/dbservers/vars.yml — plaintext, aman di Git
db_host: prod-db.internal
db_port: 5432
db_name: app_production
db_user: app_user
db_password: "{{ vault_db_password }}" # Referensikan variabel vault
# group_vars/dbservers/vault.yml — ENKRIPSI file ini dengan ansible-vault
vault_db_password: SuperSecret123
vault_db_admin_password: AnotherSecret456
Dengan pola ini:
vars.ymlbisa di-review di Git tanpa khawatir — tidak ada secretvault.ymlberisi secret tapi terenkripsi — aman di Git- Variabel di playbook menggunakan
db_password(dari vars.yml) yang nilainya mengacu kevault_db_password(dari vault.yml)
Multiple Vault IDs #
Untuk proyek besar dengan beberapa lingkungan, gunakan vault IDs yang berbeda — setiap lingkungan punya password vault yang berbeda:
# Enkripsi dengan vault ID tertentu
ansible-vault encrypt_string 'ProdSecret' --name 'db_password' --vault-id production@~/.vault_pass_prod
ansible-vault encrypt_string 'StagingSecret' --name 'db_password' --vault-id staging@~/.vault_pass_staging
# Jalankan playbook dengan beberapa vault password
ansible-playbook site.yml \
--vault-id production@~/.vault_pass_prod \
--vault-id staging@~/.vault_pass_staging
Dengan vault ID berbeda per lingkungan:
- Bocornya password vault staging tidak mengkompromikan vault production
- Tim yang berbeda bisa mengelola lingkungan berbeda tanpa akses ke semua secret
Vault dalam CI/CD #
Untuk pipeline CI/CD, vault password biasanya disimpan sebagai secret environment variable di platform CI:
# .gitlab-ci.yml
deploy:
script:
- echo "$VAULT_PASSWORD" > /tmp/.vault_pass
- chmod 600 /tmp/.vault_pass
- ansible-playbook -i inventory/production/ site.yml --vault-password-file /tmp/.vault_pass
- rm -f /tmp/.vault_pass # Hapus setelah selesai
environment:
name: production
# GitHub Actions
- name: Deploy dengan Ansible
run: |
echo "${{ secrets.VAULT_PASSWORD }}" > /tmp/.vault_pass
chmod 600 /tmp/.vault_pass
ansible-playbook -i inventory/production/ site.yml \
--vault-password-file /tmp/.vault_pass
env:
VAULT_PASSWORD: ${{ secrets.VAULT_PASSWORD }}
Ringkasan #
- Ansible Vault mengenkripsi data sensitif menggunakan AES-256 — file terenkripsi aman disimpan di Git.
- Dua mode: enkripsi file penuh (
ansible-vault encrypt) untuk file yang seluruhnya sensitif, dan enkripsi string (encrypt_string) untuk nilai individual dalam file YAML.- Pisahkan variabel biasa dari vault —
vars.yml(plaintext) mereferensikanvault.yml(terenkripsi) — memudahkan review di Git.- Vault password tidak boleh di-commit ke Git — simpan di file lokal yang ada di
.gitignore, atau sebagai secret di platform CI/CD.- Gunakan vault IDs berbeda per lingkungan untuk isolasi — bocornya vault password staging tidak mengkompromikan production.
- Set
vault_password_filediansible.cfguntuk menghindari mengetik flag--vault-password-filesetiap kali.