编程语言选型
learn-a-programming-language;DevOps 脚本语言。
25 分钟
运维脚本编程基础
手动 SSH 改配置、逐台重启服务无法 scale。Bash / Python 脚本 把重复运维动作自动化:批量查端口、备份邮件队列、DNS 变更验证、健康检查。本课不要求成为开发,但需能 读、改、写 50 行以内的实用脚本。版本管理见 git-essentials,Linux 基础见 linux-essentials,网络排查见 networking-essentials,DNS 验证见 dns-essentials。
学习目标
- 编写带
set -euo pipefail的健壮 Bash 脚本 - 用 Python 调用 subprocess / socket 做端口与 SMTP 探测
- 将脚本纳入 Git 仓库并与 cron/systemd timer 集成
Bash 脚本模板
#!/bin/bash
# check-mail-ports.sh — 检查邮件相关端口是否监听
set -euo pipefail
PORTS=(25 587 993)
HOST="${1:-127.0.0.1}"
for port in "${PORTS[@]}"; do
if ss -tln | grep -q ":${port} "; then
echo "OK ${HOST}:${port} listening"
else
echo "FAIL ${HOST}:${port} not listening" >&2
exit 1
fi
done
chmod +x check-mail-ports.sh
./check-mail-ports.sh
./check-mail-ports.sh 192.168.1.10
常用运维脚本模式
备份 Postfix 队列
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/postfix"
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p "$BACKUP_DIR"
tar czf "${BACKUP_DIR}/spool-${DATE}.tar.gz" /var/spool/postfix
find "$BACKUP_DIR" -name 'spool-*.tar.gz' -mtime +7 -delete
echo "Backup done: spool-${DATE}.tar.gz"
DNS 传播检查
#!/bin/bash
set -euo pipefail
DOMAIN="${1:?usage: $0 example.com}"
for resolver in 8.8.8.8 1.1.1.1; do
echo "=== $resolver ==="
dig TXT "$DOMAIN" @"$resolver" +short | grep -i spf || echo "(no SPF)"
done
Python:SMTP 探测
#!/usr/bin/env python3
"""smtp_probe.py — 测试 SMTP Submission 端口"""
import socket
import sys
def probe(host: str, port: int = 587, timeout: float = 5.0) -> bool:
try:
with socket.create_connection((host, port), timeout=timeout):
print(f"OK {host}:{port} reachable")
return True
except OSError as e:
print(f"FAIL {host}:{port} — {e}", file=sys.stderr)
return False
if __name__ == "__main__":
host = sys.argv[1] if len(sys.argv) > 1 else "localhost"
sys.exit(0 if probe(host) else 1)