Apa itu Inventory? #
Ansible tidak bisa melakukan apa pun tanpa tahu ke mana harus terhubung. Inventory adalah jawaban atas pertanyaan itu — daftar lengkap semua server yang akan dikelola, bagaimana mereka dikelompokkan, dan informasi koneksi apa yang dibutuhkan untuk menjangkau mereka. Memahami inventory secara mendalam adalah fondasi untuk menggunakan Ansible secara efektif, karena hampir semua keputusan dalam playbook — siapa yang dijalankan, variabel apa yang berlaku, urutan eksekusi — bergantung pada bagaimana inventory disusun.
Inventory sebagai Sumber Kebenaran #
Inventory bukan sekadar daftar IP address. Inventory adalah sumber kebenaran (source of truth) tentang infrastruktur kamu di mata Ansible. Ia mendefinisikan:
- Siapa yang dikelola: server apa saja yang ada
- Bagaimana mengelompokkannya: mana server web, database, cache
- Variabel apa yang berlaku: konfigurasi berbeda per grup atau per host
- Bagaimana terhubung: port SSH, user, private key yang digunakan
Saat playbook berjalan, Ansible selalu mulai dengan membaca inventory — menentukan host mana yang relevan dengan hosts: yang didefinisikan di playbook, lalu membangun variabel yang akan digunakan selama eksekusi.
Format Inventory yang Didukung #
Ansible mendukung beberapa format inventory. Pilih yang paling sesuai dengan kompleksitas kebutuhanmu.
Format INI #
Format paling ringkas dan paling mudah dibaca untuk inventory sederhana:
# hosts.ini
# Host tanpa grup — masuk ke grup "ungrouped" secara otomatis
mail.example.com
[webservers]
web-01.example.com
web-02.example.com
192.168.1.10
[dbservers]
db-01.example.com
db-02.example.com
# Grup yang berisi grup lain
[datacenter:children]
webservers
dbservers
# Variabel untuk seluruh grup
[webservers:vars]
ansible_user=ubuntu
http_port=80
Format YAML #
Lebih eksplisit dan cocok untuk inventory yang lebih kompleks atau saat kamu sudah familiar dengan YAML dari file playbook:
# hosts.yml
all:
children:
webservers:
hosts:
web-01.example.com:
ansible_user: ubuntu
http_port: 80
web-02.example.com:
ansible_user: ubuntu
http_port: 8080
vars:
nginx_version: "1.24"
dbservers:
hosts:
db-01.example.com:
db-02.example.com:
vars:
ansible_user: admin
db_port: 5432
datacenter:
children:
webservers:
dbservers:
Kedua format menghasilkan struktur yang identik di mata Ansible. Pilih INI untuk inventory kecil yang sering diedit manual, dan YAML untuk inventory kompleks yang mungkin di-generate secara programatik.
Grup Bawaan: all dan ungrouped #
Ansible selalu mendefinisikan dua grup bawaan yang tidak perlu ditulis secara eksplisit:
all
└── ungrouped (host yang tidak masuk grup manapun)
└── webservers (grup yang kamu definisikan)
└── dbservers (grup yang kamu definisikan)
Grup all selalu berisi seluruh host di inventory. Ini berguna saat kamu ingin menjalankan task yang berlaku untuk semua server tanpa pengecualian — misalnya update security patch.
# Jalankan di semua server
ansible-playbook -i hosts.ini site.yml --limit all
# Ekuivalen dengan tidak menggunakan --limit
ansible-playbook -i hosts.ini site.yml
Inventory sebagai Direktori #
Alih-alih satu file tunggal, inventory bisa berupa direktori yang berisi beberapa file. Ansible akan membaca semua file di dalamnya dan menggabungkannya.
inventory/
├── webservers.ini # Host dan grup web server
├── dbservers.ini # Host dan grup database
├── monitoring.ini # Host monitoring
├── group_vars/
│ ├── all.yml # Variabel untuk semua host
│ ├── webservers.yml # Variabel khusus webservers
│ └── dbservers.yml # Variabel khusus dbservers
└── host_vars/
└── web-01.yml # Variabel khusus host web-01
Pendekatan ini sangat berguna untuk tim besar di mana tim yang berbeda bertanggung jawab atas bagian inventory yang berbeda — setiap tim bisa mengelola file mereka sendiri tanpa menyentuh file milik tim lain.
Cara Ansible Membaca Inventory #
Memahami urutan pembacaan inventory membantu debug saat ada variabel yang nilainya tidak sesuai ekspektasi:
1. Ansible membaca semua file inventory
│
2. Membangun daftar host dan grup
│
3. Membaca variabel dari:
├── host_vars/<hostname>.yml (prioritas tertinggi per-host)
├── host_vars/<hostname>/ (direktori host_vars)
├── group_vars/<groupname>.yml (variabel grup spesifik)
├── group_vars/all.yml (variabel semua host)
└── Variabel di file inventory (prioritas terendah)
│
4. Membangun variabel final untuk setiap host
(dengan memperhitungkan precedence)
Ini berarti variabel di host_vars/ akan selalu menimpa variabel di group_vars/, dan variabel di group_vars/ lebih spesifik menimpa group_vars/all.
Melihat Isi Inventory #
Ansible menyediakan perintah ansible-inventory untuk memeriksa inventory yang aktif tanpa harus menjalankan playbook:
# Tampilkan semua host dalam format list
ansible-inventory -i inventory/ --list
# Tampilkan dalam format yang lebih mudah dibaca
ansible-inventory -i inventory/ --graph
# Output contoh --graph:
# @all:
# |--@webservers:
# | |--web-01.example.com
# | |--web-02.example.com
# |--@dbservers:
# | |--db-01.example.com
# |--@ungrouped:
# Tampilkan variabel untuk host tertentu
ansible-inventory -i inventory/ --host web-01.example.com
Perintah ini sangat berguna untuk memverifikasi bahwa inventory dibaca dengan benar sebelum menjalankan playbook — terutama saat menggunakan inventory dinamis.
Inventory Statis vs Dinamis #
Semua contoh di atas adalah inventory statis — server didefinisikan secara manual dan tidak berubah kecuali kamu mengubah file-nya. Ini cocok untuk infrastruktur yang relatif tetap.
Untuk infrastruktur cloud yang berubah dinamis — server dibuat dan dihapus secara otomatis oleh autoscaling — Ansible menyediakan inventory plugin yang mengambil daftar host dari sumber eksternal secara real-time:
Inventory Statis:
File .ini atau .yml ──► Ansible tahu server yang ada
Inventory Dinamis:
AWS EC2 API
GCP Compute API ──► Plugin inventory ──► Ansible tahu server yang ada
Azure VM API
Database, CMDB
Inventory dinamis akan dibahas lebih mendalam di artikel berikutnya.
Ringkasan #
- Inventory adalah sumber kebenaran infrastruktur di mata Ansible — mendefinisikan siapa yang dikelola, bagaimana dikelompokkan, dan variabel apa yang berlaku.
- Dua format yang didukung: INI (ringkas, cocok untuk inventory sederhana) dan YAML (eksplisit, cocok untuk inventory kompleks).
- Grup bawaan
allselalu berisi seluruh host,ungroupedberisi host yang tidak masuk grup manapun.- Inventory bisa berupa direktori yang berisi banyak file — berguna untuk tim besar yang berbagi satu inventory.
- Urutan pembacaan variabel:
host_vars/>group_vars/<group>>group_vars/all> variabel di file inventory.- Gunakan
ansible-inventory --graphuntuk memverifikasi inventory sebelum menjalankan playbook.- Inventory dinamis digunakan untuk infrastruktur cloud yang berubah secara otomatis.