ansible-devops/scripts/deploy_gpu_monitor.sh

249 lines
8.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 脚本部署工具 - 下载并配置GPU监控脚本
set -euo pipefail
IFS=$'\n\t'
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 恢复默认颜色
# 配置信息
SCRIPT_URL="http://116.205.97.109/scripts/gpu_metrics.sh" # 脚本下载地址
TARGET_DIR="/opt/scripts" # 脚本存放目录
TARGET_SCRIPT="${TARGET_DIR}/gpu_monitor.sh" # 目标脚本路径
CRON_SCHEDULE="*/2 * * * *" # 定时任务执行频率
LOG_FILE="/var/log/gpu_monitor.log" # 日志文件路径
METRICS_DIR="/var/lib/node_exporter/textfile_collector" # 指标文件目录
METRICS_FILE="${METRICS_DIR}/gpu_metrics.prom" # 指标文件
NODE_EXPORTER_SERVICE="node_exporter.service" # node_exporter服务名
# 帮助信息
show_help() {
echo -e "${BLUE}用法: $0 [选项]${NC}"
echo -e "${BLUE}GPU监控脚本部署工具必须指定--install或--uninstall${NC}"
echo ""
echo -e "${GREEN}选项:${NC}"
echo -e " ${YELLOW}--install${NC} 安装并配置GPU监控脚本重启node_exporter"
echo -e " ${YELLOW}--uninstall${NC} 卸载GPU监控脚本及配置删除指标文件并重启node_exporter"
echo -e " ${YELLOW}--help${NC} 显示此帮助信息"
echo ""
}
# 检查是否以root权限运行
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo -e "${RED}错误: 此脚本需要root权限运行请使用sudo${NC}" >&2
exit 1
fi
}
# 检查服务是否存在
service_exists() {
systemctl list-units --all --full -t service --no-legend "$1" | grep -q "$1"
}
# 重启node_exporter并检查状态
restart_node_exporter() {
echo -e "${BLUE}检查node_exporter服务状态...${NC}"
if service_exists "${NODE_EXPORTER_SERVICE}"; then
echo -e "${BLUE}正在重启node_exporter服务...${NC}"
systemctl restart "${NODE_EXPORTER_SERVICE}" || true # 允许失败,不中断流程
echo -e "${BLUE}检查node_exporter状态...${NC}"
if systemctl is-active --quiet "${NODE_EXPORTER_SERVICE}"; then
echo -e "${GREEN}node_exporter状态: 运行中${NC}"
else
echo -e "${YELLOW}警告: node_exporter未正常运行请查看日志journalctl -u ${NODE_EXPORTER_SERVICE}${NC}" >&2
fi
else
echo -e "${YELLOW}警告: node_exporter服务不存在跳过重启${NC}" >&2
fi
}
# 安全添加定时任务(避免重复)
add_cron_job() {
local cron_line="${CRON_SCHEDULE} ${TARGET_SCRIPT} >> ${LOG_FILE} 2>&1"
# 检查任务是否已存在(精确匹配)
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo -e "${YELLOW}定时任务已存在,跳过添加${NC}"
return 0
fi
# 备份现有crontab
local backup_file="/tmp/crontab_backup_$(date +%s)"
crontab -l 2>/dev/null > "${backup_file}" || true
# 添加新任务
echo -e "${BLUE}添加定时任务: ${cron_line}${NC}"
(
crontab -l 2>/dev/null || true # 获取现有crontab如果有
echo "${cron_line}" # 添加新任务
) | crontab -
# 验证添加结果
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo -e "${GREEN}定时任务添加成功${NC}"
else
echo -e "${RED}错误: 定时任务添加失败${NC}" >&2
# 恢复备份
if [ -f "${backup_file}" ]; then
crontab "${backup_file}"
echo -e "${BLUE}已恢复原crontab${NC}"
fi
return 1
fi
}
# 安装函数
install_script() {
echo -e "${GREEN}===== 开始安装GPU监控脚本 =====${NC}"
# 1. 清理旧指标文件(避免残留数据)
echo -e "${BLUE}清理旧指标文件...${NC}"
if [ -f "${METRICS_FILE}" ]; then
rm -f "${METRICS_FILE}"
echo -e "${GREEN}已删除旧指标文件: ${METRICS_FILE}${NC}"
fi
# 2. 创建目标目录并下载脚本
mkdir -p "${TARGET_DIR}"
cd "${TARGET_DIR}"
echo -e "${BLUE}正在下载GPU监控脚本...${NC}"
wget -q -O "${TARGET_SCRIPT}" "${SCRIPT_URL}" || {
echo -e "${RED}错误: 无法从 ${SCRIPT_URL} 下载脚本${NC}" >&2
exit 1
}
chmod +x "${TARGET_SCRIPT}"
# 3. 脚本配置确保GPU总数为8
echo -e "${BLUE}配置脚本参数...${NC}"
sed -i 's/EXPECTED_GPUS=".*"/EXPECTED_GPUS="0 1 2 3 4 5 6 7"/' "${TARGET_SCRIPT}"
# 4. 准备metrics目录
mkdir -p "${METRICS_DIR}"
chmod 755 "${METRICS_DIR}"
# 5. 配置定时任务(安全添加,避免重复)
echo -e "${BLUE}配置定时任务...${NC}"
add_cron_job || exit 1
# 6. 首次执行脚本生成指标
echo -e "${BLUE}测试执行脚本...${NC}"
"${TARGET_SCRIPT}" || {
echo -e "${RED}错误: 脚本执行失败,请检查日志: ${LOG_FILE}${NC}" >&2
exit 1
}
# 7. 重启node_exporter使配置生效
restart_node_exporter
# 8. 验证结果
echo -e "${GREEN}===== 安装完成 =====${NC}"
echo -e "${BLUE}脚本位置:${NC} ${TARGET_SCRIPT}"
echo -e "${BLUE}定时任务:${NC} $(crontab -l | grep "${TARGET_SCRIPT}")"
echo -e "${BLUE}日志文件:${NC} ${LOG_FILE}"
echo -e "${BLUE}指标文件:${NC} ${METRICS_FILE}${GREEN}(已生成)${NC}"
echo -e "${BLUE}node_exporter状态:${NC} $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo -e "${YELLOW}未安装${NC}")"
}
# 卸载函数
uninstall_script() {
echo -e "${YELLOW}===== 开始卸载GPU监控脚本 =====${NC}"
# 1. 移除定时任务
echo -e "${BLUE}删除定时任务...${NC}"
local cron_line="${CRON_SCHEDULE} ${TARGET_SCRIPT} >> ${LOG_FILE} 2>&1"
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
# 备份现有crontab
local backup_file="/tmp/crontab_backup_$(date +%s)"
crontab -l > "${backup_file}"
# 移除任务
crontab -l | grep -vxF "${cron_line}" | crontab -
# 验证移除结果
if ! crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo -e "${GREEN}已成功删除定时任务${NC}"
else
echo -e "${RED}错误: 定时任务删除失败${NC}" >&2
# 恢复备份
crontab "${backup_file}"
echo -e "${BLUE}已恢复原crontab${NC}"
exit 1
fi
else
echo -e "${YELLOW}未找到相关定时任务,跳过${NC}"
fi
# 2. 删除脚本文件
echo -e "${BLUE}删除监控脚本...${NC}"
if [ -f "${TARGET_SCRIPT}" ]; then
rm -f "${TARGET_SCRIPT}"
echo -e "${GREEN}已删除脚本: ${TARGET_SCRIPT}${NC}"
else
echo -e "${YELLOW}脚本文件不存在,跳过${NC}"
fi
# 3. 删除指标文件
echo -e "${BLUE}删除指标文件...${NC}"
if [ -f "${METRICS_FILE}" ]; then
rm -f "${METRICS_FILE}"
echo -e "${GREEN}已删除指标文件: ${METRICS_FILE}${NC}"
else
echo -e "${YELLOW}指标文件不存在,跳过${NC}"
fi
# 4. 删除日志文件
echo -e "${BLUE}删除日志文件...${NC}"
if [ -f "${LOG_FILE}" ]; then
rm -f "${LOG_FILE}"
echo -e "${GREEN}已删除日志文件: ${LOG_FILE}${NC}"
else
echo -e "${YELLOW}日志文件不存在,跳过${NC}"
fi
# 5. 重启node_exporter
restart_node_exporter
# 6. 验证结果
echo -e "${YELLOW}===== 卸载完成 =====${NC}"
echo -e "${BLUE}node_exporter状态:${NC} $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo -e "${YELLOW}未安装${NC}")"
}
# 主逻辑
check_root
# 参数检查
if [ $# -ne 1 ]; then
echo -e "${RED}错误: 必须指定--install或--uninstall${NC}" >&2
show_help
exit 1
fi
# 执行对应操作
case "$1" in
--install)
install_script
;;
--uninstall)
uninstall_script
;;
--help)
show_help
exit 0
;;
*)
echo -e "${RED}错误: 未知参数 '$1'${NC}" >&2
show_help
exit 1
;;
esac