From 17accfdfe73d1e589105e6dcdab1bd5df900b2c3 Mon Sep 17 00:00:00 2001 From: godog <godog@autistici.org> Date: Sat, 9 Sep 2023 19:15:31 +0200 Subject: [PATCH] base: use freeipmi instead of ipmitool Field usage has shown freeipmi is more resilient than ipmitool in the face of misbehaving hardware. --- .../files/node-exporter-freeipmi.awk | 87 +++++++++++++++++++ .../files/node-exporter-scripts/freeipmi.sh | 3 + roles/float-base/tasks/ipmi.yml | 22 +++-- 3 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 roles/float-base/files/node-exporter-freeipmi.awk create mode 100644 roles/float-base/files/node-exporter-scripts/freeipmi.sh diff --git a/roles/float-base/files/node-exporter-freeipmi.awk b/roles/float-base/files/node-exporter-freeipmi.awk new file mode 100644 index 00000000..a35e3965 --- /dev/null +++ b/roles/float-base/files/node-exporter-freeipmi.awk @@ -0,0 +1,87 @@ +#!/bin/awk -f + +function export(values, name) { + if (values["metric_count"] < 1) { + return + } + delete values["metric_count"] + + printf("# HELP %s%s %s sensor reading from freeipmi\n", namespace, name, help[name]); + printf("# TYPE %s%s gauge\n", namespace, name); + for (sensor in values) { + printf("%s%s{sensor=\"%s\"} %f\n", namespace, name, sensor, values[sensor]); + } +} + +# Fields are Bar separated, with space padding. +BEGIN { + FS = "[ ]*[|][ ]*"; + namespace = "node_ipmi_"; + + # Friendly description of the type of sensor for HELP. + help["temperature_celsius"] = "Temperature"; + help["volts"] = "Voltage"; + help["amperes"] = "Current"; + help["power_watts"] = "Power"; + help["speed_rpm"] = "Fan"; + help["status"] = "Chassis status"; + + temperature_celsius["metric_count"] = 0; + volts["metric_count"] = 0; + amperes["metric_count"] = 0; + power_watts["metric_count"] = 0; + speed_rpm["metric_count"] = 0; + status["metric_count"] = 0; +} + +# Not a valid line. +{ + if (NF < 3) { + next + } +} + +# $4 is value field. +$4 ~ /N\/A/ { + next +} + +# $5 is units field. +$5 ~ /C/ { + temperature_celsius[$2] = $4; + temperature_celsius["metric_count"]++; +} + +$5 ~ /V/ { + volts[$2] = $4; + volts["metric_count"]++; +} + +$5 ~ /A/ { + amperes[$2] = $4; + amperes["metric_count"]++; +} + +$5 ~ /W/ { + power_watts[$2] = $4; + power_watts["metric_count"]++; +} + +$5 ~ /RPM/ { + speed_rpm[$2] = $4; + speed_rpm["metric_count"]++; +} + +$2 ~ /Chassis/ { + status[$2] = sprintf("%d", substr($4,3,2)); + status["metric_count"]++; +} + +END { + export(temperature_celsius, "temperature_celsius"); + export(volts, "volts"); + export(amperes, "amperes"); + export(power_watts, "power_watts"); + export(speed_rpm, "speed_rpm"); + export(status, "status"); +} diff --git a/roles/float-base/files/node-exporter-scripts/freeipmi.sh b/roles/float-base/files/node-exporter-scripts/freeipmi.sh new file mode 100644 index 00000000..2ad1f818 --- /dev/null +++ b/roles/float-base/files/node-exporter-scripts/freeipmi.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +ipmi-sensors | awk -f /usr/lib/float/node-exporter-freeipmi.awk diff --git a/roles/float-base/tasks/ipmi.yml b/roles/float-base/tasks/ipmi.yml index 6367e070..c530db24 100644 --- a/roles/float-base/tasks/ipmi.yml +++ b/roles/float-base/tasks/ipmi.yml @@ -1,15 +1,25 @@ --- -- name: Install ipmitool packages and dependency +- name: Install freeipmi packages and dependency apt: name: "{{ packages }}" state: present vars: packages: - - ipmitool - - gawk # prometheus-node-exporter-ipmitool-sensor dependency + - freeipmi-tools + - gawk # node-exporter-freeipmi.awk dependency -- name: Enable prometheus node-exporter ipmitool sensor +- name: Remove ipmitool, not used anymore + apt: + name: ipmitool + state: absent + +- name: Disable prometheus node-exporter ipmitool sensor systemd: name: prometheus-node-exporter-ipmitool-sensor.timer - state: started - enabled: yes + state: stopped + enabled: no + +- name: Install freeipmi node-exporter script + copy: + src: "node-exporter-freeipmi.awk" + dest: "/usr/lib/float/node-exporter-freeipmi.awk" -- GitLab