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 0000000000000000000000000000000000000000..a35e396567cf94908bd91262efc5ae6c73956dec --- /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 0000000000000000000000000000000000000000..2ad1f818038b591957574682a0b710f379486e25 --- /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 6367e07081a93d6f982c3206db6c189fdea2282f..c530db246be87429ba45f52c50ca99af2219c5c8 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"