1. 当自动化运维成为刚需
凌晨三点,服务器突然报警,老张顶着黑眼圈在键盘上一通操作。这种场景在运维团队里屡见不鲜。某次周例会上,总监拍着桌子说:"我们需要的不是消防员,而是能提前预防火灾的系统!"这句话彻底点燃了我们对自动化运维的追求。
传统手工操作存在致命缺陷:人为错误难以避免、重复劳动浪费生命、响应速度永远慢半拍。某次误删数据库的经历让我们意识到——脚本就是运维工程师的防弹衣。
2. Bash脚本:轻量级运维利器(技术栈:Bash)
2.1 经典应用场景
#!/bin/bash
LOG_DIR="/var/log/myapp"
RETENTION_DAYS=7
# 删除过期日志
find $LOG_DIR -name "*.log" -mtime +$RETENTION_DAYS -exec rm -f {} \;
# 压缩昨日日志
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
find $LOG_DIR -name "*.log.$YESTERDAY" -exec gzip {} \;
# 记录操作日志
echo "[$(date)] Log rotation completed" >> $LOG_DIR/rotation.log
2.2 进阶案例:服务器批量部署
#!/bin/bash
# 批量服务器初始化脚本
IP_LIST=("192.168.1.101" "192.168.1.102" "192.168.1.103")
SSH_KEY="/root/.ssh/deploy_key"
ADMIN_USER="opsadmin"
for ip in ${IP_LIST[@]}
do
echo "Processing $ip ..."
ssh -i $SSH_KEY root@$ip <<EOF
# 创建运维账户
useradd -m -s /bin/bash $ADMIN_USER
mkdir /home/$ADMIN_USER/.ssh
cp /root/.ssh/authorized_keys /home/$ADMIN_USER/.ssh/
# 基础安全加固
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
apt update && apt upgrade -y
# 安装监控代理
wget -qO- http://monitor.com/agent.sh | bash
systemctl restart sshd
EOF
done
3. Python脚本:复杂场景救星(技术栈:Python)
3.1 系统监控与告警
#!/usr/bin/env python3
# 系统监控告警脚本
import psutil
import smtplib
from email.mime.text import MIMEText
# 告警阈值配置
THRESHOLDS = {
'cpu': 90,
'memory': 85,
'disk': 90
}
def check_system():
alerts = []
# CPU使用率检测
cpu_usage = psutil.cpu_percent(interval=1)
if cpu_usage > THRESHOLDS['cpu']:
alerts.append(f"CPU使用率异常: {cpu_usage}%")
# 内存检测
mem = psutil.virtual_memory()
if mem.percent > THRESHOLDS['memory']:
alerts.append(f"内存使用率过高: {mem.percent}%")
# 磁盘检测
disk = psutil.disk_usage('/')
if disk.percent > THRESHOLDS['disk']:
alerts.append(f"根分区使用率告警: {disk.percent}%")
return alerts
def send_alert(message):
msg = MIMEText(message)
msg['Subject'] = '系统告警通知'
msg['From'] = 'monitor@example.com'
msg['To'] = 'ops-team@example.com'
with smtplib.SMTP('smtp.example.com') as server:
server.send_message(msg)
if __name__ == "__main__":
alerts = check_system()
if alerts:
send_alert("\n".join(alerts))
print("检测到异常已发送通知")
else:
print("系统状态正常")
3.2 配置文件自动化管理
#!/usr/bin/env python3
# Nginx配置批量修改工具
import re
import os
from pathlib import Path
NGINX_CONF_DIR = "/etc/nginx/conf.d"
BACKUP_DIR = "/etc/nginx/backup"
SAFE_LIMIT = 80 # 并发连接数安全阈值
def update_worker_connections():
# 创建备份目录
Path(BACKUP_DIR).mkdir(exist_ok=True)
for conf_file in Path(NGINX_CONF_DIR).glob('*.conf'):
# 生成备份文件路径
backup_path = Path(BACKUP_DIR) / f"{conf_file.name}.bak"
# 读取并修改配置
with open(conf_file, 'r+') as f:
content = f.read()
# 使用正则表达式匹配配置项
new_content = re.sub(
r'(worker_connections\s+)\d+;',
lambda m: f"{m.group(1)}{SAFE_LIMIT};",
content
)
# 写回修改后的配置
if new_content != content:
# 创建备份
with open(backup_path, 'w') as bak:
bak.write(content)
# 写入新配置
f.seek(0)
f.truncate()
f.write(new_content)
print(f"已更新: {conf_file.name}")
if __name__ == "__main__":
update_worker_connections()
print("配置文件更新完成")
4. 技术选型的智慧抉择
在Bash和Python之间选择时,参考以下决策树:
- 需要直接调用系统命令 → Bash优先
- 涉及复杂数据处理 → Python更优
- 需要跨平台支持 → Python更合适
- 要求快速编写临时脚本 → Bash更方便
典型案例对比:
- 日志分析:Python的Pandas库处理效率比Bash快10倍以上
- 文件操作:Bash的管道组合比Python代码更简洁
- 并发处理:Python的asyncio比Bash更可控
5. 实践中的避坑指南
- 文件锁机制:批量操作时使用flock防止并发冲突
# Bash文件锁示例
(
flock -x 200
# 临界区操作
echo "Writing log..." >> app.log
) 200>/var/lock/mylock
- 超时控制:所有远程操作必须设置超时
# Python请求超时设置
import requests
try:
response = requests.get('http://service/api', timeout=3)
except requests.Timeout:
log_error("API响应超时")
- 环境隔离:Python虚拟环境必须使用
# 创建隔离环境
python -m venv /opt/scripts/env
source /opt/scripts/env/bin/activate
pip install -r requirements.txt
6. 智能运维的未来展望
最新技术动态显示,运维脚本正朝着这些方向发展:
- 声明式语法(如Ansible)逐步取代命令式脚本
- 容器化封装使脚本依赖管理更简单
- Serverless架构催生事件驱动型脚本
- AI辅助的脚本生成工具开始进入实用阶段
专家建议:
- 每季度审查现有脚本
- 建立脚本版本管理体系
- 开发通用的运维函数库
- 定期进行脚本性能压测