Merancang Instalasi Otomatis Zimbra dengan Ansible

Hari ini saya memulai untuk membangun project saya, yaitu project instalasi zimbra secara otomatis, dan disini saya menggunakan Ansible sebagai mesin otomasi nya. Instalasi Zimbra secara manual itu melelahkan. Kalian harus SSH ke server, menyiapkan hostname dan DNS, menjalankan install.sh, lalu menjawab puluhan pertanyaan interaktif di zmsetup.pl satu per satu. Ulangi proses ini untuk setiap server, dan satu salah ketik bisa membuat Anda mengulang dari awal.

Di artikel ini saya akan menceritakan rancangan saya, bagaimana saya membangun sebuah dashboard yang menginstalasi Zimbra secara otomatis ke server target, cukup dengan mengisi parameter wajib lewat form. Mesin di belakangnya adalah Ansible. Dashboard mendukung dua edisi: Zimbra OSE (Open Source Edition) dan Zimbra NE (Network Edition).

Kenapa Ansible?

Ansible cocok untuk kasus ini karena beberapa alasan:

  • Agentless. Tidak perlu memasang apa pun di server target; cukup akses SSH dan Python (sudah ada di hampir semua distro Linux).
  • Idempotent. Menjalankan ulang playbook tidak merusak yang sudah benar — sangat penting untuk instalasi yang panjang.
  • Deklaratif. Anda mendeskripsikan kondisi akhir yang diinginkan, bukan urutan perintah manual.
  • Mudah dipasangkan dengan dashboard. Dashboard cukup men-generate file variabel dan inventory, lalu memanggil ansible-playbook.

Arsitektur Solusi

Alur kerjanya sederhana:

[ Dashboard (form) ]
        │  generate
        ▼
group_vars/all.yml  +  inventory/hosts.ini
        │  trigger
        ▼
ansible-playbook site.yml
        │  SSH
        ▼
[ Server target: Zimbra terpasang ]

Dashboard hanya bertugas mengumpulkan parameter dari user, menuliskannya ke dua file, lalu menjalankan playbook. Seluruh logika instalasi hidup di dalam Ansible.

Metode Instalasi Unattended

Kunci otomasi Zimbra adalah membuat installer yang biasanya interaktif menjadi unattended. Saya mengikuti pendekatan resmi dari repo Zimbra (zinstaller), yang terbagi dua fase:

Fase 1 — Install software saja. Jalankan installer dengan flag software-only dan suplai jawaban lewat answer file:

./install.sh -s < keystroke_answers

Fase 2 — Konfigurasi unattended. Setelah paket terpasang, jalankan setup dengan file konfigurasi, bukan wizard interaktif:

/opt/zimbra/libexec/zmsetup.pl -c /tmp/zim-install-config

File zim-install-config berisi key konfigurasi resmi Zimbra (hostname, domain, password admin, komponen yang diaktifkan, dan seterusnya). Template inilah yang diisi dari parameter dashboard.

Perbedaan OSE vs NE

Bedanya terutama pada lisensi:

  • OSE — tidak butuh lisensi sama sekali.
  • NE 10.1.x — aktivasi memakai license KEY via zmlicense -a <key>.
  • NE ≤ 10.0 — memakai file lisensi (license.xml) yang ditunjuk lewat variabel LICENSEFILE.

Dashboard cukup menampilkan field lisensi secara kondisional ketika user memilih edisi NE.

Struktur Project Ansible

instaru/
├── site.yml
├── inventory/
│   └── hosts.ini
├── group_vars/
│   └── all.yml          # semua parameter wajib di sini
├── roles/
│   ├── preflight/       # cek hostname, DNS, resource, swap
│   ├── zimbra_install/  # download, install.sh -s
│   └── zimbra_config/   # render config, zmsetup.pl -c
└── templates/
    └── zim-install-config.j2

Parameter wajib (group_vars/all.yml)

Inilah variabel yang dikumpulkan dashboard dari user:

# Identitas
zimbra_edition: "ose"          # ose | ne
zimbra_version: "10.1.0"
zimbra_hostname: "mail.example.com"
zimbra_domain: "example.com"

# Kredensial
admin_password: "{{ vault_admin_password }}"
ldap_password: "{{ vault_ldap_password }}"

# Lisensi (hanya untuk NE)
zimbra_license_key: ""         # NE 10.1.x
zimbra_license_file: ""        # NE <=10.0

# Komponen
enable_proxy: true
enable_spell: true
timezone: "Asia/Jakarta"

Simpan semua password di Ansible Vault, jangan plaintext. Dashboard bisa mengenkripsi nilai sensitif sebelum menulisnya ke file.

Inventory & topologi

Topologi dipilih lewat grup inventory. Untuk single-server semua peran di satu host; untuk multi-server, peran dipecah dan LDAP harus diinstall pertama.

# Single server

[zimbra_single]
mail.example.com 

atau

# Multi-server

[zimbra_ldap]
ldap.example.com

[zimbra_store] (mailbox/mbox)
store.example.com

[zimbra_mta]
mta.example.com

[zimbra_proxy]
proxy.example.com

Playbook Utama

# site.yml
- name: Validasi & persiapan server
  hosts: all
  become: true
  roles:
    - preflight

- name: Install & konfigurasi Zimbra
  hosts: all
  become: true
  roles:
    - zimbra_install
    - zimbra_config

Role preflight penting: ia memvalidasi bahwa hostname FQDN sudah benar, DNS A dan MX sudah resolve, RAM mencukupi, dan swap tersedia — kesalahan paling umum pada instalasi Zimbra ada di tahap ini, jadi lebih baik gagal cepat sebelum installer berjalan.

Catatan dependensi: playbook ini membutuhkan koleksi community.general dan ansible.posix. Pasang dengan:

ansible-galaxy collection install community.general ansible.posix

Menjalankannya

Dari dashboard, eksekusi akhirnya sesederhana ini:

ansible-playbook -i inventory/hosts.ini site.yml --ask-vault-pass

Dashboard menjalankan perintah ini sebagai background job, lalu menampilkan progres dengan men-stream output Ansible kembali ke UI. User cukup menunggu sampai status berubah menjadi selesai.

Penutup

Jika ini berhasil, maka saya tinggal membuat dashboard terintegrasi yang dapat melakukan instalasi zimbra hanya dengan beberapa input saja (ip, hostname, dll) dan akses ssh ke server target.

Langkah pengembangan berikutnya yang saya rencanakan: validasi parameter real-time di sisi dashboard, dukungan rollback otomatis bila instalasi gagal di tengah jalan, dan template multi-server siap pakai.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *