Ansible Vault

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 .gitignore segera 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.yml bisa di-review di Git tanpa khawatir — tidak ada secret
  • vault.yml berisi secret tapi terenkripsi — aman di Git
  • Variabel di playbook menggunakan db_password (dari vars.yml) yang nilainya mengacu ke vault_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 vaultvars.yml (plaintext) mereferensikan vault.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_file di ansible.cfg untuk menghindari mengetik flag --vault-password-file setiap kali.

← Sebelumnya: Drift Handling   Berikutnya: Encryption →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact