Secret Management #
Ansible Vault adalah titik awal yang bagus untuk mengelola secret. Tapi saat infrastruktur tumbuh, Vault punya keterbatasan: semua orang yang butuh menjalankan playbook harus punya vault password, rotasi secret membutuhkan update file yang di-commit ke Git, dan tidak ada audit trail granular siapa mengakses secret kapan. External secret manager seperti HashiCorp Vault atau AWS Secrets Manager menyelesaikan keterbatasan ini. Artikel ini membahas kapan beralih ke external secret manager dan bagaimana cara mengintegrasikannya dengan Ansible.
Ansible Vault vs External Secret Manager #
Ansible Vault:
✓ Built-in, tidak butuh infrastruktur tambahan
✓ Cocok untuk tim kecil dan project yang baru mulai
✓ Secret terenkripsi di Git — mudah di-backup
✗ Semua orang dengan vault password bisa akses SEMUA secret
✗ Rotasi secret = update file + commit ke Git
✗ Tidak ada audit trail "siapa mengakses secret X kapan"
✗ Secret harus di-distribute ke semua CI/CD runner
External Secret Manager:
✓ Akses granular per secret, per role, per user
✓ Audit trail lengkap
✓ Rotasi secret otomatis tanpa perlu update Git
✓ Secret tidak pernah tersimpan di Git, bahkan terenkripsi
✗ Infrastruktur tambahan yang perlu dikelola
✗ Dependency pada availability secret manager
✗ Lebih kompleks untuk setup awal
HashiCorp Vault dengan Ansible #
HashiCorp Vault adalah external secret manager yang paling populer di ekosistem on-premise dan hybrid cloud:
# Install koleksi community yang diperlukan
ansible-galaxy collection install community.hashi_vault
pip install hvac # Library Python untuk HashiCorp Vault
# Ambil secret menggunakan lookup plugin
- name: Setup koneksi database
hosts: appservers
tasks:
- name: Ambil database credentials dari HashiCorp Vault
set_fact:
db_credentials: "{{ lookup('community.hashi_vault.hashi_vault',
'secret=secret/data/myapp/database:data',
url='https://vault.company.internal:8200',
auth_method='approle',
role_id=vault_role_id,
secret_id=vault_secret_id) }}"
no_log: true
- name: Konfigurasi koneksi database
template:
src: database.conf.j2
dest: /etc/app/database.conf
vars:
db_host: "{{ db_credentials.host }}"
db_password: "{{ db_credentials.password }}"
no_log: true
Autentikasi AppRole adalah metode yang direkomendasikan untuk CI/CD — menggunakan role ID dan secret ID, bukan username/password:
# group_vars/all.yml
vault_url: "https://vault.company.internal:8200"
vault_role_id: "{{ lookup('env', 'VAULT_ROLE_ID') }}" # Dari environment variable
vault_secret_id: "{{ lookup('env', 'VAULT_SECRET_ID') }}" # Dari environment variable
AWS Secrets Manager dengan Ansible #
Untuk infrastruktur di AWS, AWS Secrets Manager adalah pilihan yang terintegrasi secara native:
ansible-galaxy collection install amazon.aws
pip install boto3 botocore
- name: Deploy aplikasi dengan credentials dari AWS Secrets Manager
hosts: appservers
tasks:
- name: Ambil RDS credentials dari AWS Secrets Manager
set_fact:
rds_secret: "{{ lookup('amazon.aws.aws_secret',
'prod/myapp/rds',
region='ap-southeast-1',
on_missing='error') | from_json }}"
no_log: true
- name: Deploy konfigurasi database
template:
src: database.conf.j2
dest: /etc/app/database.conf
vars:
db_host: "{{ rds_secret.host }}"
db_user: "{{ rds_secret.username }}"
db_password: "{{ rds_secret.password }}"
no_log: true
Pola: Secret Tersedia Hanya Saat Runtime #
Keuntungan terbesar external secret manager adalah secret tidak pernah disimpan di mana pun dalam playbook — ia diambil saat runtime dan hanya ada di memory:
# Pola yang direkomendasikan: ambil, gunakan, jangan simpan
- name: Jalankan task yang butuh secret
block:
- name: Ambil secret dari vault (hanya tersedia dalam block ini)
set_fact:
temp_secret: "{{ lookup('community.hashi_vault.hashi_vault', 'secret=...') }}"
no_log: true
- name: Gunakan secret untuk konfigurasi
template:
src: app.conf.j2
dest: /etc/app/app.conf
no_log: true
always:
# Hapus variabel setelah digunakan
- name: Hapus secret dari memory
set_fact:
temp_secret: ""
no_log: true
Lookup Plugin Lainnya #
Ansible menyediakan beberapa lookup plugin bawaan yang berguna untuk secret management sederhana:
# Ambil nilai dari environment variable di control node
- name: Gunakan API key dari environment variable
command: curl -H "Authorization: Bearer {{ lookup('env', 'API_TOKEN') }}" https://api.example.com
no_log: true
# Baca konten file (misalnya SSH public key)
- name: Distribusikan SSH key
authorized_key:
user: deployer
key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
# Baca file terenkripsi dengan password
- name: Baca certificate content
set_fact:
ssl_cert_content: "{{ lookup('file', 'files/app.crt') }}"
Ringkasan #
- Ansible Vault cocok untuk tim kecil dan project yang baru mulai — simple dan tidak butuh infrastruktur tambahan.
- External secret manager (HashiCorp Vault, AWS Secrets Manager) lebih tepat untuk produksi yang matang — akses granular, audit trail, dan rotasi otomatis.
- Gunakan AppRole authentication untuk integrasi CI/CD dengan HashiCorp Vault — lebih aman dari menggunakan root token.
- Selalu gunakan
no_log: truepada task yang mengambil atau menggunakan secret — mencegah secret muncul di log.- Secret tidak boleh tersimpan di file atau log — ambil saat runtime, gunakan, hapus dari memory jika memungkinkan.
- Pertimbangkan beralih ke external secret manager saat: tim > 5 orang, butuh audit trail, atau butuh rotasi secret otomatis.