自动化运维脚本

📖 阅读时间:25分钟 🎯 难度:中级 👥 适合人群:希望提升VPS管理效率的用户

本指南将带您入门自动化运维的世界。学习如何编写Shell脚本来自动执行重复性任务,利用Cron实现定时调度,从而极大地提升VPS管理效率和可靠性。

🤖 什么是自动化运维

自动化运维(Automation Operations)是指使用脚本或专用工具来自动执行日常的、重复性的服务器管理任务,以减少手动干预,提高效率和准确性。

在VPS管理中,许多任务都是重复性的,例如:

  • 定期更新系统和软件包。
  • 备份网站文件和数据库。
  • 监控服务器资源(CPU、内存、磁盘)。
  • 检查服务状态并重启。
  • 清理日志文件。

通过自动化,您可以将这些任务交给计算机来完成,解放您的时间,并确保任务总能按时、准确地执行。

🚀 为何使用自动化脚本

提升效率

将数小时的手动工作缩短为几秒钟的脚本执行时间。

🎯

保证一致性

脚本确保每次任务都以完全相同的方式执行,避免人为错误。

实现无人值守

结合定时任务,可以在凌晨或任何指定时间自动执行维护。

🛡️

增强可靠性

自动化的健康检查和恢复机制可以提高服务的可用性。

📜 Bash脚本基础

Bash (Bourne-Again SHell) 是大多数Linux发行版的默认Shell,也是编写自动化脚本最常用的语言。

一个脚本的基本结构

#!/bin/bash

# 这是一个注释
# 使用变量
GREETING="Hello, World!"

# 打印变量内容
echo $GREETING

# 执行一个命令
echo "当前目录是:"
pwd

