在Linux系统管理中,你是否曾经遇到过重复操作繁琐、部署流程复杂、或者维护工作量大的问题?
Shell脚本自动化是系统管理的重要技能,掌握这些技能不仅能提高工作效率,还能减少人为错误。
本文将详细介绍Shell脚本自动化的核心技术和配置技巧。
目录
1. 脚本基础
1.1 基本语法
创建脚本:
#!/bin/bash
# 创建脚本文件
cat > deploy.sh << 'EOF'
#!/bin/bash
# 脚本说明
echo "开始部署..."
# 检查系统
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$NAME
VERSION=$VERSION_ID
echo "系统: $OS $VERSION"
else
echo "无法检测系统版本"
exit 1
fi
EOF
# 添加执行权限
chmod +x deploy.sh
变量定义:
#!/bin/bash
# 定义变量
APP_NAME="myapp"
APP_VERSION="1.0.0"
APP_PORT="8080"
# 使用变量
echo "应用名称: $APP_NAME"
echo "应用版本: $APP_VERSION"
echo "应用端口: $APP_PORT"
# 数组定义
servers=("web1" "web2" "web3")
echo "服务器列表: ${servers[@]}"
1.2 条件判断
if语句:
#!/bin/bash
# 基本if语句
if [ $1 -eq 1 ]; then
echo "参数为1"
elif [ $1 -eq 2 ]; then
echo "参数为2"
else
echo "参数不是1或2"
fi
# 文件判断
if [ -f /etc/passwd ]; then
echo "文件存在"
fi
if [ -d /tmp ]; then
echo "目录存在"
fi
# 网络判断
if ping -c 1 8.8.8.8 &> /dev/null; then
echo "网络连接正常"
else
echo "网络连接异常"
fi
case语句:
#!/bin/bash
# case语句
case $1 in
start)
echo "启动服务"
;;
stop)
echo "停止服务"
;;
restart)
echo "重启服务"
;;
*)
echo "用法: $0 {start|stop|restart}"
exit 1
;;
esac
1.3 循环结构
for循环:
#!/bin/bash
# 数字循环
for i in {1..5}; do
echo "数字: $i"
done
# 文件循环
for file in *.txt; do
echo "处理文件: $file"
cat "$file"
done
# 数组循环
servers=("web1" "web2" "web3")
for server in "${servers[@]}"; do
echo "服务器: $server"
done
while循环:
#!/bin/bash
# 基本while循环
count=1
while [ $count -le 5 ]; do
echo "计数: $count"
((count++))
done
# 读取文件
while read line; do
echo "行内容: $line"
done < /etc/passwd
2. 部署脚本
2.1 环境准备
系统检查脚本:
#!/bin/bash
# 系统检查脚本
check_system() {
echo "检查系统环境..."
# 检查操作系统
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "系统: $NAME $VERSION_ID"
else
echo "错误: 无法检测系统版本"
exit 1
fi
# 检查内存
total_mem=$(free -m | awk 'NR==2{printf "%.0f", $2}')
if [ $total_mem -lt 2048 ]; then
echo "警告: 内存不足2GB"
else
echo "内存: ${total_mem}MB"
fi
# 检查磁盘空间
disk_usage=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
if [ $disk_usage -gt 80 ]; then
echo "警告: 磁盘使用率超过80%"
else
echo "磁盘使用率: ${disk_usage}%"
fi
}
check_system
依赖安装脚本:
#!/bin/bash
# 依赖安装脚本
install_dependencies() {
echo "安装依赖包..."
# 检测包管理器
if command -v apt-get &> /dev/null; then
PKG_MANAGER="apt-get"
UPDATE_CMD="apt-get update"
INSTALL_CMD="apt-get install -y"
elif command -v yum &> /dev/null; then
PKG_MANAGER="yum"
UPDATE_CMD="yum check-update"
INSTALL_CMD="yum install -y"
else
echo "错误: 不支持的包管理器"
exit 1
fi
# 更新系统
echo "更新系统..."
$UPDATE_CMD
# 安装基础包
echo "安装基础包..."
$INSTALL_CMD curl wget git vim
# 安装运行时依赖
echo "安装运行时依赖..."
if [ "$PKG_MANAGER" = "apt-get" ]; then
$INSTALL_CMD nginx mysql-server php-fpm
else
$INSTALL_CMD nginx mariadb-server php-fpm
fi
}
install_dependencies
2.2 应用部署
Nginx部署脚本:
#!/bin/bash
# Nginx部署脚本
deploy_nginx() {
echo "部署Nginx..."
# 创建网站目录
mkdir -p /var/www/myapp
chown -R www-data:www-data /var/www/myapp
# 创建网站配置
cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
listen 80;
server_name myapp.local;
root /var/www/myapp;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /api {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
EOF
# 启用网站
ln -sf /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# 测试配置
nginx -t
# 重启服务
systemctl restart nginx
}
deploy_nginx
MySQL部署脚本:
#!/bin/bash
# MySQL部署脚本
deploy_mysql() {
echo "部署MySQL..."
# 创建数据库
mysql -u root -p'RootPassword123!' -e "CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 创建用户
mysql -u root -p'RootPassword123!' -e "CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'AppPassword123!';"
# 授权
mysql -u root -p'RootPassword123!' -e "GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';"
# 刷新权限
mysql -u root -p'RootPassword123!' -e "FLUSH PRIVILEGES;"
echo "MySQL部署完成"
}
deploy_mysql
2.3 服务管理
服务启动脚本:
#!/bin/bash
# 服务管理脚本
SERVICE_NAME="myapp"
SERVICE_CMD="/usr/bin/myapp"
SERVICE_PID="/var/run/myapp.pid"
start_service() {
if [ -f $SERVICE_PID ]; then
echo "服务已在运行"
return 1
fi
echo "启动服务..."
nohup $SERVICE_CMD > /var/log/myapp.log 2>&1 &
echo $! > $SERVICE_PID
echo "服务已启动"
}
stop_service() {
if [ ! -f $SERVICE_PID ]; then
echo "服务未运行"
return 1
fi
echo "停止服务..."
kill $(cat $SERVICE_PID)
rm -f $SERVICE_PID
echo "服务已停止"
}
restart_service() {
stop_service
sleep 2
start_service
}
case $1 in
start)
start_service
;;
stop)
stop_service
;;
restart)
restart_service
;;
status)
if [ -f $SERVICE_PID ]; then
echo "服务正在运行"
else
echo "服务未运行"
fi
;;
*)
echo "用法: $0 {start|stop|restart|status}"
exit 1
;;
esac
3. 批量管理
3.1 批量部署
批量部署脚本:
#!/bin/bash
# 批量部署脚本
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="admin"
KEY_FILE="/home/admin/.ssh/id_rsa"
deploy_to_server() {
local server=$1
echo "部署到服务器: $server"
# 复制文件
scp -i $KEY_FILE -r /tmp/myapp.tar.gz $USER@$server:/tmp/
# 执行部署
ssh -i $KEY_FILE $USER@$server "tar -xzf /tmp/myapp.tar.gz -C /opt/ && /opt/myapp/deploy.sh"
echo "部署完成: $server"
}
# 批量部署
for server in "${SERVERS[@]}"; do
deploy_to_server $server
done
3.2 批量检查
系统检查脚本:
#!/bin/bash
# 批量系统检查
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="admin"
KEY_FILE="/home/admin/.ssh/id_rsa"
check_server() {
local server=$1
echo "检查服务器: $server"
# 检查CPU使用率
cpu_usage=$(ssh -i $KEY_FILE $USER@$server "top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}'")
echo "CPU使用率: ${cpu_usage}%"
# 检查内存使用
mem_usage=$(ssh -i $KEY_FILE $USER@$server "free | grep Mem | awk '{print \$3/\$2 * 100.0}'")
echo "内存使用率: ${mem_usage}%"
# 检查磁盘使用
disk_usage=$(ssh -i $KEY_FILE $USER@$server "df -h / | awk 'NR==2{print \$5}' | sed 's/%//'")
echo "磁盘使用率: ${disk_usage}%"
echo "---"
}
# 批量检查
for server in "${SERVERS[@]}"; do
check_server $server
done
3.3 日志分析
日志分析脚本:
#!/bin/bash
# 日志分析脚本
LOG_FILE="/var/log/nginx/access.log"
# 统计访问量
total_requests=$(wc -l < $LOG_FILE)
echo "总请求数: $total_requests"
# 统计IP访问量
echo "TOP 10 IP访问量:"
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10
# 统计URL访问量
echo "TOP 10 URL访问量:"
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr | head -10
# 统计HTTP状态码
echo "HTTP状态码统计:"
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -nr
总结
Shell脚本自动化是系统管理的重要技能,掌握这些技能不仅能提高工作效率,还能减少人为错误。
关键要点回顾: