> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Operasi Lanjutan Ansible (Roles, Vault & Jinja2)

> Praktik tingkat lanjut Ansible: enkripsi rahasia dengan Ansible Vault, templating Jinja2 dinamis, modularisasi sistem dengan Ansible Roles, dan eksekusi kondisional.

Untuk mengelola puluhan layanan yang kompleks di lingkungan produksi, menaruh seluruh kode dalam satu file playbook panjang akan menjadi mimpi buruk. Ansible menyediakan fitur modularisasi dan keamanan tingkat lanjut.

***

## 1. Modularisasi Menggunakan Ansible Roles

**Role** adalah standar pengorganisasian berkas Ansible ke dalam struktur direktori yang rapi dan dapat digunakan kembali (*reusable*):

```text theme={null}
roles/
└── nginx_role/
    ├── tasks/       # Berisi daftar instruksi utama (main.yml)
    ├── handlers/    # Berisi handler pemicu (main.yml)
    ├── templates/   # Berisi template file konfigurasi dinamis (.j2)
    ├── files/       # Berisi file statis (gambar, berkas mentah)
    ├── vars/        # Berisi variabel prioritas tinggi
    └── defaults/    # Berisi variabel default (main.yml)
```

### Membuat Struktur Role:

```bash theme={null}
ansible-galaxy role init roles/common
ansible-galaxy role init roles/nginx_web
```

### Memanggil Role di Playbook Utama (`site.yml`):

```yaml theme={null}
---
- name: Setup Kluster Produksi
  hosts: all
  become: yes
  roles:
    - common       # Role instalasi firewall, user, update OS
    - nginx_web    # Role khusus web server
```

***

## 2. Templating Dinamis dengan Jinja2 (`.j2`)

Daripada membuat file konfigurasi Nginx statis, kita bisa menggunakan template mesin Jinja2 yang menyuntikkan variabel IP atau jumlah core CPU server secara dinamis.

Buat file `roles/nginx_web/templates/nginx.conf.j2`:

```nginx theme={null}
user www-data;
worker_processes {{ ansible_processor_vcpus }}; # Mengambil fakta spek server otomatis

events {
    worker_connections 1024;
}

http {
    server {
        listen {{ http_port | default(80) }};
        server_name {{ domain_name }};

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}
```

Task untuk menerapkan template:

```yaml theme={null}
- name: Terapkan konfigurasi dinamis Nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: Restart Nginx Service
```

***

## 3. Keamanan Data Rahasia dengan Ansible Vault

Jangan pernah menyimpan password root database, API key, atau sertifikat SSL dalam bentuk teks biasa di Git! **Ansible Vault** mengenkripsi variabel rahasia dengan algoritma AES-256.

```bash theme={null}
# 1. Membuat file variabel rahasia baru terenkripsi
ansible-vault create secret_vars.yml

# (Masukkan password vault, lalu ketik variabel di dalamnya, contoh:)
# db_password: "SuperSecretPassword123"

# 2. Mengedit file vault yang sudah ada
ansible-vault edit secret_vars.yml

# 3. Menjalankan playbook dengan menyertakan password vault:
ansible-playbook -i hosts.ini site.yml --ask-vault-pass
# Atau menggunakan berkas password vault otomatis:
ansible-playbook -i hosts.ini site.yml --vault-password-file ~/.vault_pass.txt
```

***

## 4. Eksekusi Kondisional (`when`) & Loops (`loop`)

```yaml theme={null}
- name: Instal paket utilitas menggunakan looping
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - curl
    - git
    - htop
    - net-tools

- name: Jalankan perintah ini HANYA jika OS adalah Ubuntu
  command: echo "Server ini menggunakan Ubuntu"
  when: ansible_distribution == "Ubuntu"
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.