← 返回首页
🔧

Linux自动化运维:脚本实战

📂 devops ⏱ 2 min 337 words

Linux自动化运维:脚本实战

自动化运维概述

自动化运维是通过脚本和工具,将重复性运维工作自动执行的过程。掌握Shell脚本编程是运维工程师的核心技能之一。

脚本规范

脚本结构

#!/bin/bash
#============================================
# 脚本名称: deploy.sh
# 功能描述: 应用部署脚本
# 作者: DevOps Engineer
# 版本: 1.0
#============================================

set -euo pipefail

# 全局变量
APP_NAME="myapp"
DEPLOY_DIR="/opt/deploy"
LOG_FILE="/var/log/deploy.log"

日志函数

# 日志函数
log() {
    local level=$1
    local msg=$2
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $msg" | tee -a "$LOG_FILE"
}

log "INFO" "开始部署..."
log "ERROR" "部署失败"

实用脚本示例

服务器初始化脚本

#!/bin/bash
set -euo pipefail

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }

# 设置主机名
hostnamectl set-hostname "$1"

# 配置时区
timedatectl set-timezone Asia/Shanghai

# 配置NTP
yum install -y chrony
systemctl enable --now chronyd

# 优化内核参数
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 32768
vm.swappiness = 10
EOF
sysctl -p

# 配置limits
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF

log "服务器初始化完成"

应用部署脚本

#!/bin/bash
set -euo pipefail

APP_NAME="myapp"
VERSION=$1
DEPLOY_DIR="/opt/$APP_NAME"
BACKUP_DIR="/opt/backup"

# 备份当前版本
if [ -d "$DEPLOY_DIR/current" ]; then
    TIMESTAMP=$(date +%Y%m%d%H%M%S)
    mv "$DEPLOY_DIR/current" "$BACKUP_DIR/$APP_NAME-$TIMESTAMP"
    echo "已备份到 $BACKUP_DIR/$APP_NAME-$TIMESTAMP"
fi

# 下载新版本
mkdir -p "$DEPLOY_DIR/releases/$VERSION"
wget -q "http://releases.example.com/$APP_NAME-$VERSION.tar.gz" \
    -O "/tmp/$APP_NAME-$VERSION.tar.gz"

# 解压部署
tar xzf "/tmp/$APP_NAME-$VERSION.tar.gz" \
    -C "$DEPLOY_DIR/releases/$VERSION"

# 创建软链接
ln -sfn "$DEPLOY_DIR/releases/$VERSION" "$DEPLOY_DIR/current"

# 重启服务
systemctl restart "$APP_NAME"

# 健康检查
sleep 5
if curl -sf http://localhost:8080/health > /dev/null; then
    echo "部署成功: $VERSION"
else
    echo "健康检查失败,回滚..."
    # 回滚逻辑
    exit 1
fi

日志清理脚本

#!/bin/bash
set -euo pipefail

LOG_DIR="/var/log/app"
KEEP_DAYS=30

# 清理应用日志
find "$LOG_DIR" -name "*.log" -mtime +$KEEP_DAYS -delete
find "$LOG_DIR" -name "*.log.gz" -mtime +$KEEP_DAYS -delete

# 清理系统日志
journalctl --vacuum-time=30d

# 清理临时文件
find /tmp -type f -mtime +7 -delete

echo "日志清理完成: $(date)"

数据库备份脚本

#!/bin/bash
set -euo pipefail

DB_HOST="localhost"
DB_USER="backup"
DB_PASS="secure_password"
BACKUP_DIR="/backup/mysql"
KEEP_DAYS=7

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

# 备份所有数据库
for db in $(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" -e 'show databases' -s | grep -v 'Database\|information_schema\|performance_schema'); do
    echo "备份数据库: $db"
    mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" \
        --single-transaction --routines --triggers "$db" | \
        gzip > "$BACKUP_DIR/$db-$(date +%Y%m%d).sql.gz"
done

# 清理旧备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$KEEP_DAYS -delete

# 上传到S3
aws s3 sync "$BACKUP_DIR" s3://backup-bucket/mysql/ --exclude "*"

echo "备份完成: $(date)"

脚本调试技巧

# 开启调试模式
bash -x script.sh

# 语法检查
bash -n script.sh

# 设置断点调试
set -x  # 开启调试
echo "变量值: $var"
set +x  # 关闭调试

定时任务管理

# 编辑定时任务
crontab -e

# 常用cron表达式
# 每天凌晨2点执行
0 2 * * * /opt/scripts/backup.sh

# 每5分钟执行
*/5 * * * * /opt/scripts/health_check.sh

# 每周一执行
0 0 * * 1 /opt/scripts/weekly_report.sh

总结

Shell脚本是运维自动化的基础。建议从小脚本开始,逐步构建自动化运维体系,提高工作效率和系统可靠性。