哪些实用脚本适合运维工程师?

wen 实用脚本 6

本文目录导读:

哪些实用脚本适合运维工程师?

  1. 第一类:系统监控与巡检(日常任务)
  2. 第二类:自动化部署与配置(DevOps 效率)
  3. 第三类:数据备份与恢复(容灾)
  4. 第四类:网络与安全辅助
  5. 第五类:日志与数据处理(分析)
  6. 推荐脚本开发习惯

这个问题问得很好,运维工程师的核心工作就是“自动化一切”,一个好的脚本可以大大减少重复劳动、避免人为错误。

以下分类整理了运维工程师最常用、最实用的脚本场景和具体实现思路,涵盖 Shell 和 Python 两种主流语言。


第一类:系统监控与巡检(日常任务)

这类脚本通常由 crontab 定时触发,发送告警或生成报告。

  1. 磁盘空间监控

    • 场景:当磁盘使用率超过阈值(如 80%)时,自动清理日志或发送告警。
    • Shell 极简版
      #!/bin/bash
      threshold=80
      df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output;
      do
        usage=$(echo $output | awk '{print $1}' | sed 's/%//g')
        partition=$(echo $output | awk '{print $2}')
        if [ $usage -ge $threshold ]; then
          echo "Warning: $partition is at ${usage}%"
          # 可以在这里添加 curl 或 mail 命令发送警报
        fi
      done
  2. 服务进程存活检查

    • 场景:确保 Nginx、MySQL、Redis 等核心服务一直在运行,如果挂了自动重启。
    • Shell 版
      #!/bin/bash
      service_name="nginx"
      if ! pgrep -x "$service_name" > /dev/null; then
          echo "$service_name is down. Attempting restart..."
          systemctl restart $service_name
          # 记录日志
          echo "$(date): $service_name restarted" >> /var/log/service_check.log
      fi
  3. 日志分析和错误告警

    • 场景:实时监控应用日志,发现 ERROR 或 FATAL 关键字立即通知。
    • Shell 版(结合 tail 和 grep)
      tail -F /var/log/app/error.log | while read line; do
          if echo "$line" | grep -iE "error|fatal|exception"; then
              echo "ALERT: $line"
              # 发送到钉钉/飞书/微信机器人
              curl -X POST -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"'"$line"'"}}' http://your-webhook-url
          fi
      done

第二类:自动化部署与配置(DevOps 效率)

