Service #
Menginstal package adalah setengah pekerjaan — memastikan service-nya berjalan, dikonfigurasi dengan benar, dan aktif kembali setelah server reboot adalah bagian yang sama pentingnya. Module systemd Ansible menyediakan kontrol lengkap atas service: memulai, menghentikan, merestart, mengaktifkan saat boot, dan men-deploy unit file kustom. Memahami nuansanya mencegah restart service yang tidak perlu atau service yang diam-diam tidak berjalan.
Operasi Dasar Service #
# Pastikan service berjalan
- name: Pastikan nginx berjalan
systemd:
name: nginx
state: started
# Pastikan service berhenti
- name: Hentikan service yang tidak diperlukan
systemd:
name: snapd
state: stopped
enabled: false # Nonaktifkan juga agar tidak start saat boot
# Restart service
- name: Restart aplikasi setelah konfigurasi berubah
systemd:
name: myapp
state: restarted
# Reload konfigurasi tanpa restart penuh (lebih aman untuk service produksi)
- name: Reload konfigurasi nginx
systemd:
name: nginx
state: reloaded
Perbedaan restart vs reloaded #
Memilih antara restarted dan reloaded berdampak pada downtime:
state: restarted
→ Stop service sepenuhnya
→ Start service dari awal
→ Semua koneksi aktif terputus
→ Ada window downtime singkat
state: reloaded
→ Kirim signal SIGHUP ke service
→ Service membaca ulang konfigurasi tanpa berhenti
→ Koneksi aktif tetap berjalan
→ Tidak ada downtime (zero-downtime reload)
# Gunakan reloaded untuk service yang mendukungnya (nginx, postgresql, dll.)
- name: Reload nginx setelah perubahan konfigurasi
systemd:
name: nginx
state: reloaded # Lebih aman dari restarted untuk produksi
# Gunakan restarted untuk service yang tidak mendukung reload
# atau saat perubahan konfigurasi memerlukan restart penuh
- name: Restart aplikasi Python (tidak mendukung hot reload)
systemd:
name: myapp
state: restarted
Kombinasi state dan enabled #
state mengontrol kondisi service saat ini, sedangkan enabled mengontrol apakah service aktif saat boot. Keduanya independen:
# Pola yang paling umum: jalankan sekarang + aktifkan saat boot
- name: Mulai dan aktifkan nginx
systemd:
name: nginx
state: started
enabled: true
# Service berjalan sekarang tapi tidak aktif saat boot
# (jarang digunakan di produksi)
- name: Jalankan service sementara
systemd:
name: myservice
state: started
enabled: false
# Nonaktifkan service: hentikan sekarang dan jangan start saat boot
- name: Nonaktifkan service yang tidak diperlukan
systemd:
name: bluetooth
state: stopped
enabled: false
Reload daemon setelah Perubahan Unit File #
Saat kamu mendeploy atau mengubah file .service di /etc/systemd/system/, systemd perlu di-reload agar mengenali perubahan tersebut:
- name: Deploy custom unit file untuk aplikasi
template:
src: myapp.service.j2
dest: /etc/systemd/system/myapp.service
owner: root
group: root
mode: '0644'
notify: Reload systemd dan restart aplikasi
handlers:
- name: Reload systemd dan restart aplikasi
systemd:
name: myapp
state: restarted
daemon_reload: true # Reload systemd daemon sebelum restart
enabled: true
{# templates/myapp.service.j2 #}
[Unit]
Description={{ app_name }} Application Server
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User={{ app_user }}
WorkingDirectory={{ app_dir }}
ExecStart={{ app_dir }}/venv/bin/gunicorn \
--workers {{ app_workers | default(4) }} \
--bind 127.0.0.1:{{ app_port }} \
--log-file {{ app_log_dir }}/gunicorn.log \
app:application
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Menunggu Service Siap #
Setelah (re)start service, ada jeda sebelum service benar-benar siap menerima koneksi. Jangan langsung lanjutkan ke task berikutnya tanpa memverifikasi:
- name: Restart PostgreSQL
systemd:
name: postgresql
state: restarted
- name: Tunggu PostgreSQL siap menerima koneksi
wait_for:
port: 5432
host: 127.0.0.1
delay: 2 # Tunggu 2 detik sebelum mulai cek
timeout: 30 # Timeout setelah 30 detik
state: started
- name: Jalankan migrasi database
command: python manage.py migrate
# Aman karena kita sudah tahu PostgreSQL siap
# Untuk service yang tidak membuka port tapi expose health endpoint
- name: Restart aplikasi
systemd:
name: myapp
state: restarted
- name: Tunggu aplikasi siap (health check)
uri:
url: "http://127.0.0.1:{{ app_port }}/health"
status_code: 200
register: health_result
until: health_result.status == 200
retries: 12
delay: 5
Cek Status Service #
Gunakan module systemd dengan mode baca untuk memeriksa status tanpa mengubah apapun:
- name: Cek status nginx
systemd:
name: nginx
register: nginx_status
changed_when: false # Hanya baca, tidak mengubah apapun
- name: Debug status nginx
debug:
msg: "nginx status: {{ nginx_status.status.ActiveState }}"
- name: Peringatkan jika nginx tidak berjalan
debug:
msg: "PERINGATAN: nginx tidak aktif di {{ inventory_hostname }}!"
when: nginx_status.status.ActiveState != "active"
Ringkasan #
state: startedmemastikan service berjalan;enabled: truememastikan aktif saat boot — atur keduanya sekaligus untuk konfigurasi yang lengkap.reloadedlebih aman darirestarteduntuk produksi — tidak ada downtime karena service tidak berhenti sepenuhnya.- Selalu gunakan
daemon_reload: truesaat mendeploy atau mengubah unit file systemd sebelum restart service.- Gunakan
wait_foratau health check denganuntilsetelah restart service — jangan langsung lanjutkan sebelum service benar-benar siap.- Koordinasikan perubahan konfigurasi dan restart service menggunakan handler — handler hanya dijalankan saat ada perubahan nyata.
- Gunakan
changed_when: falsesaat menggunakan modulesystemdhanya untuk membaca status — agar tidak menandai task sebagai “changed”.