Idempotent Shell Script: Jalankan Berkali-kali Tanpa Bikin Berantakan


Salah satu masalah paling umum saat bikin shell script adalah: script sukses saat pertama jalan, tapi berantakan saat dijalankan kedua atau ketiga kalinya.

Di sinilah konsep idempotent jadi penting.

Sederhananya, script idempotent adalah script yang kalau dijalankan berkali-kali, hasil akhirnya tetap konsisten dan tidak menimbulkan efek samping yang tidak diinginkan.

Kenapa idempotent penting?

Dalam praktik sehari-hari, script sering dijalankan ulang karena:

  • deploy ulang setelah update
  • retry dari pipeline CI/CD
  • recovery setelah server restart
  • maintenance rutin via cron

Kalau script tidak idempotent, efeknya bisa fatal:

  • user duplicate
  • konfigurasi dobel
  • file penting ketimpa
  • service restart berlebihan

Prinsip dasar idempotent shell scripting

1) Cek dulu sebelum membuat resource

Jangan langsung membuat folder/file tanpa validasi.

mkdir -p /srv/myapp/logs

-p membuat mkdir aman dijalankan berulang.

Untuk file:

if [ ! -f /etc/myapp/config.env ]; then
  cp /etc/myapp/config.env.example /etc/myapp/config.env
fi

2) Hindari append membabi buta

Ini contoh yang sering bikin duplikasi:

echo "export APP_ENV=production" >> ~/.bashrc

Lebih aman:

grep -qxF 'export APP_ENV=production' ~/.bashrc || \
  echo 'export APP_ENV=production' >> ~/.bashrc

3) Gunakan operasi yang aman diulang

  • ln -sfn untuk symlink yang bisa di-update
  • install -d untuk memastikan direktori ada
  • rsync --delete untuk sinkronisasi state

Contoh:

ln -sfn /srv/releases/current /srv/myapp/current

4) Gunakan guard condition pada service/action

Jangan restart service kalau tidak perlu.

if systemctl is-active --quiet nginx; then
  systemctl reload nginx
else
  systemctl start nginx
fi

5) Pakai mode aman bash

set -euo pipefail

Ini membantu script fail fast saat ada error tersembunyi.

Contoh script: setup user deploy yang idempotent

#!/usr/bin/env bash
set -euo pipefail

USER_NAME="deploy"
SSH_DIR="/home/$USER_NAME/.ssh"
PUBKEY="ssh-ed25519 AAAA... your-key"

# 1) Buat user jika belum ada
if ! id -u "$USER_NAME" >/dev/null 2>&1; then
  useradd -m -s /bin/bash "$USER_NAME"
  echo "✅ User $USER_NAME dibuat"
else
  echo "ℹ️ User $USER_NAME sudah ada"
fi

# 2) Pastikan folder .ssh ada dengan permission benar
install -d -m 700 -o "$USER_NAME" -g "$USER_NAME" "$SSH_DIR"

# 3) Tambah public key hanya jika belum ada
AUTH_KEYS="$SSH_DIR/authorized_keys"
touch "$AUTH_KEYS"
chown "$USER_NAME:$USER_NAME" "$AUTH_KEYS"
chmod 600 "$AUTH_KEYS"

grep -qxF "$PUBKEY" "$AUTH_KEYS" || echo "$PUBKEY" >> "$AUTH_KEYS"

echo "✅ Setup user deploy selesai (aman dijalankan ulang)"

Pola yang sebaiknya dihindari

  • rm -rf tanpa validasi path
  • overwrite file konfigurasi tanpa backup
  • append berulang ke file yang sama
  • hardcoded credential/secrets di script

Checklist cepat sebelum script dipakai di production

  • Kalau dijalankan 2–3 kali, hasil akhir tetap sama
  • Tidak membuat data duplikat
  • Tidak memutus service yang sedang stabil
  • Ada log output yang jelas
  • Sudah dites di environment staging

Penutup

Script yang idempotent mungkin butuh sedikit usaha ekstra di awal, tapi payoff-nya besar: lebih aman, lebih bisa diprediksi, dan jauh lebih cocok untuk production.

Kalau kamu rutin bikin automasi dengan Bash, mulai biasakan mindset ini: “script boleh dijalankan kapan pun, hasil akhirnya tetap rapi.”

Itu fondasi automasi yang matang.

Komentar

Real-time

Memuat komentar...

Tulis Komentar

Email tidak akan ditampilkan

0/2000 karakter

Catatan: Komentar akan dimoderasi sebelum ditampilkan. Mohon bersikap sopan dan konstruktif.