这是运维脚本的核心价值,能极大提升发布效率。

  1. 代码发布脚本

    • 场景:从 Git 拉取代码,执行构建,备份旧版本,切换到新版本,平滑重启服务。

    • Shell 重点代码段

      #!/bin/bash
      PROJECT_DIR="/app/web"
      BACKUP_DIR="/backup/web"
      BRANCH="main"
      DATE=$(date +%Y%m%d%H%M%S)
      # 1. 进入目录,拉取最新代码
      cd $PROJECT_DIR || exit
      git pull origin $BRANCH
      # 2. 备份当前版本(可选)
      cp -r $PROJECT_DIR $BACKUP_DIR/web_$DATE
      # 3. 执行构建(如果是前端项目)
      npm install && npm run build
      # 4. 复制构建产物到服务目录(如果目录结构不同)
      cp -r dist/* /var/www/html/
      # 5. 重启 Nginx(确保无语法错误)
      nginx -t && systemctl reload nginx
      echo "Deployment completed at $DATE"
  2. 批量远程操作脚本(SSH 免密)

    • 场景:对 100 台服务器执行同样的命令(如更新 hosts 文件、安装 agent)。
    • Shell 版(基于循环)
      #!/bin/bash
      # 假设在 server_list.txt 文件中,每行一个 IP
      for host in $(cat server_list.txt)
      do
          echo "=== Operating on $host ==="
          ssh -o StrictHostKeyChecking=no root@$host "systemctl restart network; echo 'Done on $host'"
      done
    • 更专业的替代:推荐使用 ansiblepssh,但纯 Shell 脚本在无 Python 环境时非常有用。

第三类:数据备份与恢复(容灾)

  1. MySQL 数据库分库备份

    • 场景:每天凌晨备份所有数据库,每个库存成一个文件,并保留最近 7 天。

    • Shell 版

      #!/bin/bash
      DB_USER="root"
      DB_PASS="your_password"
      BACKUP_DIR="/backup/mysql"
      DATE=$(date +%Y-%m-%d)
      RETENTION_DAYS=7
      mkdir -p $BACKUP_DIR/$DATE
      # 获取所有数据库列表(排除系统库)
      databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema|mysql|sys")
      for db in $databases; do
          echo "Backing up $db..."
          mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers --events $db | gzip > $BACKUP_DIR/$DATE/${db}.sql.gz
      done
      # 删除7天前的备份
      find $BACKUP_DIR/* -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
      echo "Backup completed at $(date)"
  2. 大文件上传备份到对象存储

    • 场景:备份包太大,本地放不下,自动上传到阿里云 OSS / 腾讯云 COS / AWS S3。

    • Python 版(使用 boto3)

      import os
      import boto3
      from botocore.client import Config
      # 配置
      ACCESS_KEY = 'your_key'
      SECRET_KEY = 'your_secret'
      ENDPOINT = 'https://oss-cn-hangzhou.aliyuncs.com'  # 示例
      BUCKET_NAME = 'my-backup-bucket'
      LOCAL_FILE = '/backup/db_backup.sql.gz'
      REMOTE_FILE = 'backups/db_backup_$(date +%Y%m%d).sql.gz'
      # 上传
      client = boto3.client('s3',
                            aws_access_key_id=ACCESS_KEY,
                            aws_secret_access_key=SECRET_KEY,
                            endpoint_url=ENDPOINT,
                            config=Config(signature_version='s3v4'))
      try:
          client.upload_file(LOCAL_FILE, BUCKET_NAME, REMOTE_FILE)
          print(f"Successfully uploaded {LOCAL_FILE} to {BUCKET_NAME}/{REMOTE_FILE}")
      except Exception as e:
          print(f"Upload failed: {e}")

第四类:网络与安全辅助

  1. 批量端口扫描

    • 场景:巡检防火墙有没有漏开放端口,或者检查服务器监听了哪些端口。

    • Shell 版

      #!/bin/bash
      NETWORK="192.168.1"
      PORTS="22,80,443,3306,6379"
      for i in {1..254}
      do
          host="$NETWORK.$i"
          echo "Scanning $host..."
          for port in $(echo $PORTS | tr ',' ' '); do
              timeout 1 bash -c "echo >/dev/tcp/$host/$port" 2>/dev/null && \
              echo "$host:$port is open"
          done
      done
    • 更专业的替代nmapmasscan

  2. IP 黑白名单管理

    • 场景:发现恶意 IP,通过脚本快速添加 iptables 或 firewalld 规则。

    • Shell 版

      #!/bin/bash
      # 用法: ./block_ip.sh 192.168.1.100
      IP_TO_BLOCK=$1
      if [ -z "$IP_TO_BLOCK" ]; then
          echo "Usage: $0 <IP>"
          exit 1
      fi
      # 检查是否已存在规则
      if ! iptables -C INPUT -s $IP_TO_BLOCK -j DROP 2>/dev/null; then
          iptables -A INPUT -s $IP_TO_BLOCK -j DROP
          echo "Blocked $IP_TO_BLOCK"
      else
          echo "$IP_TO_BLOCK already blocked"
      fi
      # 保存规则(不同系统命令不同)
      iptables-save > /etc/iptables/rules.v4

第五类:日志与数据处理(分析)

  1. Nginx 访问日志 Top N 分析

    • 场景:快速找出访问量最大的 IP、请求最多的 URL、最耗时的接口。

    • Shell 一行流

      # 访问量最大的 Top 10 IP
      awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
      # 访问量最大的 Top 10 URL
      awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
      # 响应时间超过 5 秒的请求
      awk '$NF > 5 {print $7, $NF}' /var/log/nginx/access.log | sort -k2 -nr | head -20
  2. 配置备份与版本对比

    • 场景:修改配置文件前自动备份,并在下次修改时提示差异。
    • Shell 函数(在 .bashrc 中定义)
      backup_config() {
          if [ -f "$1" ]; then
              cp "$1" "$1.bak.$(date +%Y%m%d_%H%M%S)"
              echo "Backup of $1 created."
          else
              echo "File $1 not found."
          fi
      }
      # 用法:backup_config /etc/nginx/nginx.conf

推荐脚本开发习惯

  • 使用 Bash 时,加上这行防出错

    set -euo pipefail
    • -e:遇到错误立即退出。
    • -u:使用未定义变量时报错。
    • -o pipefail:管道中任何一步失败都算失败。
  • 复杂的逻辑用 Python:当需要处理 JSON/YAML/Excel、调用 API、进行复杂条件判断时,Python 的可读性和标准库(json, requests, os, re)更适合。

  • 复用原则:把通用函数(如日志记录、发送通知、API 调用)封装成单独的 lib.shutils.py 文件,用 source lib.sh(Shell)或 from utils import send_alert(Python)引入。


一个优秀的运维脚本,应当是 幂等 的(运行多次结果一样)、可重试 的、有良好日志 的。

建议先从以下 三个高频场景 开始自己动手写:

  1. 监控脚本(磁盘 + 进程 -> crontab 运行)
  2. 备份脚本(数据库 -> 云端 -> crontab 运行)
  3. 发布脚本(Git -> 备份 -> 重启 -> 回滚)

把这些基础脚本写好、打磨稳定,日常运维效率至少提升 70%。

抱歉,评论功能暂时关闭!