Bash Scripting — Automatizácia pre DevOps
Bash je predvolený shell na väčšine Linuxových systémov a základný automatizačný nástroj. Každý DevOps inžinier musí vedieť písať spoľahlivé skripty — od jednoduchých one-linerov po komplexné deployment pipeline.
Základy robustného skriptu
Každý produkčný skript by mal začínať takto:
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
Čo to robí:
set -e— skript sa zastaví pri prvej chybeset -u— neexistujúca premenná = chyba (žiadne tiché prázdne stringy)set -o pipefail— chyba v pipe sa propaguje (nie len posledný príkaz)IFS=$'\n\t'— bezpečnejšie delimitery pre for cykly
Premenné a parametre
# Premenné s default hodnotami
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
ENVIRONMENT="${1:?Error: environment argument required}"
# Readonly premenné
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly LOG_FILE="/var/log/deploy.log"
Funkcie a error handling
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
cleanup() {
local exit_code=$?
log "Cleanup: removing temp files"
rm -rf "${TEMP_DIR:-}"
exit "$exit_code"
}
trap cleanup EXIT ERR
die() {
log "FATAL: $*" >&2
exit 1
}
# Použitie
check_dependency() {
command -v "$1" &>/dev/null || die "$1 nie je nainštalovaný"
}
check_dependency docker
check_dependency jq
Praktické vzory
Bezpečné spracovanie súborov
# Nikdy nepoužívaj `for f in $(ls)` — zlyhá na medzerách
while IFS= read -r -d '' file; do
echo "Processing: $file"
done < <(find /data -name "*.csv" -print0)
Retry logika
retry() {
local max_attempts="${1:-3}"
local delay="${2:-5}"
shift 2
local attempt=1
until "$@"; do
if (( attempt >= max_attempts )); then
die "Command failed after $max_attempts attempts: $*"
fi
log "Attempt $attempt failed, retrying in ${delay}s..."
sleep "$delay"
(( attempt++ ))
done
}
retry 3 5 curl -sf https://api.example.com/health
Paralelné spracovanie
# Parallel execution s limitom
MAX_JOBS=4
for server in "${SERVERS[@]}"; do
deploy_to "$server" &
# Počkaj ak beží príliš veľa jobov
(( $(jobs -rp | wc -l) >= MAX_JOBS )) && wait -n
done
wait
Debugging
# Zapnúť debug výpis
set -x # alebo bash -x script.sh
# Debug len časti skriptu
set -x
problematic_function
set +x
# Verbose mód
bash -v script.sh
Best Practices
- Vždy
set -euo pipefail— nikdy nie bez toho v produkcii - Quoting:
"$variable"— vždy v úvodzovkách, okrem špeciálnych prípadov - Používaj funkcie — čitateľnejšie a testovateľnejšie
- Trap na cleanup — dočasné súbory, lock files, notifikácie
- ShellCheck —
shellcheck script.shodhalí bežné chyby - Loguj všetko — timestamp + stdout aj stderr do log súboru
- Ak je skript > 200 riadkov — zvá Python alebo Go
Bash je rýchly a všade dostupný. Nauč sa ho písať bezpečne a automatizuj všetko, čo sa opakuje.