Node Exporter smartctl 文本插件

监控磁盘 SMART 数据,原理也是采用 Node Exporter的Textfile Collector扩展 ,并且 Prometheus社区提供了 node-exporter-textfile-collector-scripts 包含了 smartmon.shsmartmon.py 来输出符合Prometheus文本采集的数据

准备工作

备注

我最初实践时求快,没有仔细琢磨配合 Node Exporter 部署的文件权限,采用了简单粗暴的 chmod 777 方法设置目录 /var/lib/node_exporter/textfile_collector 属性(方便运行脚本后能够任意向目录写入数据)。由于 IPMI工具ipmitool存储设备S.M.A.R.T监控 都需要 root 权限,所以当时配置 crontab -e 使用的是 root 用户身份(原文未注明)。感谢网友 he-sb 指正( 《Node Exporter smartctl 文本插件》文中命令有误 #32 )

  • 创建一个 /var/lib/node_exporter/textfile_collector/ 用于存放 --collector.textfile.directory 对应的 *.prom 文件,以便转换成metrics:

准备 /var/lib/node_exporter/textfile_collector/ 目录
sudo mkdir -p /var/lib/node_exporter/textfile_collector

# 目录属主按照 node_exporter 运行进程的owner设置
# 这里设置按 systemd 配置 node_exporter.service 的User/Group 以便 node_exporter 进程能够读取目录下文件
sudo chown prometheus:promethus /var/lib/node_exporter/textfile_collector
下载 node-exporter-textfile-collector-scripts 到本地( /etc/prometheus )
git clone git@github.com:prometheus-community/node-exporter-textfile-collector-scripts.git
sudo mv node-exporter-textfile-collector-scripts /etc/prometheus/

执行脚本

  • 安装 sponge (以 Ubuntu Linux 为例,需要独立安装 moreutils 软件包以获得 sponge ) :

通过安装 moreutils 获得 sponge 工具
apt install moreutils
  • 社区脚本 smartmon.pysmartmon.sh 都可以用于输出,注意手工执行时需要使用 sudo root权限( 存储设备S.M.A.R.T监控 以及 IPMI工具ipmitool 之类的底层命令需要超级权限):

    sudo /etc/prometheus/node-exporter-textfile-collector-scripts/smartmon.sh | sponge /var/lib/node_exporter/textfile_collector/smartmon.prom
    

问题来了,我这里要在 crontab 中配置既能够切换到 root 身份执行 smartmon.sh ,又能够切换到 prometheus 身份执行 sponge ,该如何配置 Cron定时运行 呢?

答案是结合 Cron定时运行 的执行命令身份字段和 sudo (不能使用 su )。

先切换到 root 身份进行验证:

sudo su -
/etc/prometheus/node-exporter-textfile-collector-scripts/smartmon.sh | sudo -u prometheus sponge /var/lib/node_exporter/textfile_collector/smartmon.prom

然后检查采集到的数据:

ls -lh /var/lib/node_exporter/textfile_collector/

可以看到正确生成了metrics文本文件,并且属主是我们期望的 prometheus

-rw-rw-r-- 1 prometheus prometheus 124K Oct 10 15:10 smartmon.prom
  • 检查 /var/lib/node_exporter/textfile_collector/smartmon.prom 内容无误之后,在 /etc/cron.d 目录下添加配置文件 node_exporter_textfile_collector :

配置定时执行 node_exportertextfile Collectors
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * root ipmitool sensor | sudo -u prometheus /etc/prometheus/node-exporter-textfile-collector-scripts/ipmitool | sudo -u prometheus sponge /var/lib/node_exporter/textfile_collector/ipmitool.prom

* * * * * root /etc/prometheus/node-exporter-textfile-collector-scripts/smartmon.sh | sudo -u prometheus sponge /var/lib/node_exporter/textfile_collector/smartmon.prom

备注

注意,这里配置 Cron定时运行 的第6列标明了执行脚本的用户账号是 root ,这样就能运行 ipmitool 以及 smartmon.sh 中的 smartctl 。此时,为了能够将输出结果切换到 prometheus 身份写磁盘,在管道符号后面使用了 sudo -u prometheus ,这样最终写入磁盘目录 /var/lib/node_exporter/textfile_collector 就能够以特定用户身份完成,增加安全性。

补充一下,这里使用 sudo -u prometheus 而没有使用 su prometheus -c "命令" ,是因为 prometheus 用户账号配置了 /sbin/nologin 作为SHELL,以防止该用户账号被登陆。这种情况下, su 命令切换身份执行会报错:

This account is currently not available.

而使用 sudo -u prometheus 则没有问题

配置 node_exporter

备注

这部分准备工作我已经在 Node Exporter ipmitool 文本插件 完成

按照 Node ExporterSystemd进程管理器 运行服务配置,修订 /etc/systemd/system/node_exporter.service :

/etc/systemd/system/node_exporter.service 添加 textfile Collector 输出数据目录
ExecStart=/usr/local/bin/node_exporter \
    --collector.textfile.directory=/var/lib/node_exporter/textfile_collector

重启 node_exporter 服务

配置 Grafana Dashboard

Grafana通用可视分析平台import Grafana Dashboard 16514: SMART + NVMe status

改进版本(推荐)

../../../../_images/node_exporter_with_smartmon_text_plugin.png

其他

参考