Struktur Direktori

Struktur Direktori #

Ansible tidak memaksakan struktur direktori tertentu — kamu bisa meletakkan semua file di satu folder dan Ansible tetap akan bekerja. Tapi tanpa struktur yang jelas, project Ansible yang berkembang akan cepat menjadi sulit dipahami dan dikelola. Artikel ini membahas struktur direktori yang direkomendasikan oleh Ansible dan mengapa setiap bagiannya penting.

Struktur Minimal untuk Memulai #

Untuk project kecil atau saat baru belajar, struktur minimal sudah cukup:

ansible-project/
  ├── ansible.cfg          # Konfigurasi Ansible
  ├── inventory.ini        # Daftar server
  └── playbook.yml         # Playbook utama

Struktur ini cukup untuk menjalankan playbook sederhana. Tapi seiring project berkembang — lebih banyak playbook, lebih banyak lingkungan, lebih banyak role — kamu akan butuh struktur yang lebih terorganisir.


Struktur yang Direkomendasikan #

Berikut struktur yang direkomendasikan oleh Ansible best practice untuk project produksi:

ansible-project/
  ├── ansible.cfg
  │
  ├── inventory/
  │   ├── production/
  │   │   ├── hosts.ini          # Host untuk produksi
  │   │   ├── group_vars/
  │   │   │   ├── all.yml        # Variabel untuk semua host
  │   │   │   ├── webservers.yml # Variabel khusus grup webservers
  │   │   │   └── dbservers.yml  # Variabel khusus grup dbservers
  │   │   └── host_vars/
  │   │       └── web-01.yml     # Variabel khusus host web-01
  │   └── staging/
  │       ├── hosts.ini
  │       └── group_vars/
  │           └── all.yml
  │
  ├── playbooks/
  │   ├── site.yml               # Playbook master (jalankan semua)
  │   ├── webservers.yml         # Playbook khusus web server
  │   ├── dbservers.yml          # Playbook khusus database
  │   └── deploy-app.yml         # Playbook deployment aplikasi
  │
  ├── roles/
  │   ├── nginx/                 # Role untuk nginx
  │   ├── postgresql/            # Role untuk PostgreSQL
  │   └── common/                # Role untuk setup umum semua server
  │
  └── files/                     # File statis yang disalin ke managed node
      └── scripts/

Penjelasan Setiap Komponen #

ansible.cfg #

File konfigurasi di root project. Karena diletakkan di root, Ansible akan otomatis menggunakannya saat kamu menjalankan perintah dari dalam direktori project.

# ansible.cfg
[defaults]
inventory = inventory/production/
roles_path = roles/

Direktori inventory/ #

Memisahkan inventory berdasarkan lingkungan — production, staging, development — adalah praktik yang sangat dianjurkan. Ini mencegah kecelakaan menjalankan playbook di lingkungan yang salah.

inventory/
  ├── production/
  │   └── hosts.ini
  └── staging/
      └── hosts.ini

Saat menjalankan playbook, kamu secara eksplisit memilih lingkungan:

# Deploy ke staging
ansible-playbook -i inventory/staging/ playbooks/deploy-app.yml

# Deploy ke production (perlu konfirmasi ekstra)
ansible-playbook -i inventory/production/ playbooks/deploy-app.yml

group_vars/ dan host_vars/ #

Ini adalah dua direktori khusus yang dikenali Ansible secara otomatis. File di dalam group_vars/ dibaca sebagai variabel untuk grup yang sesuai, dan file di host_vars/ untuk host yang sesuai.

# inventory/production/group_vars/webservers.yml
nginx_worker_processes: 4
nginx_worker_connections: 1024
app_port: 8080
# inventory/production/host_vars/web-01.yml
# Variabel khusus untuk server web-01 saja
nginx_worker_processes: 8  # Server ini punya lebih banyak CPU

Dengan cara ini, variabel tersimpan terpisah dari definisi host, lebih mudah dibaca, dan bisa di-review lewat Git.

Direktori playbooks/ #

Memisahkan playbook ke dalam file terpisah berdasarkan tujuannya:

# playbooks/site.yml — playbook master yang memanggil semua playbook lain
---
- import_playbook: webservers.yml
- import_playbook: dbservers.yml
# playbooks/webservers.yml
---
- name: Konfigurasi web server
  hosts: webservers
  roles:
    - common
    - nginx

Direktori roles/ #

Role adalah cara untuk mengemas playbook yang bisa digunakan kembali. Setiap role punya struktur direktori sendiri yang akan dibahas di section Role. Di level project, cukup tahu bahwa role diletakkan di direktori roles/.

roles/
  └── nginx/
      ├── tasks/
      │   └── main.yml       # Task utama role ini
      ├── handlers/
      │   └── main.yml       # Handler (untuk reload/restart)
      ├── templates/
      │   └── nginx.conf.j2  # Template konfigurasi
      ├── files/
      │   └── index.html     # File statis
      ├── vars/
      │   └── main.yml       # Variabel internal role
      └── defaults/
          └── main.yml       # Nilai default variabel

Struktur untuk Multi-Environment #

Untuk project yang mengelola banyak lingkungan, tambahkan pemisahan yang lebih jelas:

ansible-project/
  ├── ansible.cfg
  │
  ├── environments/          # Ganti nama dari inventory/ untuk kejelasan
  │   ├── production/
  │   │   ├── hosts.ini
  │   │   └── group_vars/
  │   ├── staging/
  │   │   ├── hosts.ini
  │   │   └── group_vars/
  │   └── development/
  │       ├── hosts.ini
  │       └── group_vars/
  │
  ├── playbooks/
  ├── roles/
  └── requirements.yml       # Daftar external roles/collections

File requirements.yml mendefinisikan external role dan collection yang dibutuhkan project:

# requirements.yml
---
roles:
  - name: geerlingguy.nginx
    version: "3.2.0"

collections:
  - name: community.postgresql
    version: "3.1.0"
# Instal semua dependensi dari requirements.yml
ansible-galaxy install -r requirements.yml
ansible-galaxy collection install -r requirements.yml

Penamaan File yang Konsisten #

Konsistensi penamaan file membuat navigasi project jauh lebih mudah:

Konvensi penamaan yang baik:
  ✓ Gunakan huruf kecil dan tanda hubung: deploy-app.yml, nginx-config.yml
  ✓ Nama deskriptif: setup-monitoring.yml (bukan setup.yml)
  ✓ Nama role sesuai fungsinya: nginx, postgresql, redis
  ✗ Hindari spasi dan karakter khusus dalam nama file
  ✗ Hindari nama yang terlalu generik: tasks.yml, playbook.yml

Ringkasan #

  • Mulai dengan struktur minimal (ansible.cfg, inventory.ini, playbook.yml) dan tambahkan kompleksitas sesuai kebutuhan.
  • Pisahkan inventory berdasarkan lingkungan (production/, staging/) untuk mencegah kecelakaan deployment ke lingkungan yang salah.
  • Gunakan group_vars/ dan host_vars/ untuk menyimpan variabel — lebih bersih dan mudah di-review dari Git.
  • Letakkan ansible.cfg di root project agar Ansible otomatis menggunakannya.
  • Pisahkan playbook berdasarkan fungsi atau target — jangan satu playbook monolitik untuk semua hal.
  • Gunakan requirements.yml untuk mendokumentasikan dan menginstal external role dan collection secara konsisten.

← Sebelumnya: Konfigurasi   Berikutnya: Apa itu Inventory? →

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