| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #!/bin/bash
- # 清屏
- clear
- # 检查并安装 tree 命令
- if ! command -v tree >/dev/null 2>&1; then
- echo "正在安装 tree 命令..."
- if command -v apt-get >/dev/null 2>&1; then
- sudo apt-get update && sudo apt-get install -y tree
- elif command -v yum >/dev/null 2>&1; then
- sudo yum install -y tree
- else
- echo "无法安装 tree 命令,将使用 ls -R 替代"
- fi
- fi
- # 检查端口是否被占用
- check_port() {
- local port=$1
- if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null ; then
- return 1
- fi
- return 0
- }
- # 检查监控相关容器是否在运行
- check_running_containers() {
- local container_patterns=("node_exporter" "prometheus" "grafana")
- local running_containers=()
-
- for pattern in "${container_patterns[@]}"; do
- # 使用模糊匹配查找包含关键字的容器
- local found_containers=$(docker ps --format '{{.Names}}' | grep -i "${pattern}")
- if [ ! -z "$found_containers" ]; then
- while IFS= read -r container; do
- running_containers+=("$container")
- done <<< "$found_containers"
- fi
- done
-
- if [ ${#running_containers[@]} -gt 0 ]; then
- echo "发现以下可能相关的监控容器正在运行:"
- printf '%s\n' "${running_containers[@]}"
- echo "------------------------"
- echo "请选择操作:"
- echo "1. 停止这些容器并继续部署"
- echo "2. 退出脚本"
- read -p "请输入选项 (1/2): " choice
-
- case $choice in
- 1)
- echo "正在停止容器..."
- for container in "${running_containers[@]}"; do
- echo "停止并删除容器: $container"
- docker stop "$container" && docker rm "$container"
- done
- echo "所有容器已停止并删除"
- ;;
- 2)
- echo "退出脚本"
- exit 0
- ;;
- *)
- echo "无效选项,退出脚本"
- exit 1
- ;;
- esac
- fi
- }
- # 检查并清理已存在的项目
- check_existing_project() {
- local project_name=$1
- if [ -d "$project_name" ]; then
- echo "警告: 目录 $project_name 已存在!"
- echo "请选择操作:"
- echo "1. 删除现有项目并重新创建"
- echo "2. 退出脚本"
- read -p "请输入选项 (1/2): " choice
-
- case $choice in
- 1)
- echo "正在删除现有项目..."
- # 停止并删除容器
- if [ -f "$project_name/docker-compose.yml" ]; then
- cd $project_name
- docker-compose down
- cd ..
- fi
- rm -rf $project_name
- echo "项目已删除"
- return 0
- ;;
- 2)
- echo "退出脚本"
- exit 0
- ;;
- *)
- echo "无效选项,退出脚本"
- exit 1
- ;;
- esac
- fi
- return 0
- }
- echo "=== 监控系统部署脚本 ==="
- echo "------------------------"
- # 首先检查是否有相关容器在运行
- check_running_containers
- # 提示输入项目名称
- echo "请输入项目名称 (默认: NPG):"
- read PROJECT_NAME
- PROJECT_NAME=${PROJECT_NAME:-NPG}
- # 检查已存在的项目
- check_existing_project $PROJECT_NAME
- # 获取 Grafana 端口
- echo "请输入 Grafana 访问端口 (默认: 3000):"
- read PORT
- PORT=${PORT:-3000}
- # 验证端口
- while true; do
- if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
- echo "错误: 请输入有效的数字端口"
- read PORT
- continue
- fi
-
- if ! check_port $PORT; then
- echo "错误: 端口 $PORT 已被占用,请选择其他端口"
- read PORT
- continue
- fi
-
- break
- done
- GRAFANA_PORT=$PORT
- # 提示输入 Grafana 密码
- echo "请输入 Grafana 管理员密码 (默认: admin123):"
- read GRAFANA_PASSWORD
- GRAFANA_PASSWORD=${GRAFANA_PASSWORD:-admin123}
- echo "------------------------"
- echo "确认信息:"
- echo "项目名称: $PROJECT_NAME"
- echo "Grafana端口: $GRAFANA_PORT"
- echo "Grafana密码: $GRAFANA_PASSWORD"
- echo "------------------------"
- echo "是否继续? (y/n)"
- read CONFIRM
- if [[ $CONFIRM != "y" && $CONFIRM != "Y" ]]; then
- echo "取消部署"
- exit 1
- fi
- mkdir -p $PROJECT_NAME
- cd $PROJECT_NAME
- # 创建必要的目录
- mkdir -p data/prometheus data/grafana prometheus
- # 创建 prometheus.yml
- cat > prometheus/prometheus.yml << 'EOF'
- global:
- scrape_interval: 15s
- evaluation_interval: 15s
- scrape_configs:
- - job_name: 'node_exporter'
- static_configs:
- - targets: ['node_exporter:9100']
- EOF
- # 创建 docker-compose.yml(使用变量替换密码和端口)
- cat > docker-compose.yml << EOF
- version: '3.8'
- services:
- node_exporter:
- image: prom/node-exporter:latest
- container_name: node_exporter
- restart: unless-stopped
- networks:
- - monitoring
- command:
- - '--path.rootfs=/host'
- pid: host
- volumes:
- - '/:/host:ro,rslave'
- prometheus:
- image: prom/prometheus:latest
- container_name: prometheus
- restart: unless-stopped
- networks:
- - monitoring
- volumes:
- - ./prometheus:/etc/prometheus
- - ./data/prometheus:/prometheus
- command:
- - '--config.file=/etc/prometheus/prometheus.yml'
- - '--storage.tsdb.path=/prometheus'
- - '--web.console.libraries=/usr/share/prometheus/console_libraries'
- - '--web.console.templates=/usr/share/prometheus/consoles'
- grafana:
- image: grafana/grafana:latest
- container_name: grafana
- restart: unless-stopped
- networks:
- - monitoring
- ports:
- - "${GRAFANA_PORT}:3000"
- volumes:
- - ./data/grafana:/var/lib/grafana
- environment:
- - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
- networks:
- monitoring:
- driver: bridge
- EOF
- # 设置目录权限
- chmod 777 data/prometheus data/grafana
- echo "
- === 部署完成 ==="
- echo "项目创建在: $(pwd)/${PROJECT_NAME}"
- echo "目录结构如下:"
- cd $PROJECT_NAME
- if command -v tree >/dev/null 2>&1; then
- tree .
- else
- echo "提示:未安装 tree 命令,无法显示目录结构"
- fi
- cd ..
- echo "
- 配置信息:
- - 项目名称: ${PROJECT_NAME}
- - Grafana 访问地址: http://localhost:${GRAFANA_PORT}
- - Grafana 管理员用户名: admin
- - Grafana 管理员密码: ${GRAFANA_PASSWORD}
- 后续步骤:
- 1. cd ${PROJECT_NAME}
- 2. 运行 docker-compose up -d 启动服务
- 3. 访问 http://localhost:${GRAFANA_PORT} 登录 Grafana
- 是否现在启动服务? (y/n)"
- read START
- if [[ $START == "y" || $START == "Y" ]]; then
- echo "正在启动服务..."
- cd $PROJECT_NAME
- docker-compose up -d
- echo "服务已启动!"
- echo "可以通过 http://localhost:${GRAFANA_PORT} 访问 Grafana"
- echo "Prometheus数据地址为http://prometheus:9090"
- cd ..
- fi
|