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 variabelLICENSEFILE.
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.generaldanansible.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.


Leave a Reply