#!/usr/bin/env bash set -euo pipefail # --------------------------------------------------------------------------- # Klauke Enterprises — Observability Agent Installer # # Usage: # curl -sL https://installer.observability.klauke-enterprises.io | bash -s -- --api-key # # Installs node_exporter, vmagent, vlagent and configures systemd-journal-upload # to ship metrics and logs to the central observability platform. # --------------------------------------------------------------------------- # --- Versions (pinned) ----------------------------------------------------- NODE_EXPORTER_VERSION="1.9.1" VMAGENT_VERSION="1.118.0" VLAGENT_VERSION="1.46.0" # --- Endpoints -------------------------------------------------------------- METRICS_ENDPOINT="https://ingest.observability.klauke-enterprises.io" LOGS_ENDPOINT="https://logs.observability.klauke-enterprises.io" # --- Defaults --------------------------------------------------------------- SCRAPE_INTERVAL="30s" API_KEY="" # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- info() { printf '\033[1;34m[INFO]\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m[WARN]\033[0m %s\n' "$*"; } error() { printf '\033[1;31m[ERROR]\033[0m %s\n' "$*" >&2; } fatal() { error "$@"; exit 1; } # --------------------------------------------------------------------------- # Pre-flight checks # --------------------------------------------------------------------------- if [ "$(id -u)" -ne 0 ]; then fatal "Dieses Script muss als root ausgefuehrt werden." fi if ! grep -qiE 'debian|ubuntu' /etc/os-release 2>/dev/null; then fatal "Nur Debian und Ubuntu werden unterstuetzt." fi # --------------------------------------------------------------------------- # Argument parsing # --------------------------------------------------------------------------- while [ $# -gt 0 ]; do case "$1" in --api-key) shift API_KEY="${1:-}" ;; --api-key=*) API_KEY="${1#*=}" ;; *) warn "Unbekanntes Argument: $1" ;; esac shift done if [ -z "$API_KEY" ]; then fatal "Bitte --api-key angeben. Beispiel: bash install.sh --api-key MEIN_KEY" fi HOSTNAME_FQDN="$(hostname -f 2>/dev/null || hostname)" # --------------------------------------------------------------------------- # 1. node_exporter # --------------------------------------------------------------------------- install_node_exporter() { info "Installiere node_exporter v${NODE_EXPORTER_VERSION} ..." local url="https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz" local tmp="/tmp/node_exporter-${NODE_EXPORTER_VERSION}.tar.gz" local dir="/tmp/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64" # System user id -u node_exporter &>/dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin node_exporter # Download & extract curl -fsSL -o "$tmp" "$url" tar -xzf "$tmp" -C /tmp install -o root -g root -m 0755 "${dir}/node_exporter" /usr/local/bin/node_exporter # Systemd unit cat > /etc/systemd/system/node_exporter.service <<'UNIT' [Unit] Description=Prometheus Node Exporter After=network-online.target Wants=network-online.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter \ --web.listen-address=:9100 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target UNIT systemctl daemon-reload systemctl enable --now node_exporter # Cleanup rm -rf "$tmp" "$dir" info "node_exporter laeuft." } # --------------------------------------------------------------------------- # 2. vmagent # --------------------------------------------------------------------------- install_vmagent() { info "Installiere vmagent v${VMAGENT_VERSION} ..." local url="https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${VMAGENT_VERSION}/vmutils-linux-amd64-v${VMAGENT_VERSION}.tar.gz" local tmp="/tmp/vmutils-${VMAGENT_VERSION}.tar.gz" # System user id -u vmagent &>/dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin vmagent # Directories install -d -o vmagent -g vmagent -m 0755 /etc/vmagent install -d -o vmagent -g vmagent -m 0755 /var/lib/vmagent # Download & extract curl -fsSL -o "$tmp" "$url" tar -xzf "$tmp" -C /tmp install -o root -g root -m 0755 /tmp/vmagent-prod /usr/local/bin/vmagent # Scrape config cat > /etc/vmagent/config.yml < /etc/systemd/system/vmagent.service </dev/null || useradd --system --no-create-home --shell /usr/sbin/nologin vlagent # Directories install -d -o vlagent -g vlagent -m 0755 /etc/vlagent install -d -o vlagent -g vlagent -m 0755 /var/lib/vlagent # Download & extract curl -fsSL -o "$tmp" "$url" tar -xzf "$tmp" -C /tmp install -o root -g root -m 0755 /tmp/vlagent-prod /usr/local/bin/vlagent # Bearer token file printf '%s' "$API_KEY" > /etc/vlagent/bearer-token chown vlagent:vlagent /etc/vlagent/bearer-token chmod 0600 /etc/vlagent/bearer-token # Systemd unit cat > /etc/systemd/system/vlagent.service < /etc/systemd/journal-upload.conf.d/vlagent.conf <<'CONF' [Upload] URL=http://localhost:9429/insert/journald CONF systemctl daemon-reload systemctl enable --now systemd-journal-upload info "systemd-journal-upload laeuft." } # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- info "Klauke Enterprises Observability Agent Installer" info "API-Key: ${API_KEY:0:8}..." info "Hostname: ${HOSTNAME_FQDN}" info "" install_node_exporter install_vmagent install_vlagent configure_journal_upload info "" info "Installation abgeschlossen." info " Metrics -> ${METRICS_ENDPOINT}" info " Logs -> ${LOGS_ENDPOINT}"