Files
Linux-Shell/Prometheus/install_blackbox_exporter.sh
CN-JS-HuiBai dc2e895e45 完善脚本
2026-04-05 23:19:41 +08:00

218 lines
7.2 KiB
Bash

#!/bin/bash
set -e
# Detect Operation System
if command -v apt >/dev/null 2>&1; then
echo "Detected apt-based system"
sudo apt update
sudo apt install -y wget curl tar
elif command -v dnf >/dev/null 2>&1; then
echo "Detected dnf-based system"
sudo dnf install -y wget curl tar
else
echo "Unsupported package manager"
exit 1
fi
# Download Blackbox Exporter
VERSION="0.28.0"
ARCH="amd64"
CN_URL="https://s3.cloudyun.top/downloads/blackbox_exporter-${VERSION}.linux-${ARCH}.tar.gz"
GLOBAL_URL="https://github.com/prometheus/blackbox_exporter/releases/download/v${VERSION}/blackbox_exporter-${VERSION}.linux-${ARCH}.tar.gz"
TARGET="/tmp/blackbox_exporter.tar.gz"
is_cn=false
echo "Detecting geographic location..."
COUNTRY=$(curl -s --max-time 3 https://ipinfo.littlediary.cn/country || true)
if [ "$COUNTRY" = "CN" ]; then
is_cn=true
fi
if [ "$is_cn" = true ]; then
echo "Geolocation: China mainland detected"
DOWNLOAD_URL="$CN_URL"
else
echo "Geolocation: non-China region detected"
DOWNLOAD_URL="$GLOBAL_URL"
fi
echo "Downloading from: $DOWNLOAD_URL"
curl -fL -o "$TARGET" "$DOWNLOAD_URL"
# Extract
echo "Extracting Blackbox Exporter..."
tar -zxvf "$TARGET" -C /tmp
sudo mkdir -p /blackbox_exporter
sudo cp "/tmp/blackbox_exporter-${VERSION}.linux-${ARCH}/blackbox_exporter" /blackbox_exporter/
sudo cp "/tmp/blackbox_exporter-${VERSION}.linux-${ARCH}/blackbox.yml" /blackbox_exporter/
# choosing port
DEFAULT_PORT=9115
if [ -t 0 ]; then
while true; do
read -rp "Please enter blackbox_exporter listen port [default: ${DEFAULT_PORT}]: " PORT
PORT=${PORT:-$DEFAULT_PORT}
if [[ "$PORT" =~ ^[0-9]+$ ]] && [ "$PORT" -ge 1 ] && [ "$PORT" -le 65535 ]; then
break
else
echo "Invalid port. Please enter a number between 1 and 65535."
fi
done
else
PORT=$DEFAULT_PORT
echo "No TTY detected, using default port: $PORT"
fi
# Configure monitoring targets
if [ -d "/etc/prometheus" ]; then
TARGETS_DIR="/etc/prometheus/blackbox_targets"
echo "Prometheus detected, targets will be saved to $TARGETS_DIR"
else
TARGETS_DIR="/blackbox_exporter/targets"
fi
if [ -t 0 ]; then
sudo mkdir -p "$TARGETS_DIR"
echo "========================================================="
echo "Configuring monitoring objects (interactive menu)"
echo "========================================================="
while true; do
echo "Choose a monitoring type to configure:"
echo "1) ICMP (Ping)"
echo "2) HTTP Status (2xx)"
echo "3) TCP Connect (Port Check)"
echo "4) Show Current Configuration"
echo "5) Finish Configuration"
read -rp "Your choice [1-5]: " CHOICE
case $CHOICE in
1)
read -rp "Enter ICMP targets (space separated, e.g. 8.8.8.8 1.1.1.1): " VAL
if [ -n "$VAL" ]; then
echo "- targets:" | sudo tee "$TARGETS_DIR/icmp.yml" > /dev/null
for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/icmp.yml" > /dev/null; done
echo "Saved to: $TARGETS_DIR/icmp.yml"
fi
;;
2)
read -rp "Enter HTTP targets (space separated, e.g. https://google.com): " VAL
if [ -n "$VAL" ]; then
echo "- targets:" | sudo tee "$TARGETS_DIR/http.yml" > /dev/null
for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/http.yml" > /dev/null; done
echo "Saved to: $TARGETS_DIR/http.yml"
fi
;;
3)
read -rp "Enter TCP targets (space separated, e.g. 1.1.1.1:443 8.8.8.8:53): " VAL
if [ -n "$VAL" ]; then
echo "- targets:" | sudo tee "$TARGETS_DIR/tcp.yml" > /dev/null
for t in $VAL; do echo " - $t" | sudo tee -a "$TARGETS_DIR/tcp.yml" > /dev/null; done
echo "Saved to: $TARGETS_DIR/tcp.yml"
fi
;;
4)
echo "Current Target Files in $TARGETS_DIR:"
ls -l "$TARGETS_DIR"/*.yml 2>/dev/null || echo "No targets configured yet."
;;
5)
break
;;
*)
echo "Invalid choice. Please try again."
;;
esac
echo "---------------------------------------------------------"
done
fi
# Create systemd service file
SERVICE_FILE="/etc/systemd/system/blackbox_exporter.service"
echo "Creating systemd service file..."
sudo tee "$SERVICE_FILE" > /dev/null <<EOF
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=root
WorkingDirectory=/blackbox_exporter
ExecStart=/blackbox_exporter/blackbox_exporter --config.file=/blackbox_exporter/blackbox.yml --web.listen-address=":${PORT}"
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# Reload systemd, enable and start service
echo "Enabling and starting blackbox_exporter service..."
sudo systemctl daemon-reload
sudo systemctl enable --now blackbox_exporter.service
# Automatically integrate with Prometheus if present
PROMETHEUS_YML="/etc/prometheus/prometheus.yml"
if [ -f "$PROMETHEUS_YML" ]; then
echo "Integrating with Prometheus..."
TEMP_CONF="/tmp/blackbox_jobs.yml"
rm -f "$TEMP_CONF"
# Mapping table for modules
# icmp -> icmp
# http -> http_2xx
# tcp -> tcp_connect
for type in icmp http tcp; do
MODULE_NAME="$type"
[ "$type" == "http" ] && MODULE_NAME="http_2xx"
[ "$type" == "tcp" ] && MODULE_NAME="tcp_connect"
if [ -f "$TARGETS_DIR/${type}.yml" ] && ! grep -q "job_name: 'blackbox-${type}'" "$PROMETHEUS_YML"; then
echo "Adding job: blackbox-${type}"
cat <<EOF >> "$TEMP_CONF"
- job_name: 'blackbox-${type}'
metrics_path: /probe
params:
module: [$MODULE_NAME]
file_sd_configs:
- files:
- $TARGETS_DIR/${type}.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:${PORT}
EOF
fi
done
if [ -f "$TEMP_CONF" ]; then
if [ -t 0 ]; then
read -rp "Found $PROMETHEUS_YML. Would you like to append the new blackbox jobs automatically? [y/N]: " DO_APPEND
else
DO_APPEND="y"
fi
if [[ "$DO_APPEND" =~ ^[Yy]$ ]]; then
cat "$TEMP_CONF" | sudo tee -a "$PROMETHEUS_YML" > /dev/null
echo "Jobs appended to $PROMETHEUS_YML."
if [ -f "/usr/bin/restart_prometheus" ]; then
echo "Restarting Prometheus..."
sudo /usr/bin/restart_prometheus
else
echo "Please restart Prometheus to apply changes."
fi
fi
else
echo "No new Blackbox jobs to add to $PROMETHEUS_YML."
fi
fi
echo "========================================================="
echo "Blackbox Exporter installation and integration completed!"
echo "Listening on port: ${PORT}"
echo "========================================================="