وقتی automation را برای production مینویسید، چهار مفهوم به شما کمک میکنند تا کدی قابلاتکا بسازید:
1. Repeatability — تکرارپذیری
یک automation خوب باید هر بار که اجرا میشود، نتیجهٔ یکسان بدهد. اگر اسکریپت شما امروز کار میکند اما فردا با همان ورودی خطا میدهد، قابلاعتماد نیست.
مثال بد:
1# فقط وابسته به زمان اجرا — امکان دارد در روزهای بعد overwrite کند 2backup_file="backup-$(date +%H%M).tar.gz"3tar -czf "$backup_file" /var/www
مثال خوب:
1# نام فایل از timestamp کامل ساخته میشود2backup_file="backup-$(date +%Y%m%d-%H%M%S).tar.gz"3tar -czf "/backups/$backup_file" /var/www ||exit14echo"Backup created: $backup_file"
2. Consistency — یکنواختی
یکنواختی یعنی در محیطهای مختلف رفتار یکسان داشته باشید. اسکریپتی که روی لپتاپ شما کار میکند اما روی سرور production شکست میخورد، مشکل consistency دارد.
راهحل:
از مسیرهای مطلق استفاده کنید
dependencyها را چک کنید
محیط را بهصورت صریح تنظیم کنید
1#!/usr/bin/env bash
2set -euo pipefail
3 4# چک کردن ابزارهای مورد نیاز 5for cmd in git systemctl nginx;do 6if ! command -v "$cmd"&>/dev/null;then 7echo"ERROR: $cmd not found" >&2 8exit1 9fi10done1112# استفاده از مسیر مطلق13APP_DIR="/opt/myapp"14cd"$APP_DIR"||exit11516# محیط صریح17exportPATH="/usr/local/bin:/usr/bin:/bin"
3. Idempotency — تکنتیجهبودن
Idempotency یعنی اجرای چندباره یک عملیات، همان نتیجهٔ یکبار اجرا را میدهد. این مفهوم در automation بسیار مهم است چون اجازه میدهد اسکریپت را بدون نگرانی از عوارض جانبی دوباره اجرا کنید.
مثال non-idempotent:
1# هر بار یک خط اضافه میشود2echo"nameserver 8.8.8.8" >> /etc/resolv.conf
مثال idempotent:
1# فقط اگر وجود نداشته باشد، اضافه میشود2if ! grep -q "nameserver 8.8.8.8" /etc/resolv.conf;then3echo"nameserver 8.8.8.8" >> /etc/resolv.conf
4fi
یک مثال واقعیتر:
1#!/usr/bin/env bash
2set -euo pipefail
3 4# ایجاد کاربر — فقط اگر وجود نداشته باشد 5if ! id myuser &>/dev/null;then 6 useradd -r -s /usr/sbin/nologin myuser
7echo"User created" 8else 9echo"User already exists"10fi1112# ایجاد دایرکتوری — idempotent است13mkdir -p /opt/myapp/data
1415# نصب پکیج — package manager خودش idempotent است16apt-get install -y nginx
Idempotency به شما اجازه میدهد اسکریپت را در CI/CD یا بهعنوان بخشی از recovery اجرا کنید بدون اینکه نگران تغییرات ناخواسته باشید.
4. Failure Handling — مدیریت خطا
سیستمهای واقعی همیشه کامل نیستند: شبکه میتواند قطع شود، دیسک پر شود، سرویس پاسخ ندهد. یک automation خوب باید خطاهای قابل پیشبینی را مدیریت کند: