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 -sfnuntuk symlink yang bisa di-updateinstall -duntuk memastikan direktori adarsync --deleteuntuk 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 -rftanpa 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
Memuat komentar...
Tulis Komentar