Add Promtail log agent deployment alongside node_exporter

Installs Promtail (Grafana Loki agent) to ship host logs to the
central Loki instance at 10.10.10.69:3100. Scrapes syslog, auth,
kernel, daemon, pveproxy, pvedaemon, pve-tasks, ceph, and systemd
journal logs with per-host labeling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-14 12:00:07 -05:00
parent d5d6038a53
commit 8232ff497d

View File

@@ -22,14 +22,19 @@ fi
cleanup() { cleanup() {
echo "Cleaning up on error..." echo "Cleaning up on error..."
systemctl stop node_exporter 2>/dev/null || true systemctl stop node_exporter 2>/dev/null || true
systemctl stop promtail 2>/dev/null || true
systemctl stop hwmon.timer 2>/dev/null || true systemctl stop hwmon.timer 2>/dev/null || true
systemctl disable node_exporter 2>/dev/null || true systemctl disable node_exporter 2>/dev/null || true
systemctl disable promtail 2>/dev/null || true
systemctl disable hwmon.timer 2>/dev/null || true systemctl disable hwmon.timer 2>/dev/null || true
rm -f /etc/systemd/system/node_exporter.service rm -f /etc/systemd/system/node_exporter.service
rm -f /etc/systemd/system/promtail.service
rm -f /etc/systemd/system/hwmon.service rm -f /etc/systemd/system/hwmon.service
rm -f /etc/systemd/system/hwmon.timer rm -f /etc/systemd/system/hwmon.timer
rm -f /usr/local/bin/node_exporter rm -f /usr/local/bin/node_exporter
rm -f /usr/local/bin/promtail
rm -rf node_exporter-*.linux-amd64.tar.gz node_exporter-*.linux-amd64 rm -rf node_exporter-*.linux-amd64.tar.gz node_exporter-*.linux-amd64
rm -rf /etc/promtail /var/lib/promtail
userdel node_exporter 2>/dev/null || true userdel node_exporter 2>/dev/null || true
systemctl daemon-reload systemctl daemon-reload
echo "Cleanup completed." echo "Cleanup completed."
@@ -43,7 +48,7 @@ echo "Installing required packages..."
apt-get update apt-get update
# Common packages for all platforms # Common packages for all platforms
COMMON_PKGS="python3-pip smartmontools python3-psutil python3-requests lm-sensors fastfetch rsync jq sysstat" COMMON_PKGS="python3-pip smartmontools python3-psutil python3-requests lm-sensors fastfetch rsync jq sysstat unzip"
if [[ "$PLATFORM" == "pve" ]]; then if [[ "$PLATFORM" == "pve" ]]; then
echo "Installing PVE-specific packages..." echo "Installing PVE-specific packages..."
@@ -122,6 +127,153 @@ if ! systemctl is-active --quiet node_exporter; then
exit 1 exit 1
fi fi
# Install Promtail (Loki log agent)
echo "Installing Promtail log agent..."
PROMTAIL_VERSION="3.4.2"
LOKI_URL="http://10.10.10.69:3100"
echo "Downloading Promtail..."
if ! wget --timeout=30 --tries=3 "https://github.com/grafana/loki/releases/download/v${PROMTAIL_VERSION}/promtail-linux-amd64.zip" -O /tmp/promtail.zip; then
echo "ERROR: Failed to download Promtail"
exit 1
fi
if ! command -v unzip &>/dev/null; then
apt-get install -y unzip
fi
if ! unzip -o /tmp/promtail.zip -d /tmp/; then
echo "ERROR: Failed to extract Promtail"
exit 1
fi
mv /tmp/promtail-linux-amd64 /usr/local/bin/promtail
chmod +x /usr/local/bin/promtail
rm -f /tmp/promtail.zip
# Create Promtail directories
mkdir -p /etc/promtail /var/lib/promtail
# Get hostname for labeling
PROMTAIL_HOST=$(hostname)
# Create Promtail config
cat > /etc/promtail/config.yml << PROMTAILEOF
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/lib/promtail/positions.yaml
clients:
- url: ${LOKI_URL}/loki/api/v1/push
scrape_configs:
- job_name: syslog
static_configs:
- targets:
- localhost
labels:
job: syslog
host: ${PROMTAIL_HOST}
__path__: /var/log/syslog
- job_name: auth
static_configs:
- targets:
- localhost
labels:
job: auth
host: ${PROMTAIL_HOST}
__path__: /var/log/auth.log
- job_name: kern
static_configs:
- targets:
- localhost
labels:
job: kernel
host: ${PROMTAIL_HOST}
__path__: /var/log/kern.log
- job_name: daemon
static_configs:
- targets:
- localhost
labels:
job: daemon
host: ${PROMTAIL_HOST}
__path__: /var/log/daemon.log
- job_name: pveproxy
static_configs:
- targets:
- localhost
labels:
job: pveproxy
host: ${PROMTAIL_HOST}
__path__: /var/log/pveproxy/access.log
- job_name: pvedaemon
static_configs:
- targets:
- localhost
labels:
job: pvedaemon
host: ${PROMTAIL_HOST}
__path__: /var/log/pvedaemon.log
- job_name: pve-tasks
static_configs:
- targets:
- localhost
labels:
job: pve-tasks
host: ${PROMTAIL_HOST}
__path__: /var/log/pve/tasks/active
- job_name: ceph
static_configs:
- targets:
- localhost
labels:
job: ceph
host: ${PROMTAIL_HOST}
__path__: /var/log/ceph/*.log
- job_name: journal
journal:
max_age: 12h
labels:
job: journal
host: ${PROMTAIL_HOST}
relabel_configs:
- source_labels: ['__journal__systemd_unit']
target_label: 'unit'
- source_labels: ['__journal_priority_keyword']
target_label: 'priority'
PROMTAILEOF
# Create Promtail systemd service
cat > /etc/systemd/system/promtail.service << 'EOL'
[Unit]
Description=Promtail Log Agent
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOL
systemctl daemon-reload
systemctl enable promtail
systemctl start promtail
if ! systemctl is-active --quiet promtail; then
echo "WARNING: Promtail failed to start"
systemctl status promtail --no-pager || true
else
echo "✓ Promtail is running and shipping logs to Loki"
fi
# Install hwmon daemon # Install hwmon daemon
echo "Installing hwmon daemon..." echo "Installing hwmon daemon..."
@@ -263,6 +415,7 @@ fi
# Final verification # Final verification
echo "Verifying installation..." echo "Verifying installation..."
echo "Node Exporter status: $(systemctl is-active node_exporter)" echo "Node Exporter status: $(systemctl is-active node_exporter)"
echo "Promtail status: $(systemctl is-active promtail)"
echo "hwmon timer status: $(systemctl is-active hwmon.timer)" echo "hwmon timer status: $(systemctl is-active hwmon.timer)"
echo "Node Exporter port check:" echo "Node Exporter port check:"
if ss -tlnp | grep :9100; then if ss -tlnp | grep :9100; then
@@ -286,13 +439,16 @@ echo "Platform: ${PLATFORM^^}"
echo "" echo ""
echo "Services installed:" echo "Services installed:"
echo " - Node Exporter: http://$(hostname -I | awk '{print $1}'):9100/metrics" echo " - Node Exporter: http://$(hostname -I | awk '{print $1}'):9100/metrics"
echo " - Promtail: Shipping logs to Loki at ${LOKI_URL:-http://10.10.10.69:3100}"
echo " - hwmon daemon: Monitoring system health hourly" echo " - hwmon daemon: Monitoring system health hourly"
echo "" echo ""
echo "Configuration files:" echo "Configuration files:"
echo " - Promtail config: /etc/promtail/config.yml"
echo " - hwmon config: /etc/hwmonDaemon/.env" echo " - hwmon config: /etc/hwmonDaemon/.env"
echo "" echo ""
echo "Log locations:" echo "Log locations:"
echo " - Node Exporter: journalctl -u node_exporter" echo " - Node Exporter: journalctl -u node_exporter"
echo " - Promtail: journalctl -u promtail"
echo " - hwmon: journalctl -u hwmon.service" echo " - hwmon: journalctl -u hwmon.service"
echo " - hwmon logs: /var/log/hwmonDaemon/" echo " - hwmon logs: /var/log/hwmonDaemon/"
echo "" echo ""