关键概念解释

  • Shebang (#!/bin/bash): 脚本的第一行,告诉系统使用哪个解释器来执行此脚本。
  • 注释 (#): 以 # 开头的行是注释,不会被执行,用于解释代码。
  • 变量: 无需声明类型,直接使用 VARIABLE_NAME="value" 定义。通过 $VARIABLE_NAME 引用。
  • 命令: 您可以直接在脚本中编写任何可以在命令行中执行的命令,如 pwd, ls, cp 等。

赋予执行权限

创建脚本文件后,您需要给它添加执行权限才能运行它。

假设您的脚本文件名为 `my_script.sh`:

chmod +x my_script.sh

之后,您可以通过以下方式运行脚本:

./my_script.sh

🥇 第一个脚本:系统更新

让我们编写一个简单但非常实用的脚本,用于自动更新系统软件包并清理无用包。

1

创建脚本文件

使用 `nano` 或 `vim` 创建一个新文件:

nano update_system.sh
2

编写脚本内容

将以下代码复制并粘贴到文件中。这里以Debian/Ubuntu系统为例:

#!/bin/bash
# 脚本:自动更新系统 (Debian/Ubuntu)

echo "=== 开始系统更新:$(date) ==="

# 更新软件包列表
apt update

# 升级所有软件包,-y 选项自动回答 'yes'
apt upgrade -y

# 自动移除不再需要的依赖包
apt autoremove -y

# 清理下载的软件包缓存
apt clean

echo "=== 系统更新完成:$(date) ==="

对于CentOS/RHEL系统,可以使用 yumdnfdnf update -y && dnf autoremove -y

3

保存并退出

在 `nano` 中,按 Ctrl+X,然后按 Y 确认保存,最后按回车。

4

赋予执行权限

chmod +x update_system.sh
5

运行脚本

因为脚本中的命令需要管理员权限,所以需要使用 `sudo` 来运行。

sudo ./update_system.sh
=== 开始系统更新:Tue Aug  5 06:15:00 UTC 2025 ===
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
...
Reading package lists... Done
Building dependency tree... Done
...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
=== 系统更新完成:Tue Aug  5 06:15:05 UTC 2025 ===

🛠️ 常用自动化脚本示例

以下是一些常见的VPS自动化脚本,您可以根据自己的需求进行修改和使用。

文件自动备份脚本

定期备份重要目录到指定位置,并删除旧的备份。

#!/bin/bash
# 备份源目录
SOURCE_DIR="/var/www/html"
# 备份目标目录
BACKUP_DIR="/root/backups"
# 日期格式
DATE=$(date +%Y%m%d_%H%M%S)
# 备份文件名
BACKUP_FILE="$BACKUP_DIR/www-backup-$DATE.tar.gz"
# 保留备份天数
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
tar -czf $BACKUP_FILE $SOURCE_DIR

# 删除旧备份
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +$RETENTION_DAYS -exec rm {} \;

echo "备份成功: $BACKUP_FILE"

服务健康检查脚本

检查关键服务(如Nginx、MySQL)是否在运行,如果不在则尝试重启。

#!/bin/bash
SERVICES=("nginx" "mysql")
LOG_FILE="/var/log/service_check.log"

for SERVICE in "${SERVICES[@]}"; do
  if ! systemctl is-active --quiet $SERVICE; then
    echo "[$(date)] 服务 `$SERVICE` 已停止, 正在尝试重启..." >> $LOG_FILE
    systemctl restart $SERVICE
    
    # 再次检查
    if systemctl is-active --quiet $SERVICE; then
      echo "[$(date)] 服务 `$SERVICE` 重启成功." >> $LOG_FILE
    else
      echo "[$(date)] 警告: 服务 `$SERVICE` 重启失败!" >> $LOG_FILE
    fi
  fi
done

磁盘空间监控脚本

当磁盘使用率超过阈值时,发送邮件通知(需要配置邮件发送工具如mailutils)。

#!/bin/bash
# 监控的分区
PARTITION="/"
# 使用率阈值 (%)
THRESHOLD=90
# 通知邮箱
EMAIL="admin@example.com"

# 获取当前使用率
CURRENT_USAGE=$(df -h $PARTITION | grep -v Filesystem | awk '{print $5}' | sed 's/%//g')

if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
  SUBJECT="警告: 服务器磁盘空间不足"
  BODY="服务器分区 $PARTITION 的磁盘使用率已达到 $CURRENT_USAGE%,请及时处理。"
  echo "$BODY" | mail -s "$SUBJECT" "$EMAIL"
fi

使用Cron定时执行

Cron是Linux系统下的一个任务调度程序,可以让您的脚本在指定的时间自动运行。

编辑Cron任务列表

使用以下命令来编辑当前用户的crontab文件:

crontab -e

第一次运行时,系统可能会让您选择一个默认的文本编辑器(推荐选择 `nano`)。

Crontab语法

每一行cron任务都由五个时间字段和一个要执行的命令组成。

# ┌───────────── 分钟 (0 - 59)
# │ ┌─────────── 小时 (0 - 23)
# │ │ ┌───────── 日 (1 - 31)
# │ │ │ ┌─────── 月 (1 - 12)
# │ │ │ │ ┌───── 星期 (0 - 6) (周日为0)
# │ │ │ │ │
# * * * * *  要执行的命令

示例

Cron表达式 说明 命令示例
0 3 * * * 每天凌晨3:00 /root/scripts/update_system.sh
0 5 * * 1 每周一凌晨5:00 /root/scripts/backup.sh
*/10 * * * * 每隔10分钟 /root/scripts/service_check.sh
0 0 1 * * 每月1号的午夜 /root/scripts/log_cleanup.sh
⚠️ 重要提示: 在crontab中,请务必使用脚本的绝对路径,因为cron执行时的工作目录可能不是您所期望的。您可以使用 `pwd` 命令查看脚本所在的完整路径。

🛡️ 安全最佳实践

编写自动化脚本时,遵循安全规范至关重要,以防脚本被滥用。

🔒 最小权限原则

如果脚本不需要root权限,就不要用root用户来运行它。为脚本创建一个专用的、低权限的用户。

🚫 不要在脚本中硬编码密码

避免在脚本中直接写入密码。使用配置文件(并设置严格权限)或专门的密钥管理工具。

📝 验证输入

如果脚本接受外部输入,请务必对其进行严格的验证和清理,以防止命令注入攻击。

🔐 保护脚本文件

设置正确的文件权限。只有所有者才应该有权写入脚本文件 (chmod 755700)。

🔧 脚本调试与排错

当脚本没有按预期工作时,以下是一些常用的调试技巧。

🔍 使用`echo`调试

在脚本的关键位置插入 echo "变量值: $VARIABLE" 来打印变量的值,检查执行流程。

▶️ 开启执行跟踪

在脚本开头加入 set -x。这会让Shell在执行每一行命令前,先打印出该行命令。

set -x # 开启调试 # ... 你的代码 ... set +x # 关闭调试
📋 检查退出状态码

每个命令执行后都有一个退出状态码,存储在 $? 中。0表示成功,非0表示失败。

cp file1 file2 if [ $? -ne 0 ]; then echo "复制文件失败!" fi
📜 重定向输出

将cron任务的输出重定向到日志文件,以便排查问题。

0 3 * * * /root/scripts/my_script.sh >> /var/log/my_script.log 2>&1

>> 表示追加输出, 2>&1 表示将标准错误也重定向到标准输出。

掌握脚本自动化了!接下来...

恭喜您掌握了使用脚本实现VPS自动化的基础,您可以继续探索更强大的工具: