Toolbox/Monitoring_Tools.sh
2025-04-24 18:09:37 +08:00

894 lines
33 KiB
Bash
Raw Permalink 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
# 功能:自动安装或卸载 Prometheus、Node Exporter、Grafana、Blackbox Exporter 和 Alertmanager支持用户选择安装或卸载组件及指定版本或默认安装最新版本适配系统架构
# 作者Grok3
# 使用方法chmod +x install_prometheus.sh && ./install_prometheus.sh
# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查是否为 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 [ -f "$BLACKBOX_INSTALL_DIR/config.yml" ]; then
echo -e "${YELLOW}正在删除 Blackbox Exporter 配置文件...${NC}"
rm -f "$BLACKBOX_INSTALL_DIR/config.yml"
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
}
# 主菜单:选择安装或卸载
echo -e "${YELLOW}请选择操作:${NC}"
echo -e "${YELLOW}1. 安装组件${NC}"
echo -e "${YELLOW}2. 卸载组件${NC}"
echo -e "${YELLOW}请输入操作编号1 或 2${NC}"
read -r OPERATION
case $OPERATION in
1)
echo -e "${GREEN}选择了安装操作。${NC}"
;;
2)
echo -e "${GREEN}选择了卸载操作。${NC}"
uninstall_components
;;
*)
echo -e "${RED}错误:无效选项 $OPERATION,脚本退出!${NC}"
exit 1
;;
esac
# 获取系统架构
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" <<EOF
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=$INSTALL_DIR/prometheus --config.file $INSTALL_DIR/prometheus.yml --storage.tsdb.path $DATA_DIR
[Install]
WantedBy=multi-user.target
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Prometheus 服务文件失败!${NC}"
exit 1
fi
echo -e "${GREEN}Prometheus 安装完成!${NC}"
fi
# 安装 Node Exporter 的逻辑
if [ "$INSTALL_NODE_EXPORTER" == "y" ]; then
echo -e "${YELLOW}正在获取 Node Exporter 最新版本...${NC}"
NODE_EXPORTER_VERSION=$(curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
if [ -z "$NODE_EXPORTER_VERSION" ]; then
echo -e "${RED}错误:无法获取 Node Exporter 最新版本,请检查网络!${NC}"
exit 1
fi
echo -e "${GREEN}Node Exporter 最新版本为:$NODE_EXPORTER_VERSION${NC}"
NODE_EXPORTER_DOWNLOAD_URL="https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.${PROM_ARCH}.tar.gz"
# 检查 Node Exporter 下载链接是否有效
echo -e "${YELLOW}正在验证 Node Exporter 下载链接...${NC}"
HTTP_STATUS=$(curl -s -I "$NODE_EXPORTER_DOWNLOAD_URL" | grep -i "HTTP/" | awk '{print $2}' | head -1)
if [[ "$HTTP_STATUS" != "200" && "$HTTP_STATUS" != "302" ]]; then
echo -e "${RED}错误:无效的 Node Exporter 下载链接 ($NODE_EXPORTER_DOWNLOAD_URL)${NC}"
echo -e "${YELLOW}HTTP 状态码:$HTTP_STATUS${NC}"
exit 1
fi
echo -e "${GREEN}Node Exporter 下载链接有效HTTP 状态码:$HTTP_STATUS${NC}"
echo -e "${YELLOW}正在创建 Node Exporter 安装目录...${NC}"
mkdir -p "$NODE_EXPORTER_INSTALL_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Node Exporter 目录失败!${NC}"
exit 1
fi
echo -e "${YELLOW}正在下载 Node Exporter v${NODE_EXPORTER_VERSION}...${NC}"
wget -O /tmp/node_exporter.tar.gz "$NODE_EXPORTER_DOWNLOAD_URL"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:下载 Node Exporter 失败,请检查网络!${NC}"
exit 1
fi
echo -e "${YELLOW}正在解压并安装 Node Exporter...${NC}"
tar -xzf /tmp/node_exporter.tar.gz -C /tmp
mv /tmp/node_exporter-${NODE_EXPORTER_VERSION}.${PROM_ARCH}/* "$NODE_EXPORTER_INSTALL_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:解压或移动 Node Exporter 文件失败!${NC}"
exit 1
fi
# 清理临时文件
rm -rf /tmp/node_exporter.tar.gz /tmp/node_exporter-${NODE_EXPORTER_VERSION}.${PROM_ARCH}
# 创建 Node Exporter 用户和组
echo -e "${YELLOW}正在创建 Node Exporter 用户和组...${NC}"
useradd -M -s /bin/false node_exporter || true
chown -R node_exporter:node_exporter "$NODE_EXPORTER_INSTALL_DIR"
# 创建 Node Exporter systemd 服务文件
echo -e "${YELLOW}正在创建 Node Exporter systemd 服务文件...${NC}"
cat > "$NODE_EXPORTER_SERVICE_FILE" <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=$NODE_EXPORTER_INSTALL_DIR/node_exporter
[Install]
WantedBy=multi-user.target
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Node Exporter 服务文件失败!${NC}"
exit 1
fi
echo -e "${GREEN}Node Exporter 安装完成!${NC}"
fi
# 安装 Grafana 的逻辑
if [ "$INSTALL_GRAFANA" == "y" ]; then
echo -e "${YELLOW}正在安装 Grafana...${NC}"
if command -v apt &> /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 <<EOF
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
yum install -y grafana
else
echo -e "${RED}错误:无法确定包管理器,无法安装 Grafana${NC}"
exit 1
fi
if [ $? -ne 0 ]; then
echo -e "${RED}错误:安装 Grafana 失败!${NC}"
exit 1
fi
echo -e "${GREEN}Grafana 安装完成!${NC}"
fi
# 安装 Blackbox Exporter 的逻辑
if [ "$INSTALL_BLACKBOX" == "y" ]; then
echo -e "${YELLOW}正在获取 Blackbox Exporter 最新版本...${NC}"
BLACKBOX_VERSION=$(curl -s https://api.github.com/repos/prometheus/blackbox_exporter/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
if [ -z "$BLACKBOX_VERSION" ]; then
echo -e "${RED}错误:无法获取 Blackbox Exporter 最新版本,请检查网络!${NC}"
exit 1
fi
echo -e "${GREEN}Blackbox Exporter 最新版本为:$BLACKBOX_VERSION${NC}"
BLACKBOX_DOWNLOAD_URL="https://github.com/prometheus/blackbox_exporter/releases/download/v${BLACKBOX_VERSION}/blackbox_exporter-${BLACKBOX_VERSION}.${PROM_ARCH}.tar.gz"
# 检查 Blackbox Exporter 下载链接是否有效
echo -e "${YELLOW}正在验证 Blackbox Exporter 下载链接...${NC}"
HTTP_STATUS=$(curl -s -I "$BLACKBOX_DOWNLOAD_URL" | grep -i "HTTP/" | awk '{print $2}' | head -1)
if [[ "$HTTP_STATUS" != "200" && "$HTTP_STATUS" != "302" ]]; then
echo -e "${RED}错误:无效的 Blackbox Exporter 下载链接 ($BLACKBOX_DOWNLOAD_URL)${NC}"
echo -e "${YELLOW}HTTP 状态码:$HTTP_STATUS${NC}"
exit 1
fi
echo -e "${GREEN}Blackbox Exporter 下载链接有效HTTP 状态码:$HTTP_STATUS${NC}"
echo -e "${YELLOW}正在创建 Blackbox Exporter 安装目录和数据目录...${NC}"
mkdir -p "$BLACKBOX_INSTALL_DIR" "$BLACKBOX_DATA_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Blackbox Exporter 目录失败!${NC}"
exit 1
fi
echo -e "${YELLOW}正在下载 Blackbox Exporter v${BLACKBOX_VERSION}...${NC}"
wget -O /tmp/blackbox_exporter.tar.gz "$BLACKBOX_DOWNLOAD_URL"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:下载 Blackbox Exporter 失败,请检查网络!${NC}"
exit 1
fi
echo -e "${YELLOW}正在解压并安装 Blackbox Exporter...${NC}"
tar -xzf /tmp/blackbox_exporter.tar.gz -C /tmp
mv /tmp/blackbox_exporter-${BLACKBOX_VERSION}.${PROM_ARCH}/* "$BLACKBOX_INSTALL_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:解压或移动 Blackbox Exporter 文件失败!${NC}"
exit 1
fi
# 清理临时文件
rm -rf /tmp/blackbox_exporter.tar.gz /tmp/blackbox_exporter-${BLACKBOX_VERSION}.${PROM_ARCH}
# 创建 Blackbox Exporter 用户和组
echo -e "${YELLOW}正在创建 Blackbox Exporter 用户和组...${NC}"
useradd -M -s /bin/false blackbox || true
chown -R blackbox:blackbox "$BLACKBOX_INSTALL_DIR" "$BLACKBOX_DATA_DIR"
# 创建 Blackbox Exporter 配置文件
echo -e "${YELLOW}正在创建 Blackbox Exporter 配置文件...${NC}"
cat > "$BLACKBOX_INSTALL_DIR/config.yml" <<EOF
modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
grpc:
prober: grpc
grpc:
tls: true
preferred_ip_protocol: "ip4"
grpc_plain:
prober: grpc
grpc:
tls: false
service: "service1"
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: "SSH-2.0-blackbox-ssh-check"
ssh_banner_extract:
prober: tcp
timeout: 5s
tcp:
query_response:
- expect: "^SSH-2.0-([^ -]+)(?: (.*))?$"
labels:
- name: ssh_version
value: "${1}"
- name: ssh_comments
value: "${2}"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp
icmp_ttl5:
prober: icmp
timeout: 5s
icmp:
ttl: 5
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Blackbox Exporter 配置文件失败!${NC}"
exit 1
fi
chown blackbox:blackbox "$BLACKBOX_INSTALL_DIR/config.yml"
# 创建 Blackbox Exporter systemd 服务文件
echo -e "${YELLOW}正在创建 Blackbox Exporter systemd 服务文件...${NC}"
cat > "$BLACKBOX_SERVICE_FILE" <<EOF
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=blackbox
Group=blackbox
Type=simple
ExecStart=$BLACKBOX_INSTALL_DIR/blackbox_exporter --config.file=$BLACKBOX_INSTALL_DIR/config.yml
[Install]
WantedBy=multi-user.target
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Blackbox Exporter 服务文件失败!${NC}"
exit 1
fi
echo -e "${GREEN}Blackbox Exporter 安装完成!${NC}"
fi
# 安装 Alertmanager 的逻辑
if [ "$INSTALL_ALERTMANAGER" == "y" ]; then
echo -e "${YELLOW}正在获取 Alertmanager 最新版本...${NC}"
ALERTMANAGER_VERSION=$(curl -s https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
if [ -z "$ALERTMANAGER_VERSION" ]; then
echo -e "${RED}错误:无法获取 Alertmanager 最新版本,请检查网络!${NC}"
exit 1
fi
echo -e "${GREEN}Alertmanager 最新版本为:$ALERTMANAGER_VERSION${NC}"
ALERTMANAGER_DOWNLOAD_URL="https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.${PROM_ARCH}.tar.gz"
# 检查 Alertmanager 下载链接是否有效
echo -e "${YELLOW}正在验证 Alertmanager 下载链接...${NC}"
HTTP_STATUS=$(curl -s -I "$ALERTMANAGER_DOWNLOAD_URL" | grep -i "HTTP/" | awk '{print $2}' | head -1)
if [[ "$HTTP_STATUS" != "200" && "$HTTP_STATUS" != "302" ]]; then
echo -e "${RED}错误:无效的 Alertmanager 下载链接 ($ALERTMANAGER_DOWNLOAD_URL)${NC}"
echo -e "${YELLOW}HTTP 状态码:$HTTP_STATUS${NC}"
exit 1
fi
echo -e "${GREEN}Alertmanager 下载链接有效HTTP 状态码:$HTTP_STATUS${NC}"
echo -e "${YELLOW}正在创建 Alertmanager 安装目录和数据目录...${NC}"
mkdir -p "$ALERTMANAGER_INSTALL_DIR" "$ALERTMANAGER_DATA_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Alertmanager 目录失败!${NC}"
exit 1
fi
echo -e "${YELLOW}正在下载 Alertmanager v${ALERTMANAGER_VERSION}...${NC}"
wget -O /tmp/alertmanager.tar.gz "$ALERTMANAGER_DOWNLOAD_URL"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:下载 Alertmanager 失败,请检查网络!${NC}"
exit 1
fi
echo -e "${YELLOW}正在解压并安装 Alertmanager...${NC}"
tar -xzf /tmp/alertmanager.tar.gz -C /tmp
mv /tmp/alertmanager-${ALERTMANAGER_VERSION}.${PROM_ARCH}/* "$ALERTMANAGER_INSTALL_DIR"
if [ $? -ne 0 ]; then
echo -e "${RED}错误:解压或移动 Alertmanager 文件失败!${NC}"
exit 1
fi
# 清理临时文件
rm -rf /tmp/alertmanager.tar.gz /tmp/alertmanager-${ALERTMANAGER_VERSION}.${PROM_ARCH}
# 创建 Alertmanager 用户和组
echo -e "${YELLOW}正在创建 Alertmanager 用户和组...${NC}"
useradd -M -s /bin/false alertmanager || true
chown -R alertmanager:alertmanager "$ALERTMANAGER_INSTALL_DIR" "$ALERTMANAGER_DATA_DIR"
# 创建 Alertmanager systemd 服务文件
echo -e "${YELLOW}正在创建 Alertmanager systemd 服务文件...${NC}"
cat > "$ALERTMANAGER_SERVICE_FILE" <<EOF
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=$ALERTMANAGER_INSTALL_DIR/alertmanager --config.file=$ALERTMANAGER_INSTALL_DIR/alertmanager.yml --storage.path=$ALERTMANAGER_DATA_DIR
[Install]
WantedBy=multi-user.target
EOF
if [ $? -ne 0 ]; then
echo -e "${RED}错误:创建 Alertmanager 服务文件失败!${NC}"
exit 1
fi
echo -e "${GREEN}Alertmanager 安装完成!${NC}"
fi
# 重新加载 systemd 并启动服务
echo -e "${YELLOW}正在启动已安装的服务...${NC}"
systemctl daemon-reload
systemctl reset-failed
if [ "$INSTALL_PROMETHEUS" == "y" ]; then
systemctl start prometheus
systemctl enable prometheus
if systemctl is-active --quiet prometheus; then
echo -e "${GREEN}Prometheus 安装成功并已启动!${NC}"
echo -e "${GREEN}访问 http://你的服务器IP:9090 查看 Prometheus Web UI。${NC}"
else
echo -e "${RED}错误Prometheus 服务启动失败!${NC}"
echo -e "${YELLOW}请检查日志journalctl -u prometheus -f${NC}"
exit 1
fi
fi
if [ "$INSTALL_NODE_EXPORTER" == "y" ]; then
if [ -f "$NODE_EXPORTER_SERVICE_FILE" ]; then
systemctl start node-exporter
systemctl enable node-exporter
if systemctl is-active --quiet node-exporter; then
echo -e "${GREEN}Node Exporter 安装成功并已启动!${NC}"
echo -e "${GREEN}访问 http://你的服务器IP:9100/metrics 查看 Node Exporter 指标。${NC}"
else
echo -e "${RED}错误Node Exporter 服务启动失败!${NC}"
echo -e "${YELLOW}请检查日志journalctl -u node-exporter -f${NC}"
exit 1
fi
else
echo -e "${RED}错误Node Exporter 服务文件未找到 ($NODE_EXPORTER_SERVICE_FILE)${NC}"
exit 1
fi
fi
if [ "$INSTALL_GRAFANA" == "y" ]; then
systemctl start grafana-server
systemctl enable grafana-server
if systemctl is-active --quiet grafana-server; then
echo -e "${GREEN}Grafana 安装成功并已启动!${NC}"
echo -e "${GREEN}访问 http://你的服务器IP:3000 查看 Grafana Web UI默认用户/密码admin/admin${NC}"
else
echo -e "${RED}错误Grafana 服务启动失败!${NC}"
echo -e "${YELLOW}请检查日志journalctl -u grafana-server -f${NC}"
exit 1
fi
fi
if [ "$INSTALL_BLACKBOX" == "y" ]; then
systemctl start blackbox-exporter
systemctl enable blackbox-exporter
if systemctl is-active --quiet blackbox-exporter; then
echo -e "${GREEN}Blackbox Exporter 安装成功并已启动!${NC}"
echo -e "${GREEN}访问 http://你的服务器IP:9115/metrics 查看 Blackbox Exporter 指标。${NC}"
else
echo -e "${RED}错误Blackbox Exporter 服务启动失败!${NC}"
echo -e "${YELLOW}请检查日志journalctl -u blackbox-exporter -f${NC}"
exit 1
fi
fi
if [ "$INSTALL_ALERTMANAGER" == "y" ]; then
systemctl start alertmanager
systemctl enable alertmanager
if systemctl is-active --quiet alertmanager; then
echo -e "${GREEN}Alertmanager 安装成功并已启动!${NC}"
echo -e "${GREEN}访问 http://你的服务器IP:9093 查看 Alertmanager Web UI。${NC}"
else
echo -e "${RED}错误Alertmanager 服务启动失败!${NC}"
echo -e "${YELLOW}请检查日志journalctl -u alertmanager -f${NC}"
exit 1
fi
fi
# 总结安装结果
echo -e "${GREEN}安装完成!${NC}"
if [ "$INSTALL_PROMETHEUS" == "y" ]; then
echo -e "${GREEN}Prometheus 版本v${VERSION}${NC}"
fi
if [ "$INSTALL_NODE_EXPORTER" == "y" ]; then
echo -e "${GREEN}Node Exporter 版本v${NODE_EXPORTER_VERSION}${NC}"
fi
if [ "$INSTALL_GRAFANA" == "y" ]; then
echo -e "${GREEN}Grafana 已安装(版本由包管理器确定)${NC}"
fi
if [ "$INSTALL_BLACKBOX" == "y" ]; then
echo -e "${GREEN}Blackbox Exporter 版本v${BLACKBOX_VERSION}${NC}"
fi
if [ "$INSTALL_ALERTMANAGER" == "y" ]; then
echo -e "${GREEN}Alertmanager 版本v${ALERTMANAGER_VERSION}${NC}"
fi