diff --git a/Monitoring_Tools.sh b/Monitoring_Tools.sh index 1c0022d..96c3322 100644 --- a/Monitoring_Tools.sh +++ b/Monitoring_Tools.sh @@ -1,799 +1,46 @@ -#!/bin/bash +# 卸载 Blackbox Exporter +if [ "$UNINSTALL_BLACKBOX" == "y" ]; then + # 检查服务是否存在并执行操作 + if systemctl list-units --full -all | grep -q "blackbox-exporter.service"; then + if systemctl is-active --quiet blackbox-exporter; then + echo -e "${YELLOW}正在停止 Blackbox Exporter 服务...${NC}" + systemctl stop blackbox-exporter + fi + if systemctl is-enabled --quiet blackbox-exporter; then + echo -e "${YELLOW}正在禁用 Blackbox Exporter 服务...${NC}" + systemctl disable blackbox-exporter + fi + fi + if [ -f "$BLACKBOX_SERVICE_FILE" ]; then + echo -e "${YELLOW}正在删除 Blackbox Exporter systemd 服务文件...${NC}" + rm -f "$BLACKBOX_SERVICE_FILE" + systemctl daemon-reload + systemctl reset-failed + fi -# 功能:自动安装或卸载 Prometheus、Node Exporter、Grafana、Blackbox Exporter 和 Alertmanager,支持用户选择安装或卸载组件及指定版本或默认安装最新版本,适配系统架构 -# 作者:Grok3 -# 使用方法:chmod +x install_prometheus.sh && ./install_prometheus.sh [uninstall] + # 检查并删除配置文件 + if [ -f "$BLACKBOX_INSTALL_DIR/config.yml" ]; then + echo -e "${YELLOW}正在删除 Blackbox Exporter 配置文件...${NC}" + rm -f "$BLACKBOX_INSTALL_DIR/config.yml" + fi -# 设置颜色输出 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color + # 删除安装目录和数据目录 + if [ -d "$BLACKBOX_INSTALL_DIR" ]; then + echo -e "${YELLOW}正在删除 Blackbox Exporter 安装目录 ($BLACKBOX_INSTALL_DIR)...${NC}" + rm -rf "$BLACKBOX_INSTALL_DIR" + fi + if [ -d "$BLACKBOX_DATA_DIR" ]; then + echo -e "${YELLOW}正在删除 Blackbox Exporter 数据目录 ($BLACKBOX_DATA_DIR)...${NC}" + rm -rf "$BLACKBOX_DATA_DIR" + fi -# 检查是否为 root 用户或有 sudo 权限 -if [ "$EUID" -ne 0 ]; then - echo -e "${RED}错误:请以 root 用户或使用 sudo 权限运行此脚本!${NC}" - exit 1 -fi - -# 定义常量 -INSTALL_DIR="/opt/prometheus" -DATA_DIR="/opt/prometheus/data" -SERVICE_FILE="/etc/systemd/system/prometheus.service" -NODE_EXPORTER_INSTALL_DIR="/opt/node_exporter" -NODE_EXPORTER_SERVICE_FILE="/etc/systemd/system/node-exporter.service" -GRAFANA_CONFIG_DIR="/etc/grafana" -GRAFANA_SERVICE_FILE="/etc/systemd/system/grafana-server.service" -BLACKBOX_INSTALL_DIR="/opt/blackbox_exporter" -BLACKBOX_DATA_DIR="/opt/blackbox_exporter/data" -BLACKBOX_SERVICE_FILE="/etc/systemd/system/blackbox-exporter.service" -ALERTMANAGER_INSTALL_DIR="/opt/alertmanager" -ALERTMANAGER_DATA_DIR="/opt/alertmanager/data" -ALERTMANAGER_SERVICE_FILE="/etc/systemd/system/alertmanager.service" - -# 卸载函数 -uninstall_components() { - echo -e "${YELLOW}请选择要卸载的组件:${NC}" - echo -e "${YELLOW}1. Grafana${NC}" - echo -e "${YELLOW}2. Prometheus${NC}" - echo -e "${YELLOW}3. Node Exporter${NC}" - echo -e "${YELLOW}4. Blackbox Exporter${NC}" - echo -e "${YELLOW}5. Alertmanager${NC}" - echo -e "${YELLOW}请输入要卸载的组件编号(用空格分隔多个选项,例如:1 3):${NC}" - read -r UNINSTALL_SELECTION - - # 初始化卸载标志 - UNINSTALL_GRAFANA="n" - UNINSTALL_PROMETHEUS="n" - UNINSTALL_NODE_EXPORTER="n" - UNINSTALL_BLACKBOX="n" - UNINSTALL_ALERTMANAGER="n" - - # 解析用户输入的选择 - for SELECTED in $UNINSTALL_SELECTION; do - case $SELECTED in - 1) - UNINSTALL_GRAFANA="y" - echo -e "${GREEN}将卸载 Grafana。${NC}" - ;; - 2) - UNINSTALL_PROMETHEUS="y" - echo -e "${GREEN}将卸载 Prometheus。${NC}" - ;; - 3) - UNINSTALL_NODE_EXPORTER="y" - echo -e "${GREEN}将卸载 Node Exporter。${NC}" - ;; - 4) - UNINSTALL_BLACKBOX="y" - echo -e "${GREEN}将卸载 Blackbox Exporter。${NC}" - ;; - 5) - UNINSTALL_ALERTMANAGER="y" - echo -e "${GREEN}将卸载 Alertmanager。${NC}" - ;; - *) - echo -e "${RED}警告:无效选项 $SELECTED,已忽略。${NC}" - ;; - esac - done - - # 如果没有选择卸载任何组件,则退出 - if [ "$UNINSTALL_PROMETHEUS" != "y" ] && [ "$UNINSTALL_NODE_EXPORTER" != "y" ] && [ "$UNINSTALL_GRAFANA" != "y" ] && [ "$UNINSTALL_BLACKBOX" != "y" ] && [ "$UNINSTALL_ALERTMANAGER" != "y" ]; then - echo -e "${RED}错误:未选择卸载任何组件,脚本退出!${NC}" - exit 1 - fi - - echo -e "${YELLOW}正在卸载已选择的组件...${NC}" - - # 卸载 Prometheus - if [ "$UNINSTALL_PROMETHEUS" == "y" ]; then - # 检查服务是否存在并执行操作 - if systemctl list-units --full -all | grep -q "prometheus.service"; then - if systemctl is-active --quiet prometheus; then - echo -e "${YELLOW}正在停止 Prometheus 服务...${NC}" - systemctl stop prometheus - fi - if systemctl is-enabled --quiet prometheus; then - echo -e "${YELLOW}正在禁用 Prometheus 服务...${NC}" - systemctl disable prometheus - fi - fi - if [ -f "$SERVICE_FILE" ]; then - echo -e "${YELLOW}正在删除 Prometheus systemd 服务文件...${NC}" - rm -f "$SERVICE_FILE" - systemctl daemon-reload - systemctl reset-failed - fi - - # 删除安装目录和数据目录 - if [ -d "$INSTALL_DIR" ]; then - echo -e "${YELLOW}正在删除 Prometheus 安装目录 ($INSTALL_DIR)...${NC}" - rm -rf "$INSTALL_DIR" - fi - if [ -d "$DATA_DIR" ]; then - echo -e "${YELLOW}正在删除 Prometheus 数据目录 ($DATA_DIR)...${NC}" - rm -rf "$DATA_DIR" - fi - - # 删除用户和组 - if id prometheus &> /dev/null; then - echo -e "${YELLOW}正在删除 Prometheus 用户和组...${NC}" - userdel prometheus || true - fi - if getent group prometheus &> /dev/null; then - groupdel prometheus || true - fi - echo -e "${GREEN}Prometheus 已成功卸载!${NC}" - fi - - # 卸载 Node Exporter - if [ "$UNINSTALL_NODE_EXPORTER" == "y" ]; then - # 检查服务是否存在并执行操作 - if systemctl list-units --full -all | grep -q "node-exporter.service"; then - if systemctl is-active --quiet node-exporter; then - echo -e "${YELLOW}正在停止 Node Exporter 服务...${NC}" - systemctl stop node-exporter - fi - if systemctl is-enabled --quiet node-exporter; then - echo -e "${YELLOW}正在禁用 Node Exporter 服务...${NC}" - systemctl disable node-exporter - fi - fi - if [ -f "$NODE_EXPORTER_SERVICE_FILE" ]; then - echo -e "${YELLOW}正在删除 Node Exporter systemd 服务文件...${NC}" - rm -f "$NODE_EXPORTER_SERVICE_FILE" - systemctl daemon-reload - systemctl reset-failed - fi - - # 删除安装目录 - if [ -d "$NODE_EXPORTER_INSTALL_DIR" ]; then - echo -e "${YELLOW}正在删除 Node Exporter 安装目录 ($NODE_EXPORTER_INSTALL_DIR)...${NC}" - rm -rf "$NODE_EXPORTER_INSTALL_DIR" - fi - - # 删除用户和组 - if id node_exporter &> /dev/null; then - echo -e "${YELLOW}正在删除 Node Exporter 用户和组...${NC}" - userdel node_exporter || true - fi - if getent group node_exporter &> /dev/null; then - groupdel node_exporter || true - fi - echo -e "${GREEN}Node Exporter 已成功卸载!${NC}" - fi - - # 卸载 Grafana - if [ "$UNINSTALL_GRAFANA" == "y" ]; then - # 检查服务是否存在并执行操作 - if systemctl list-units --full -all | grep -q "grafana-server.service"; then - if systemctl is-active --quiet grafana-server; then - echo -e "${YELLOW}正在停止 Grafana 服务...${NC}" - systemctl stop grafana-server - fi - if systemctl is-enabled --quiet grafana-server; then - echo -e "${YELLOW}正在禁用 Grafana 服务...${NC}" - systemctl disable grafana-server - fi - fi - if [ -f "$GRAFANA_SERVICE_FILE" ] || command -v grafana-server &> /dev/null; then - echo -e "${YELLOW}正在删除 Grafana systemd 服务文件...${NC}" - rm -f "$GRAFANA_SERVICE_FILE" - systemctl daemon-reload - systemctl reset-failed - fi - - # 删除配置目录 - if [ -d "$GRAFANA_CONFIG_DIR" ]; then - echo -e "${YELLOW}正在删除 Grafana 配置目录 ($GRAFANA_CONFIG_DIR)...${NC}" - rm -rf "$GRAFANA_CONFIG_DIR" - fi - - # 卸载 Grafana 包(如果通过包管理器安装) - if command -v apt &> /dev/null; then - apt remove -y grafana || true - elif command -v yum &> /dev/null; then - yum remove -y grafana || true - fi - echo -e "${GREEN}Grafana 已成功卸载!${NC}" - fi - - # 卸载 Blackbox Exporter - if [ "$UNINSTALL_BLACKBOX" == "y" ]; then - # 检查服务是否存在并执行操作 - if systemctl list-units --full -all | grep -q "blackbox-exporter.service"; then - if systemctl is-active --quiet blackbox-exporter; then - echo -e "${YELLOW}正在停止 Blackbox Exporter 服务...${NC}" - systemctl stop blackbox-exporter - fi - if systemctl is-enabled --quiet blackbox-exporter; then - echo -e "${YELLOW}正在禁用 Blackbox Exporter 服务...${NC}" - systemctl disable blackbox-exporter - fi - fi - if [ -f "$BLACKBOX_SERVICE_FILE" ]; then - echo -e "${YELLOW}正在删除 Blackbox Exporter systemd 服务文件...${NC}" - rm -f "$BLACKBOX_SERVICE_FILE" - systemctl daemon-reload - systemctl reset-failed - fi - - # 删除安装目录和数据目录 - if [ -d "$BLACKBOX_INSTALL_DIR" ]; then - echo -e "${YELLOW}正在删除 Blackbox Exporter 安装目录 ($BLACKBOX_INSTALL_DIR)...${NC}" - rm -rf "$BLACKBOX_INSTALL_DIR" - fi - if [ -d "$BLACKBOX_DATA_DIR" ]; then - echo -e "${YELLOW}正在删除 Blackbox Exporter 数据目录 ($BLACKBOX_DATA_DIR)...${NC}" - rm -rf "$BLACKBOX_DATA_DIR" - fi - - # 删除用户和组 - if id blackbox &> /dev/null; then - echo -e "${YELLOW}正在删除 Blackbox Exporter 用户和组...${NC}" - userdel blackbox || true - fi - if getent group blackbox &> /dev/null; then - groupdel blackbox || true - fi - echo -e "${GREEN}Blackbox Exporter 已成功卸载!${NC}" - fi - - # 卸载 Alertmanager - if [ "$UNINSTALL_ALERTMANAGER" == "y" ]; then - # 检查服务是否存在并执行操作 - if systemctl list-units --full -all | grep -q "alertmanager.service"; then - if systemctl is-active --quiet alertmanager; then - echo -e "${YELLOW}正在停止 Alertmanager 服务...${NC}" - systemctl stop alertmanager - fi - if systemctl is-enabled --quiet alertmanager; then - echo -e "${YELLOW}正在禁用 Alertmanager 服务...${NC}" - systemctl disable alertmanager - fi - fi - if [ -f "$ALERTMANAGER_SERVICE_FILE" ]; then - echo -e "${YELLOW}正在删除 Alertmanager systemd 服务文件...${NC}" - rm -f "$ALERTMANAGER_SERVICE_FILE" - systemctl daemon-reload - systemctl reset-failed - fi - - # 删除安装目录和数据目录 - if [ -d "$ALERTMANAGER_INSTALL_DIR" ]; then - echo -e "${YELLOW}正在删除 Alertmanager 安装目录 ($ALERTMANAGER_INSTALL_DIR)...${NC}" - rm -rf "$ALERTMANAGER_INSTALL_DIR" - fi - if [ -d "$ALERTMANAGER_DATA_DIR" ]; then - echo -e "${YELLOW}正在删除 Alertmanager 数据目录 ($ALERTMANAGER_DATA_DIR)...${NC}" - rm -rf "$ALERTMANAGER_DATA_DIR" - fi - - # 删除用户和组 - if id alertmanager &> /dev/null; then - echo -e "${YELLOW}正在删除 Alertmanager 用户和组...${NC}" - userdel alertmanager || true - fi - if getent group alertmanager &> /dev/null; then - groupdel alertmanager || true - fi - echo -e "${GREEN}Alertmanager 已成功卸载!${NC}" - fi - - echo -e "${GREEN}所选组件卸载完成!${NC}" - exit 0 -} - -# 检查是否为卸载模式,确保在 curl 方式下也能正确处理参数 -if [ "$1" == "uninstall" ]; then - uninstall_components -fi - -# 获取系统架构 -ARCH=$(uname -m) -case $ARCH in - x86_64) - PROM_ARCH="linux-amd64" - ;; - aarch64|arm64) - PROM_ARCH="linux-arm64" - ;; - *) - echo -e "${RED}错误:不支持的系统架构 ($ARCH)!${NC}" - exit 1 - ;; -esac -echo -e "${GREEN}检测到系统架构:$ARCH,使用 Prometheus 架构:$PROM_ARCH${NC}" - -# 检查 wget 是否安装 -if ! command -v wget &> /dev/null; then - echo -e "${YELLOW}wget 未安装,正在安装...${NC}" - if command -v apt &> /dev/null; then - apt update && apt install -y wget - elif command -v yum &> /dev/null; then - yum install -y wget - else - echo -e "${RED}错误:无法确定包管理器,无法安装 wget!${NC}" - exit 1 - fi -fi - -# 交互式选择安装的组件 -echo -e "${YELLOW}请选择要安装的组件:${NC}" -echo -e "${YELLOW}1. Grafana${NC}" -echo -e "${YELLOW}2. Prometheus${NC}" -echo -e "${YELLOW}3. Node Exporter${NC}" -echo -e "${YELLOW}4. Blackbox Exporter${NC}" -echo -e "${YELLOW}5. Alertmanager${NC}" -echo -e "${YELLOW}请输入要安装的组件编号(用空格分隔多个选项,例如:1 3):${NC}" -read -r SELECTION - -# 初始化安装标志 -INSTALL_GRAFANA="n" -INSTALL_PROMETHEUS="n" -INSTALL_NODE_EXPORTER="n" -INSTALL_BLACKBOX="n" -INSTALL_ALERTMANAGER="n" - -# 解析用户输入的选择 -for SELECTED in $SELECTION; do - case $SELECTED in - 1) - INSTALL_GRAFANA="y" - echo -e "${GREEN}将安装 Grafana。${NC}" - ;; - 2) - INSTALL_PROMETHEUS="y" - echo -e "${GREEN}将安装 Prometheus。${NC}" - ;; - 3) - INSTALL_NODE_EXPORTER="y" - echo -e "${GREEN}将安装 Node Exporter。${NC}" - ;; - 4) - INSTALL_BLACKBOX="y" - echo -e "${GREEN}将安装 Blackbox Exporter。${NC}" - ;; - 5) - INSTALL_ALERTMANAGER="y" - echo -e "${GREEN}将安装 Alertmanager。${NC}" - ;; - *) - echo -e "${RED}警告:无效选项 $SELECTED,已忽略。${NC}" - ;; - esac -done - -# 如果没有选择安装任何组件,则退出 -if [ "$INSTALL_PROMETHEUS" != "y" ] && [ "$INSTALL_NODE_EXPORTER" != "y" ] && [ "$INSTALL_GRAFANA" != "y" ] && [ "$INSTALL_BLACKBOX" != "y" ] && [ "$INSTALL_ALERTMANAGER" != "y" ]; then - echo -e "${RED}错误:未选择安装任何组件,脚本退出!${NC}" - exit 1 -fi - -# 安装 Prometheus 的逻辑 -if [ "$INSTALL_PROMETHEUS" == "y" ]; then - echo -e "${YELLOW}正在获取 Prometheus 最新版本...${NC}" - VERSION=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') - if [ -z "$VERSION" ]; then - echo -e "${RED}错误:无法获取 Prometheus 最新版本,请检查网络!${NC}" - exit 1 - fi - echo -e "${GREEN}Prometheus 最新版本为:$VERSION${NC}" - DOWNLOAD_URL="https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.${PROM_ARCH}.tar.gz" - - # 检查 Prometheus 下载链接是否有效 - echo -e "${YELLOW}正在验证 Prometheus 下载链接...${NC}" - HTTP_STATUS=$(curl -s -I "$DOWNLOAD_URL" | grep -i "HTTP/" | awk '{print $2}' | head -1) - if [[ "$HTTP_STATUS" != "200" && "$HTTP_STATUS" != "302" ]]; then - echo -e "${RED}错误:无效的 Prometheus 下载链接 ($DOWNLOAD_URL)!${NC}" - echo -e "${YELLOW}HTTP 状态码:$HTTP_STATUS${NC}" - exit 1 - fi - echo -e "${GREEN}Prometheus 下载链接有效,HTTP 状态码:$HTTP_STATUS${NC}" - - echo -e "${YELLOW}正在创建 Prometheus 安装目录和数据目录...${NC}" - mkdir -p "$INSTALL_DIR" "$DATA_DIR" - if [ $? -ne 0 ]; then - echo -e "${RED}错误:创建 Prometheus 目录失败!${NC}" - exit 1 - fi - - echo -e "${YELLOW}正在下载 Prometheus v${VERSION}...${NC}" - wget -O /tmp/prometheus.tar.gz "$DOWNLOAD_URL" - if [ $? -ne 0 ]; then - echo -e "${RED}错误:下载 Prometheus 失败,请检查网络!${NC}" - exit 1 - fi - - echo -e "${YELLOW}正在解压并安装 Prometheus...${NC}" - tar -xzf /tmp/prometheus.tar.gz -C /tmp - mv /tmp/prometheus-${VERSION}.${PROM_ARCH}/* "$INSTALL_DIR" - if [ $? -ne 0 ]; then - echo -e "${RED}错误:解压或移动 Prometheus 文件失败!${NC}" - exit 1 - fi - - # 清理临时文件 - rm -rf /tmp/prometheus.tar.gz /tmp/prometheus-${VERSION}.${PROM_ARCH} - - # 创建 Prometheus 用户和组 - echo -e "${YELLOW}正在创建 Prometheus 用户和组...${NC}" - useradd -M -s /bin/false prometheus || true - chown -R prometheus:prometheus "$INSTALL_DIR" "$DATA_DIR" - - # 创建 Prometheus systemd 服务文件 - echo -e "${YELLOW}正在创建 Prometheus systemd 服务文件...${NC}" - cat > "$SERVICE_FILE" < "$NODE_EXPORTER_SERVICE_FILE" < /dev/null; then - apt update - apt install -y software-properties-common - add-apt-repository -y "deb https://packages.grafana.com/oss/deb stable main" - curl -s https://packages.grafana.com/gpg.key | apt-key add - - apt update - apt install -y grafana - elif command -v yum &> /dev/null; then - cat > /etc/yum.repos.d/grafana.repo < "$BLACKBOX_SERVICE_FILE" < "$ALERTMANAGER_SERVICE_FILE" < /dev/null; then + echo -e "${YELLOW}正在删除 Blackbox Exporter 用户和组...${NC}" + userdel blackbox || true + fi + if getent group blackbox &> /dev/null; then + groupdel blackbox || true + fi + echo -e "${GREEN}Blackbox Exporter 已成功卸载!${NC}" fi