Linux adalah rumah bagi hampir semua server produksi, dan scripting adalah bahasa otomasinya; di episode ini kalian memperdalam administrasi Linux (proses, service, networking) lalu membangun skrip Bash dan Python yang berakhir pada sebuah script deploy sederhana

Setelah di episode 2 kita memetakan arsitektur DevOps, sekarang saatnya membangun fondasi paling praktis: Linux dan scripting. Mengapa ini menjadi pembuka fase praktik? Karena setiap komponen arsitektur DevOps — pipeline, container, cluster, cloud — pada akhirnya hanyalah sekumpulan proses Linux yang diotomasi. Kalian akan mengotomasi server dengan Bash, menulis logika kompleks dengan Python, dan membuat semua tool lain bekerja.
Episode ini bukan pengganti series belajar Linux yang lengkap, melainkan filter: apa saja yang paling sering dipakai DevOps Engineer setiap hari, dan bagaimana membangun script pertama yang benar-benar berguna.
Setiap layanan di server adalah proses. Kalian wajib bisa menemukan proses, melihat resource-nya, dan menghentikannya:
ps aux | grep nginx
top -b -n 1 | head -15
kill -9 <PID>Sebagian besar distro modern memakai systemd. Unit service dideskripsikan dalam file unit, dan diatur dengan systemctl:
sudo systemctl status nginx
sudo systemctl enable --now nginx
sudo systemctl restart nginx
systemctl is-active nginxMemahami unit file penting karena di episode 7 dan 10 kalian akan memakainya lagi (di dalam container dan lewat Ansible).
Diagnosis "aplikasi tidak bisa diakses" hampir selalu berujung pada port atau firewall:
ss -tlnp
curl -v http://localhost:8080
sudo ufw statusss -tlnp menunjukkan port yang sedang listen, curl -v menunjukkan proses handshake HTTP, dan ufw status mengecek firewall.
journalctl -u nginx -n 50 --no-pager
journalctl -f -u nginx
tail -n 20 /var/log/nginx/error.logBash adalah bahasa glue DevOps. Sebuah script yang baik punya tiga sifat: idempotent (jalan berulang aman), exit code yang jujur, dan output yang informatif.
#!/usr/bin/env bash
set -euo pipefail
APP_DIR="/opt/myapp"
BACKUP_DIR="/var/backups/myapp"
echo "Membuat direktori..."
mkdir -p "$APP_DIR" "$BACKUP_DIR"
echo "Menyalin file aplikasi..."
cp -r ./app/* "$APP_DIR/"
echo "Backup konfigurasi lama..."
cp "$APP_DIR/.env" "$BACKUP_DIR/.env.bak"
echo "Selesai."set -euo pipefail adalah tiga pengaman yang wajib di setiap script: berhenti saat error (-e), error saat variabel tak terdefinisi (-u), dan mendeteksi kegagalan di tengah pipeline (-o pipefail). Tanpa ini, script yang "gagal" bisa tetap melanjutkan ke langkah berikutnya — musuh terbesar otomasi.
Bash tetap dipakai untuk tugas singkat, tetapi saat logika mulai kompleks — parsing JSON, berinteraksi dengan API, parallel task — Python jauh lebih produktif. Python juga menjadi bahasa utama banyak tool DevOps (Ansible, Terraform plugin, SDK cloud).
import subprocess
import sys
services = ["nginx", "postgresql"]
def is_active(name: str) -> bool:
result = subprocess.run(
["systemctl", "is-active", "--quiet", name]
)
return result.returncode == 0
failed = []
for svc in services:
if is_active(svc):
print(f"[OK] {svc} aktif")
else:
print(f"[FAIL] {svc} tidak aktif")
failed.append(svc)
sys.exit(1 if failed else 0)Perhatikan pola pentingnya: script di atas memeriksa status alih-alih langsung mengasumsikan, dan mengembalikan exit code non-zero saat ada kegagalan. Ini membuatnya layak dipakai sebagai health check dalam pipeline CI (episode 5).
Sekarang kita gabungkan: sebuah script deploy yang (1) mengambil versi terbaru dari Git, (2) menjalankan build, (3) menghentikan service lama, (4) memulai service baru, dan (5) mengecek hasilnya.
#!/usr/bin/env bash
set -euo pipefail
SERVICE="myapp"
BRANCH="main"
echo "[1/5] Pull kode terbaru..."
git pull origin "$BRANCH"
echo "[2/5] Build..."
npm ci && npm run build
echo "[3/5] Hentikan service lama..."
sudo systemctl stop "$SERVICE"
echo "[4/5] Pasang build baru..."
sudo cp -r build/ /opt/myapp/
sudo systemctl start "$SERVICE"
echo "[5/5] Verifikasi..."
sleep 3
if systemctl is-active --quiet "$SERVICE"; then
echo "Deploy $BRANCH berhasil."
else
echo "Deploy gagal!" >&2
exit 1
fiWarning
Script di atas berguna untuk satu server, tetapi memiliki kelemahan klasik yang nanti kita selesaikan sepanjang series: tidak ada rollback otomatis, state-nya tidak terpusat, dan berjalan manual. Episode 6 (CD), episode 9 (Terraform), dan episode 10 (Ansible) adalah evolusi natural dari script semacam ini.
set -euo pipefail — kegagalan diam-diam adalah bencana dalam otomasi.Inti yang harus dibawa pulang:
set -euo pipefail.Di episode 4 selanjutnya kita membahas version control & Git workflow — karena semua otomasi yang kita tulis harus hidup di repository, direview, dan bisa dilacak. Git adalah sumber kebenaran untuk seluruh siklus DevOps.