node_exporter+Prometheus+grafana配置脚本.md 7.0 KB


title: node_exporter+Prometheus+grafana配置脚本 date: 2024-11-23T17:51:56+08:00

lastmod: 2024-11-23T17:55:21+08:00

node_exporter+Prometheus+grafana配置脚本

#!/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