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之间选择时,参考以下决策树:

  1. 需要直接调用系统命令 → Bash优先
  2. 涉及复杂数据处理 → Python更优
  3. 需要跨平台支持 → Python更合适
  4. 要求快速编写临时脚本 → Bash更方便

典型案例对比

  • 日志分析:Python的Pandas库处理效率比Bash快10倍以上
  • 文件操作:Bash的管道组合比Python代码更简洁
  • 并发处理:Python的asyncio比Bash更可控

5. 实践中的避坑指南

  1. 文件锁机制:批量操作时使用flock防止并发冲突
# Bash文件锁示例
(
    flock -x 200
    # 临界区操作
    echo "Writing log..." >> app.log
) 200>/var/lock/mylock
  1. 超时控制:所有远程操作必须设置超时
# Python请求超时设置
import requests
try:
    response = requests.get('http://service/api', timeout=3)
except requests.Timeout:
    log_error("API响应超时")
  1. 环境隔离:Python虚拟环境必须使用
# 创建隔离环境
python -m venv /opt/scripts/env
source /opt/scripts/env/bin/activate
pip install -r requirements.txt

6. 智能运维的未来展望

最新技术动态显示,运维脚本正朝着这些方向发展:

  • 声明式语法(如Ansible)逐步取代命令式脚本
  • 容器化封装使脚本依赖管理更简单
  • Serverless架构催生事件驱动型脚本
  • AI辅助的脚本生成工具开始进入实用阶段

专家建议

  • 每季度审查现有脚本
  • 建立脚本版本管理体系
  • 开发通用的运维函数库
  • 定期进行脚本性能压测