Mengotomasi tugas berulang dengan Bash dan Python, menjadwalkan dengan cron, serta menerapkan pola scripting yang aman dan bisa diandalkan untuk operasi server sehari-hari

Di episode 7 kita melihat bagaimana container dan VM mengeksekusi workload. Sekarang kita membahas senjata utama yang membuat seorang System Engineer bekerja 100x lebih produktif daripada sysadmin manual: scripting & automation. Server yang dikonfigurasi klik demi klik adalah pekerjaan yang tidak scalable; script mengubah pekerjaan manual menjadi sesuatu yang bisa dijalankan, diulang, dan diaudit.
Mengapa episode ini penting? Karena automation adalah garis pembatas antara sysadmin dan System Engineer. Jika pekerjaan kalian masih "ketik perintah yang sama di 50 server", kalian belum melakukan pekerjaan System Engineer — kalian baru menyalin. Episode ini mengajarkan fondasi scripting Bash/Python dan penjadwalan dengan cron, yang akan menjadi bahan bakar semua otomasi di episode-episode berikutnya.
Sebuah script Bash yang baik selalu diawali shebang, dibuat executable, dan menangani error:
#!/bin/bash
set -euo pipefail
DB_USER="backup"
DB_NAME="appdb"
BACKUP_DIR="/backup/postgres"
mkdir -p "$BACKUP_DIR"
timestamp=$(date +%Y%m%d-%H%M%S)
pg_dump -U "$DB_USER" "$DB_NAME" > "$BACKUP_DIR/app-$timestamp.sql"
if [ $? -eq 0 ]; then
echo "[OK] Backup selesai: app-$timestamp.sql"
else
echo "[ERROR] Backup gagal"
exit 1
fi
find "$BACKUP_DIR" -name "app-*.sql" -mtime +30 -delete
echo "[INFO] Rotasi backup 30 hari selesai"Baris set -euo pipefail adalah salah satu baris paling penting dalam scripting Bash:
| Opsi | Arti |
|---|---|
-e | Hentikan script saat ada perintah gagal |
-u | Error jika variabel yang tidak terdefinisi dipakai |
-o pipefail | Gagal jika ada bagian dalam pipeline yang gagal |
Tanpa set -e, script yang perintah tengahnya gagal akan tetap "sukses" — sumber bug paling berbahaya dalam otomasi.
Bash ideal untuk orkestrasi perintah; Python lebih nyaman untuk parsing, manipulasi data, dan API. Contoh mengecek kesehatan beberapa server:
#!/usr/bin/env python3
import socket
import sys
HOSTS = ["web01", "web02", "db01"]
PORT = 443 if len(sys.argv) < 2 else int(sys.argv[1])
failed = 0
for host in HOSTS:
try:
with socket.create_connection((host, PORT), timeout=3):
print(f"[OK] {host}:{PORT} terbuka")
except OSError as err:
print(f"[FAIL] {host}:{PORT} - {err}")
failed += 1
sys.exit(1 if failed else 0)Pola yang penting: script mengembalikan exit code yang benar — 0 sukses, selain itu gagal. Ini membuat script bisa dirantai dan dipantau oleh cron.
Tip
Logika yang sama bisa ditulis di Bash dan Python — pilih berdasarkan tugasnya. Aturan praktis: jika butuh banyak parsing teks/JSON dan kondisi kompleks, pakai Python; jika hanya orkestrasi perintah shell, Bash lebih ringkas. Yang terpenting: script harus deterministik dan exit code-nya benar.
cron menjalankan tugas pada waktu tertentu. Sintaksnya: menit jam hari-bulan bulan hari-minggu perintah.
# Menit(0-59) Jam(0-23) Day(1-31) Month(1-12) Weekday(0-7) Command
15 2 * * * /usr/local/bin/backup-db.sh # setiap hari 02:15
0 */6 * * * /usr/local/bin/healthcheck.py # setiap 6 jam
30 4 * * 0 /usr/local/bin/weekly-report.sh # Minggu 04:30Kelola jadwal dengan crontab -e (user) atau file di /etc/cron.d/ (sistem). Penting: jangan pakai path relatif dan jangan mengandalkan env user — cron berjalan dengan environment minimal. Selalu pakai path absolut dan set variabel penting di dalam script.
Script cron yang output-nya hilang saat gagal adalah jebakan. Selalu redirect log:
15 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup.log 2>&1Baris di atas menangkap semua output (stdout + stderr) ke file log. Untuk monitoring otomatis, tambahkan notifikasi di dalam script saat terjadi kegagalan.
cron masih dominan, tetapi systemd timers menawarkan keunggulan: penanganan log via journalctl, dependensi antar unit, dan status yang bisa di-query. Contoh:
[Unit]
Description=Jadwal backup harian
[Timer]
OnCalendar=*-*-* 02:15:00
Persistent=true
[Install]
WantedBy=timers.targetsudo systemctl enable --now backup.timer
systemctl list-timersPersistent=true berarti jika server mati saat jadwal tiba, timer tetap dijalankan setelah nyala kembali — perbedaan besar dengan cron yang melewatkan tugas saat server down.
| Task | Tool | Contoh |
|---|---|---|
| Backup database | Bash + cron | pg_dump harian |
| Pembersihan log | Bash + logrotate | Rotasi & kompresi log |
| Cek kesehatan | Python + cron | Socket check multi-host |
| Notifikasi | curl ke webhook | Slack/Discord alert |
| Provising server | Ansible | Episode 9 |
Satu prinsip: idempotent. Script otomasi sebaiknya aman dijalankan ulang — menjalankannya dua kali memberikan hasil yang sama dengan satu kali. Prinsip ini menjadi inti episode 9 (configuration management).
Skenario: gabungkan script + cron untuk backup database harian.
# 1. Buat script (lihat backup-db.sh di atas)
sudo chmod +x /usr/local/bin/backup-db.sh
# 2. Uji manual
sudo /usr/local/bin/backup-db.sh
# 3. Jadwalkan + log
(crontab -l; echo "15 2 * * * /usr/local/bin/backup-db.sh >> /var/log/backup.log 2>&1") | crontab -
crontab -lset -euo pipefail — kegagalan diabaikan diam-diam../backup.sh tidak ditemukan karena working directory berbeda.>/dev/null 2>&1 menyembunyikan bukti kegagalan.Inti yang harus dibawa pulang:
set -euo pipefail, path absolut, exit code yang benar.Di episode 9 selanjutnya kita membawa otomasi ke skala besar: configuration management dengan Ansible — idempotency, provisioning, dan mengelola ratusan server dari satu file. Sampai jumpa di episode 9!