Service

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

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: started memastikan service berjalan; enabled: true memastikan aktif saat boot — atur keduanya sekaligus untuk konfigurasi yang lengkap.
  • reloaded lebih aman dari restarted untuk produksi — tidak ada downtime karena service tidak berhenti sepenuhnya.
  • Selalu gunakan daemon_reload: true saat mendeploy atau mengubah unit file systemd sebelum restart service.
  • Gunakan wait_for atau health check dengan until setelah 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: false saat menggunakan module systemd hanya untuk membaca status — agar tidak menandai task sebagai “changed”.

← Sebelumnya: Package   Berikutnya: Copy Module →

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