feat(proxmox): pvesh-basierter exec-Input statt inputs.proxmox (kein Token/ACL noetig)
This commit is contained in:
1 parent
2cee9ff8a3
commit
72756babae
3 files changed
+90
-2
No files matched your search
+12
-2
@@ -250,8 +250,18 @@ fetch_conf telegraf/base.conf /etc/telegraf/telegraf.conf
|
|||||||
rm -f /etc/telegraf/telegraf.d/*.conf
|
rm -f /etc/telegraf/telegraf.d/*.conf
|
||||||
[ "$HAS_DOCKER" -eq 1 ] && { fetch telegraf/docker.conf /etc/telegraf/telegraf.d/docker.conf; usermod -aG docker telegraf 2>/dev/null || true; }
|
[ "$HAS_DOCKER" -eq 1 ] && { fetch telegraf/docker.conf /etc/telegraf/telegraf.d/docker.conf; usermod -aG docker telegraf 2>/dev/null || true; }
|
||||||
case "$ROLE" in
|
case "$ROLE" in
|
||||||
proxmox) [ -n "$PVE_TOKEN" ] || log "HINWEIS: --pve-token fehlt; VM/CT-Metriken bleiben aus. Token anlegen: pveum user token add telegraf@pve monitoring -privsep 1 && pveum acl modify / -token 'telegraf@pve!monitoring' -role PVEAuditor"
|
proxmox) : # pvesh-Weg braucht keinen Token (siehe unten)
|
||||||
fetch_conf telegraf/proxmox.conf /etc/telegraf/telegraf.d/proxmox.conf ;;
|
fetch scripts/proxmox-ve.sh /etc/telegraf/proxmox-ve.sh
|
||||||
|
chmod 0755 /etc/telegraf/proxmox-ve.sh
|
||||||
|
# pvesh-Weg: braucht keinen Token und keine ACL (laeuft als root)
|
||||||
|
cat > /etc/telegraf/telegraf.d/proxmox.conf <<'EOF'
|
||||||
|
[[inputs.exec]]
|
||||||
|
interval = "30s"
|
||||||
|
timeout = "25s"
|
||||||
|
data_format = "prometheus"
|
||||||
|
commands = ["/etc/telegraf/proxmox-ve.sh"]
|
||||||
|
EOF
|
||||||
|
log "Proxmox: pvesh-Input aktiv (VM/CT-Metriken, kein API-Token noetig)." ;;
|
||||||
apache) fetch_conf telegraf/apache.conf /etc/telegraf/telegraf.d/apache.conf; usermod -aG adm telegraf 2>/dev/null || true ;;
|
apache) fetch_conf telegraf/apache.conf /etc/telegraf/telegraf.d/apache.conf; usermod -aG adm telegraf 2>/dev/null || true ;;
|
||||||
docker|none) ;;
|
docker|none) ;;
|
||||||
*) die "Unbekannte Rolle: $ROLE" ;;
|
*) die "Unbekannte Rolle: $ROLE" ;;
|
||||||
|
|||||||
Executable
+63
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# proxmox-ve.sh — VM- und Container-Metriken direkt vom PVE-Host.
|
||||||
|
#
|
||||||
|
# Läuft als root auf dem PVE-Knoten und nutzt `pvesh` (lokale API mit vollen
|
||||||
|
# Rechten). Damit entfällt der API-Token komplett — kein Sys.Audit, keine ACL.
|
||||||
|
#
|
||||||
|
# Ausgabe im Prometheus-Format (data_format = "prometheus" in der Telegraf-Conf):
|
||||||
|
# proxmox_vm_cpu_usage{vmid="1001",name="tunnel",type="qemu",status="running"} 0.42
|
||||||
|
#
|
||||||
|
# Aufruf durch Telegraf (inputs.exec) oder manuell zum Testen.
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
command -v pvesh >/dev/null 2>&1 || { echo "# pvesh nicht gefunden — kein PVE-Host" >&2; exit 0; }
|
||||||
|
|
||||||
|
TMP="$(mktemp)"; trap 'rm -f "$TMP"' EXIT
|
||||||
|
pvesh get /cluster/resources --output-format json > "$TMP" 2>/dev/null || true
|
||||||
|
[ -s "$TMP" ] || exit 0
|
||||||
|
|
||||||
|
python3 - "$TMP" <<'PY'
|
||||||
|
import json, sys, re
|
||||||
|
|
||||||
|
def esc(s):
|
||||||
|
return str(s).replace('\\', '\\\\').replace('"', '\\"').replace('\n', ' ')
|
||||||
|
|
||||||
|
try:
|
||||||
|
data = json.load(open(sys.argv[1]))
|
||||||
|
except Exception as e:
|
||||||
|
print(f"# JSON-Fehler: {e}", file=sys.stderr); sys.exit(0)
|
||||||
|
|
||||||
|
rows = data.get("data", data) if isinstance(data, dict) else data
|
||||||
|
if not isinstance(rows, list):
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
def emit(name, labels, value):
|
||||||
|
if value is None: return
|
||||||
|
lab = ",".join(f'{k}="{esc(v)}"' for k, v in labels.items() if v is not None)
|
||||||
|
print(f"{name}{{{lab}}} {value}")
|
||||||
|
|
||||||
|
for r in rows:
|
||||||
|
typ = r.get("type")
|
||||||
|
if typ not in ("qemu", "lxc"): # node/storage überspringen
|
||||||
|
continue
|
||||||
|
if r.get("template"): # Templates nicht als Gast zählen
|
||||||
|
continue
|
||||||
|
if str(r.get("vmid", "")) == "": # nur Gäste mit vmid
|
||||||
|
continue
|
||||||
|
L = {"vmid": r.get("vmid"), "name": r.get("name"), "node": r.get("node"),
|
||||||
|
"type": typ, "status": r.get("status")}
|
||||||
|
# cpu ist ein Anteil 0..1 der zugewiesenen Kerne
|
||||||
|
cpu = r.get("cpu")
|
||||||
|
if cpu is not None:
|
||||||
|
emit("proxmox_vm_cpu_usage", L, round(float(cpu) * 100, 2))
|
||||||
|
emit("proxmox_vm_cpu_cores", L, r.get("maxcpu"))
|
||||||
|
emit("proxmox_vm_mem_bytes", L, r.get("mem"))
|
||||||
|
emit("proxmox_vm_mem_max_bytes", L, r.get("maxmem"))
|
||||||
|
emit("proxmox_vm_disk_bytes", L, r.get("disk"))
|
||||||
|
emit("proxmox_vm_disk_max_bytes", L, r.get("maxdisk"))
|
||||||
|
emit("proxmox_vm_net_in_bytes", L, r.get("netin"))
|
||||||
|
emit("proxmox_vm_net_out_bytes", L, r.get("netout"))
|
||||||
|
emit("proxmox_vm_uptime_seconds", L, r.get("uptime"))
|
||||||
|
emit("proxmox_vm_running", L, 1 if r.get("status") == "running" else 0)
|
||||||
|
PY
|
||||||
@@ -17,3 +17,18 @@
|
|||||||
response_timeout = "20s"
|
response_timeout = "20s"
|
||||||
# vmid und status als Tags: sonst sind VM-Metriken nicht pro Gast zuordenbar
|
# vmid und status als Tags: sonst sind VM-Metriken nicht pro Gast zuordenbar
|
||||||
additional_vmstats_tags = ["vmid", "status"]
|
additional_vmstats_tags = ["vmid", "status"]
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# EMPFOHLEN: Metriken direkt per pvesh (kein Token, keine ACL)
|
||||||
|
# Läuft als root auf dem PVE-Knoten. Der Installer aktiviert das automatisch
|
||||||
|
# mit --role proxmox, wenn pvesh vorhanden ist.
|
||||||
|
#
|
||||||
|
# Warum nicht inputs.proxmox? Das Plugin fragt zuerst /nodes/<node>/dns ab und
|
||||||
|
# braucht dort Sys.Audit. Schlägt das fehl, liefert es KOMPLETT nichts —
|
||||||
|
# ohne Logmeldung. Der pvesh-Weg umgeht die gesamte Rechte-Thematik.
|
||||||
|
# ============================================================
|
||||||
|
[[inputs.exec]]
|
||||||
|
interval = "30s"
|
||||||
|
timeout = "25s"
|
||||||
|
data_format = "prometheus"
|
||||||
|
commands = ["/etc/telegraf/proxmox-ve.sh"]
|
||||||
Reference in new issue
Block a user