Prometheus Node Exporter is a lightweight agent that exposes dozens of hardware and operating-system metrics — CPU usage, memory pressure, disk I/O, network throughput, and more — via a plain HTTP endpoint that Prometheus can scrape. Installing it on every RHEL 8 host in your fleet gives you a uniform, low-overhead telemetry layer that feeds directly into Grafana dashboards. In this tutorial you will download and install Node Exporter, secure it under a dedicated system user, register it as a systemd service, open the required firewall port, and wire it up to an existing Prometheus instance. You will also import the community Node Exporter Full dashboard into Grafana so you immediately have a rich, pre-built view of your server metrics.

Prerequisites

  • A RHEL 8 server with a non-root user who has sudo privileges
  • Prometheus installed and running (any version ≥ 2.x) with its configuration file at /etc/prometheus/prometheus.yml
  • Grafana installed and running on port 3000
  • Port 9100 reachable between the Prometheus server and the target host
  • curl and tar available: dnf install -y curl tar

Step 1 — Download and Install the Node Exporter Binary

Download the latest stable Node Exporter release from the official Prometheus GitHub releases page, extract the archive, and copy the binary into /usr/local/bin.

NODE_EXPORTER_VERSION="1.8.0"
cd /tmp

curl -LO "https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz"

tar xzf "node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz"
sudo cp "node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64/node_exporter" /usr/local/bin/
sudo chmod +x /usr/local/bin/node_exporter

# Verify the binary works
node_exporter --version

Step 2 — Create a Dedicated System User

Running Node Exporter as root is unnecessary and inadvisable. Create a locked system account with no home directory or login shell to own the process.

sudo useradd 
  --system 
  --no-create-home 
  --shell /bin/false 
  node_exporter

# Confirm the account was created
id node_exporter

Step 3 — Create a systemd Service Unit

Write a systemd unit file that launches Node Exporter with the --collector.systemd and --collector.processes flags enabled. These optional collectors expose systemd unit states and per-process statistics respectively, which the Node Exporter Full Grafana dashboard can display.

sudo tee /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter 
    --collector.systemd 
    --collector.processes 
    --web.listen-address=0.0.0.0:9100
Restart=on-failure
RestartSec=5s
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter

Step 4 — Open Firewall Port 9100

Allow the Prometheus server to reach the Node Exporter metrics endpoint on port 9100. If Prometheus runs on the same host you can skip this step.

sudo firewall-cmd --permanent --add-port=9100/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

# Quick smoke test from the Prometheus host
curl -s http://$(hostname -I | awk '{print $1}'):9100/metrics | head -20

Step 5 — Add the Node Exporter to Prometheus Scrape Configuration

Edit the Prometheus configuration file to add a new scrape job targeting the Node Exporter endpoint, then reload Prometheus without restarting the service.

# On the Prometheus server — edit /etc/prometheus/prometheus.yml
sudo vi /etc/prometheus/prometheus.yml

# Add the following block under scrape_configs:
scrape_configs:
  # ... existing jobs ...

  - job_name: 'node_exporter'
    static_configs:
      - targets:
          - '192.168.1.10:9100'   # replace with your RHEL 8 host IP
          - '192.168.1.11:9100'   # add more hosts as needed
        labels:
          env: production

# Reload Prometheus configuration without restarting
sudo systemctl reload prometheus
# Or use the HTTP API if systemd reload is not configured:
# curl -X POST http://localhost:9090/-/reload

Step 6 — Verify Key Metrics and Import the Grafana Dashboard

Confirm that Prometheus is successfully scraping Node Exporter metrics by querying a few key time series directly in the Prometheus UI at http://<prometheus-ip>:9090. Then import the community Node Exporter Full dashboard (ID 1860) into Grafana.

# Key metrics to verify in the Prometheus expression browser:

# CPU time across all cores and modes
node_cpu_seconds_total{mode="idle"}

# Available memory in bytes
node_memory_MemAvailable_bytes

# Disk I/O time (useful for saturation analysis)
node_disk_io_time_seconds_total

# Free filesystem space in bytes
node_filesystem_avail_bytes{mountpoint="/"}

# ------------------------------------------------------------------
# Import the Node Exporter Full dashboard into Grafana:
# 1. Open Grafana → Dashboards → Import
# 2. Enter dashboard ID: 1860
# 3. Click Load
# 4. Select your Prometheus data source
# 5. Click Import
# ------------------------------------------------------------------

Conclusion

You have successfully deployed Prometheus Node Exporter on RHEL 8, secured it under a dedicated system account, hardened the systemd unit with privilege restrictions, and integrated it into your Prometheus scrape configuration. The Node Exporter Full Grafana dashboard now gives you an instant overview of CPU, memory, disk, network, and filesystem metrics for every host you add to the scrape targets list. This foundation makes it straightforward to build custom alert rules in Grafana or Prometheus itself when any metric crosses a critical threshold.

Next steps: How to Set Up Grafana Alerting and Notification Channels on RHEL 8, How to Set Up Loki and Promtail for Log Aggregation on RHEL 8, and How to Install InfluxDB and Telegraf on RHEL 8.