Cloud

Cloud #

Inventory statis bekerja dengan baik saat infrastrukturmu relatif tetap — server yang sama, IP yang sama, dari minggu ke minggu. Tapi di lingkungan cloud modern, server bisa muncul dan hilang dalam hitungan menit karena autoscaling. Menulis dan memperbarui inventory statis secara manual di lingkungan seperti ini tidak praktis dan rawan kesalahan. Inventory dinamis hadir untuk memecahkan masalah ini: Ansible langsung bertanya ke cloud provider “server apa yang sedang berjalan sekarang?” dan menggunakan jawabannya sebagai inventory.

Cara Kerja Inventory Dinamis #

Alih-alih membaca file statis, inventory dinamis menjalankan skrip atau plugin yang mengambil data dari sumber eksternal secara real-time:

Inventory Statis:
  hosts.ini ──────────────────────────► Ansible
  (file yang kamu edit manual)

Inventory Dinamis:
  AWS EC2 API ──► Plugin aws_ec2 ──────► Ansible
  (real-time, otomatis)

Keuntungan inventory dinamis:
  ✓ Selalu up-to-date tanpa edit manual
  ✓ Server baru otomatis terdeteksi
  ✓ Server yang dihapus otomatis hilang dari inventory
  ✓ Bisa filter berdasarkan tag, region, status

Inventory Plugin vs Inventory Script #

Ada dua cara mengimplementasikan inventory dinamis di Ansible:

Inventory Plugin (cara modern, direkomendasikan) adalah plugin bawaan atau dari collection yang dikonfigurasi via file YAML. Lebih efisien, lebih mudah dikonfigurasi, dan terintegrasi lebih baik dengan ekosistem Ansible.

Inventory Script (cara lama) adalah skrip executable yang menghasilkan JSON. Masih didukung tapi tidak direkomendasikan untuk project baru.

Artikel ini fokus pada inventory plugin karena itulah pendekatan yang saat ini direkomendasikan.


AWS EC2 #

Untuk menggunakan inventory dinamis dengan AWS, instal collection yang diperlukan terlebih dahulu:

ansible-galaxy collection install amazon.aws
pip install boto3 botocore   # Library Python untuk AWS API

Buat file konfigurasi inventory plugin — nama file harus diakhiri dengan aws_ec2.yml atau aws_ec2.yaml:

# inventory/production/aws_ec2.yml
plugin: amazon.aws.aws_ec2

# Region AWS yang akan di-query
regions:
  - ap-southeast-1

# Filter: hanya ambil instance yang sedang berjalan
filters:
  instance-state-name: running

# Kelompokkan instance berdasarkan tag
keyed_groups:
  # Grup berdasarkan nilai tag "Role"
  - key: tags.Role
    prefix: role
    separator: "_"
  # Grup berdasarkan nilai tag "Environment"
  - key: tags.Environment
    prefix: env
    separator: "_"

# Gunakan private IP untuk koneksi (untuk instance dalam VPC)
hostnames:
  - private-ip-address

# Variabel tambahan yang dibawa dari tag instance
compose:
  ansible_host: private_ip_address

Dengan konfigurasi ini, instance EC2 dengan tag Role=webserver dan Environment=production akan otomatis masuk ke grup role_webserver dan env_production.

# Verifikasi inventory dinamis
ansible-inventory -i inventory/production/ --graph

# Output contoh:
# @all:
#   |--@role_webserver:
#   |  |--10.0.1.10
#   |  |--10.0.1.11
#   |--@role_database:
#   |  |--10.0.2.10
#   |--@env_production:
#   |  |--10.0.1.10
#   |  |--10.0.1.11
#   |  |--10.0.2.10

GCP (Google Cloud Platform) #

ansible-galaxy collection install google.cloud
pip install google-auth requests
# inventory/production/gcp_compute.yml
plugin: google.cloud.gcp_compute

# Project GCP
projects:
  - my-gcp-project-id

# Zone yang akan di-query (atau gunakan "zones: []" untuk semua zone)
zones:
  - asia-southeast1-a
  - asia-southeast1-b

# Filter berdasarkan label GCP
filters:
  - labels.environment = production

# Kelompokkan berdasarkan label
keyed_groups:
  - key: labels.role
    prefix: role
  - key: zone
    prefix: zone

# Autentikasi menggunakan service account
auth_kind: serviceaccount
service_account_file: /path/to/service-account.json

compose:
  ansible_host: networkInterfaces[0].networkIP

Azure #

ansible-galaxy collection install azure.azcollection
pip install -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements.txt
# inventory/production/azure_rm.yml
plugin: azure.azcollection.azure_rm

# Filter berdasarkan resource group
include_vm_resource_groups:
  - production-rg

# Kelompokkan berdasarkan tag
keyed_groups:
  - key: tags.role
    prefix: role
  - key: tags.environment
    prefix: env

# Gunakan IP private
use_private_ip: true

Menggabungkan Inventory Statis dan Dinamis #

Dalam praktiknya, kamu sering perlu menggabungkan inventory statis dan dinamis. Misalnya, server bare metal yang dikelola secara statis digabung dengan VM cloud yang dinamis:

inventory/production/
  ├── static_hosts.ini       # Server bare metal, statis
  ├── aws_ec2.yml            # Instance AWS, dinamis
  └── group_vars/
      ├── all.yml
      └── role_webserver.yml

Ansible otomatis menggabungkan semua sumber inventory di dalam direktori yang sama. Kamu bahkan bisa memetakan grup dari inventory dinamis ke grup di inventory statis menggunakan constructed plugin:

# inventory/production/constructed.yml
plugin: ansible.builtin.constructed

# Buat grup baru berdasarkan kombinasi kondisi
groups:
  # Grup "load_balanced_web" berisi semua host yang punya tag role=webserver
  # DAN berada di availability zone tertentu
  load_balanced_web: "'role_webserver' in group_names and 'zone_ap_southeast1_a' in group_names"

Caching Inventory Dinamis #

Memanggil cloud API setiap kali Ansible berjalan bisa memperlambat eksekusi dan mengenai rate limit API. Aktifkan caching untuk mengatasi ini:

# ansible.cfg
[inventory]
cache = true
cache_plugin = jsonfile
cache_timeout = 300          # Cache berlaku 5 menit
cache_connection = /tmp/ansible_inventory_cache

Dengan caching aktif, Ansible hanya memanggil API cloud saat cache sudah expired, bukan setiap kali playbook dijalankan.

# Paksa refresh cache (abaikan cache yang ada)
ansible-inventory -i inventory/production/ --list --refresh-cache

Ringkasan #

  • Inventory dinamis mengambil daftar host dari sumber eksternal (cloud API) secara real-time — tidak perlu update manual saat server ditambah atau dihapus.
  • Gunakan inventory plugin (file *.yml dengan plugin:) bukan inventory script — lebih efisien dan lebih mudah dikonfigurasi.
  • Pengelompokan berbasis tag adalah kunci inventory dinamis yang berguna: tag instance di cloud provider otomatis menjadi grup di Ansible.
  • Inventory statis dan dinamis bisa digabungkan dalam satu direktori — Ansible akan menggabungkan semua sumber secara otomatis.
  • Aktifkan caching inventory untuk menghindari pemanggilan API berulang dan mempercepat eksekusi playbook.
  • Selalu verifikasi inventory dinamis dengan ansible-inventory --graph sebelum menjalankan playbook untuk memastikan host yang diharapkan sudah terdeteksi.

← Sebelumnya: Variable   Berikutnya: Anti-Pattern →

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