8.4 巡检与自动化脚本
一、适用范围与目标
- 适用于系统、服务、基础设施等的日常巡检和自动化运维脚本管理。
- 目标:建立标准化的巡检流程,提升运维效率,降低人工成本,保障系统稳定。
二、管理目标
- 巡检任务标准化、自动化,覆盖关键指标
- 脚本开发规范,可维护、可复用
- 巡检结果可追溯,异常自动告警
- 脚本库统一管理,版本可控
三、详细规范
定时巡检任务
- 巡检内容:
- 节点健康状态(Kubernetes 节点、主机状态)
- 磁盘空间使用率(>80% 告警)
- 证书有效期(<30 天告警)
- 备份状态(备份是否成功、备份文件完整性)
- 服务可用性(关键服务是否正常运行)
- 资源使用率(CPU、内存、网络)
- 巡检频率:每日/每周/每月,根据重要性确定
- 巡检工具:cron、Ansible、Prometheus Alert、自定义脚本
- 告警机制:异常自动告警,通知相关人员
脚本开发规范
- 开发语言:统一使用 Python、Shell、Go 等
- 代码规范:遵循团队代码规范,注释清晰
- 参数化设计:支持参数输入,便于复用
- 异常处理:完善的异常处理和日志记录
- 幂等性:脚本执行多次结果一致
- 文档说明:每个脚本需有 README 说明
脚本库管理
- 版本控制:所有脚本纳入 Git 版本控制
- 统一存储:脚本统一存储在脚本库(如 GitLab、GitHub)
- 分类管理:按功能分类(巡检、部署、备份等)
- 权限管理:脚本访问权限控制,敏感脚本加密
- 定期评审:定期评审脚本,优化和重构
四、操作流程
巡检任务配置流程
- 确定巡检项 → 根据业务需求确定巡检内容
- 编写巡检脚本 → 开发或选择现有脚本
- 配置定时任务 → 配置 cron 或调度系统
- 测试验证 → 在测试环境验证脚本功能
- 上线运行 → 部署到生产环境
- 监控告警 → 配置异常告警规则
- 定期优化 → 根据巡检结果优化脚本
脚本开发流程
- 需求分析 → 明确脚本功能和需求
- 设计开发 → 编写脚本代码
- 代码评审 → 代码提交前进行评审
- 测试验证 → 在测试环境验证功能
- 文档编写 → 编写 README 和使用说明
- 提交入库 → 提交到脚本库
- 上线使用 → 部署到生产环境使用
脚本维护流程
- 问题反馈 → 收集脚本使用中的问题
- 问题分析 → 分析问题原因
- 优化改进 → 优化脚本代码
- 测试验证 → 验证改进效果
- 更新文档 → 更新相关文档
- 版本发布 → 发布新版本
五、实际案例
案例1:Kubernetes 集群巡检
- 场景:每日巡检 Kubernetes 集群健康状态
- 巡检内容:
- 节点 Ready 状态
- Pod 异常状态
- 资源使用率
- 证书有效期
- 实现方式:Ansible Playbook + Prometheus Alert
- 结果:每日自动巡检,异常自动告警
- 亮点:自动化巡检,及时发现问题
案例2:磁盘空间巡检
- 场景:每周巡检服务器磁盘空间
- 巡检内容:
- 磁盘使用率 >80% 告警
- 磁盘使用率 >90% 紧急告警
- 大文件识别和清理建议
- 实现方式:Shell 脚本 + cron
- 结果:提前发现磁盘空间不足,及时处理
- 亮点:分级告警,提供处理建议
案例3:证书有效期巡检
- 场景:每月巡检 SSL 证书有效期
- 巡检内容:
- 证书有效期 <30 天告警
- 证书有效期 <7 天紧急告警
- 证书即将过期提醒
- 实现方式:Python 脚本 + 邮件通知
- 结果:提前发现证书即将过期,及时续期
- 亮点:提前预警,避免证书过期
六、操作模板
巡检脚本模板(Shell)
#!/bin/bash
# 巡检脚本模板
# 功能:检查系统健康状态
# 作者:运维团队
# 日期:2024-01-01
set -e
LOG_FILE="/var/log/health-check.log"
ALERT_EMAIL="ops@example.com"
# 日志函数
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a ${LOG_FILE}
}
# 告警函数
alert() {
log "ALERT: $1"
echo "$1" | mail -s "系统告警" ${ALERT_EMAIL}
}
# 检查节点健康
check_nodes() {
log "检查 Kubernetes 节点状态..."
NOT_READY=$(kubectl get nodes | grep -v Ready | wc -l)
if [ ${NOT_READY} -gt 0 ]; then
alert "发现 ${NOT_READY} 个节点不健康"
fi
}
# 检查磁盘空间
check_disk() {
log "检查磁盘空间..."
df -h | awk 'NR>1 {if ($5+0 > 80) print "磁盘使用率告警: " $1 " " $5}'
}
# 主函数
main() {
log "开始巡检..."
check_nodes
check_disk
log "巡检完成"
}
main "$@"
巡检脚本模板(Ansible)
---
- name: 系统巡检
hosts: all
tasks:
- name: 检查节点 Ready 状态
shell: kubectl get nodes | grep -v Ready
register: not_ready_nodes
failed_when: false
- name: 告警不健康节点
debug:
msg: "发现不健康节点: "
when: not_ready_nodes.stdout != ""
- name: 检查磁盘空间
shell: df -h | awk '$5+0 > 80 {print $1 " " $5}'
register: disk_usage
failed_when: false
- name: 告警磁盘空间不足
debug:
msg: "磁盘使用率告警: "
when: disk_usage.stdout != ""
- name: 检查证书有效期
shell: |
openssl x509 -in /etc/ssl/certs/cert.pem -noout -enddate
register: cert_expiry
failed_when: false
巡检脚本模板(Python)
#!/usr/bin/env python3
"""
巡检脚本模板
功能:检查系统健康状态
"""
import subprocess
import logging
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('/var/log/health-check.log'),
logging.StreamHandler()
]
)
def check_nodes():
"""检查 Kubernetes 节点状态"""
logging.info("检查 Kubernetes 节点状态...")
result = subprocess.run(
['kubectl', 'get', 'nodes'],
capture_output=True,
text=True
)
not_ready = [line for line in result.stdout.split('\n') if 'NotReady' in line]
if not_ready:
logging.warning(f"发现不健康节点: {len(not_ready)}")
return False
return True
def check_disk():
"""检查磁盘空间"""
logging.info("检查磁盘空间...")
result = subprocess.run(
['df', '-h'],
capture_output=True,
text=True
)
# 解析磁盘使用率
for line in result.stdout.split('\n')[1:]:
if line:
parts = line.split()
if len(parts) >= 5:
usage = int(parts[4].rstrip('%'))
if usage > 80:
logging.warning(f"磁盘使用率告警: {parts[0]} {usage}%")
return False
return True
def main():
"""主函数"""
logging.info("开始巡检...")
check_nodes()
check_disk()
logging.info("巡检完成")
if __name__ == '__main__':
main()
Cron 配置示例
# 每日凌晨 2 点执行巡检
0 2 * * * /usr/local/bin/health-check.sh >> /var/log/health-check.log 2>&1
# 每周一凌晨 3 点执行完整巡检
0 3 * * 1 /usr/local/bin/full-health-check.sh >> /var/log/full-health-check.log 2>&1
# 每小时检查一次证书有效期
0 * * * * /usr/local/bin/cert-check.sh >> /var/log/cert-check.log 2>&1
七、注意事项
- 巡检脚本需有日志与告警:所有巡检脚本需记录日志,异常需告警
- 关键巡检项需自动化闭环:关键巡检项发现问题后自动处理或升级
- 脚本变更需评审与测试:脚本变更需代码评审,在测试环境验证
- 脚本权限控制:生产环境脚本执行需权限控制,避免误操作
- 定期优化脚本:定期评审和优化脚本,提升效率和准确性
- 文档维护:脚本文档需及时更新,保持与代码同步
八、参考资料
- 《自动化运维脚本最佳实践》
- 《企业级巡检与监控白皮书》
- 《Ansible 自动化运维指南》
- 团队内部脚本库管理制度