本家様 https://github.com/rackslab/Slurm-web
slurmのダッシュボード
REST APIを使ってデータ取得をするようで、slurmのパッケージ作成slurm/rpmbuildで「slurmrestd」が作れるようにする
っでインストール
[root@slurm ~]# rpm -qpli rpmbuild/RPMS/x86_64/slurm-slurmrestd-24.05.4-1.el9.x86_64.rpm
Name : slurm-slurmrestd
Version : 24.05.4
Release : 1.el9
Architecture: x86_64
Install Date: (not installed)
Group : System Environment/Base
Size : 583134
License : GPLv2+
Signature : (none)
Source RPM : slurm-24.05.4-1.el9.src.rpm
Build Date : Tue 05 Nov 2024 09:47:26 PM JST
Build Host : slurm.sybyl.local
URL : https://slurm.schedmd.com/
Summary : Slurm REST API translator
Description :
Provides a REST interface to Slurm.
/opt/slurm/sbin/slurmrestd
/usr/lib/.build-id
/usr/lib/.build-id/56
/usr/lib/.build-id/56/78a03143a32a8d110dd9bc1e0a5c3a94271352
/usr/lib/systemd/system/slurmrestd.service
[root@slurm ~]#
[root@slurm ~]# dnf localinstall rpmbuild/RPMS/x86_64/slurm-slurmrestd-24.05.4-1.el9.x86_64.rpm
slurmrestdを稼働させるアカウント(slurmrestd)を用意します。
slurm.confの「SlurmUser」で定義したユーザで稼働させてもいいのですが、その際は
その場合下記に示す「/usr/lib/systemd/system/slurmrestd.service」で「Environment=SLURMRESTD_SECURITY=disable_user_check」を追加する必要があるみたい.
ここではアカウント slurmrestd で行いたいと思います
[root@slurm ~]# groupadd -g 5001 slurmrestd ; useradd -M -d /var/lib/slurm -s /sbin/nologin -u 5001 -g slurmrestd slurmrestd
[root@slurm ~]# id slurmrestd
uid=5001(slurmrestd) gid=5001(slurmrestd) groups=5001(slurmrestd)
[root@slurm ~]#
slurmrestdへのリクエスト要求には2通りある. xinetdやsoket通信のようにその場その場でプロセスが動いて対処する方法と、特定のポートに耳を傾けるデーモンモード。
目的であるslurm-webは、soket通信でデータを取得できるので、それ向けに slurmrestd.service を作ります
slurm-webにはagentとgatewayのコンポーネントがある. それらは互いにJSON Web Token (JWT) で認証している. JWTでslurmrestdもJWTで構築と思うがそうでないみたい
あと、slurmctld,slurmdbdと同一のサイトで動かしてます. これが別のノードで動かすにはslurmrestdのJWT設定が必要なようです
「/usr/lib/systemd/system/slurmrestd.service」を下記のように用意します
[Unit]
Description=Slurm REST daemon
After=network-online.target remote-fs.target slurmctld.service
Wants=network-online.target
[Service]
Type=simple
User=slurmrestd
Group=slurmrestd
ExecStart=/opt/slurm/sbin/slurmrestd unix:/run/slurmrestd/slurmrestd.socket <-- debugモードにするなら末尾に「-vvv」を追加します
# Environment=SLURMRESTD_SECURITY=disable_user_check <-- slurm.confの「SlurmUser」と同じユーザが User/Group で指定しているならこれを有効にする
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
これを有効にして、soketフォルダを設定します
[root@slurm ~]# systemctl daemon-reload
[root@slurm ~]# echo "D /run/slurmrestd 0755 slurmrestd slurmrestd -" > /usr/lib/tmpfiles.d/slurmrestd.conf
[root@slurm ~]# /usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/slurmrestd.conf
[root@slurm ~]# systemctl enable slurmrestd --now
[root@slurm ~]# ls -l /run/slurmrestd/slurmrestd.socket
srwxrwxrwx. 1 slurmrestd slurmrestd 0 Nov 5 23:48 /run/slurmrestd/slurmrestd.socket
[root@slurm ~]#
soket通信なので lsof には値がでません。
っで通信テストです
(一般ユーザで)
[saber@slurm ~]$ /opt/slurm/sbin/slurmrestd -d list
Possible data_parser plugins:
data_parser/v0.0.39
data_parser/v0.0.40
data_parser/v0.0.41
[saber@slurm ~]$
と提供されるparserがわかるので、それを使ってテストです
[root@slurm ~]# curl --unix-socket /run/slurmrestd/slurmrestd.socket http://slurm/slurm/v0.0.39/diag
{
"meta": {
"plugin": {
"type": "openapi\/v0.0.39",
"name": "Slurm OpenAPI v0.0.39",
"data_parser": "v0.0.39"
},
:
:
[root@slurm ~]#
以上でsoket通信で接続テストができた.
もしslurmctldとは別のノードでslurmrestdを動かすなら JSON Web トークン (JWT) 認証方法 が必要となるみたい
まずはリポジトリの登録を行い
[root@slurm ~]# curl https://pkgs.rackslab.io/keyring.asc --output /etc/pki/rpm-gpg/RPM-GPG-KEY-Rackslab
[root@slurm ~]# vi /etc/yum.repos.d/rackslab.repo
[rackslab]
name=Rackslab
baseurl=https://pkgs.rackslab.io/rpm/el9/main/$basearch/
gpgcheck=1
enabled=0
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rackslab
[root@slurm ~]#
リポジトリの詳細は「dnf --enablerepo=rackslab repolist -v rackslab」で見れます. またそのリポジトリに備えられているパッケージは「dnf list available --disablerepo=* --enablerepo=rackslab」で見れます
次にパッケージをインストールします
[root@slurm ~]# dnf install epel-release -y
[root@slurm ~]# dnf --enablerepo=rackslab install slurm-web-agent slurm-web-gateway
っで設定. agentは slurmrestd と通信する役目を持ちます. なので slurmrestd の soket を指定します.
[root@slurm ~]# vi /etc/slurm-web/agent.ini
[service]
cluster=cryo-cluster
interface=localhost
port=5012
[slurmrestd]
socket=/run/slurmrestd/slurmrestd.socket <-- slurmrestdで用意したsoketを定義します
version=0.0.39
[root@slurm ~]#
また「/run/slurmrestd/slurmrestd.socket」はアカウント slurmrestd なのでagentもslurmrestdで動くようにします
[root@slurm ~]# vi /usr/lib/systemd/system/slurm-web-agent.service
[Unit]
Description=Slurm-web HPC dashboard agent
After=systemd-sysusers.service
[Service]
ExecStart=/usr/libexec/slurm-web/slurm-web-agent
Restart=on-failure
#User=slurm
User=slurmrestd <-- Userを slurmrestd に変更します
[Install]
WantedBy=multi-user.target
[root@slurm ~]#
次に gatewayはwebサービス ダッシュボード そのもの. なので agent と通信するための設定が必要.
[root@slurm ~]# vi /etc/slurm-web/gateway.ini
[agents]
url=http://localhost:5012
[service]
interface=0.0.0.0 <--- このホスト以外からの要求に答えるために「0.0.0.0」と定義します
[ui]
host=http://slurm:5011
[root@slurm ~]#
そしてagentとgatewayの通信には共通鍵っぽいものが必要でそれを作ります
[root@slurm ~]# /usr/libexec/slurm-web/slurm-web-gen-jwt-key
INFO :: Running slurm-web-gen-jwt-key
INFO :: Generating JWT private key file /var/lib/slurm-web/jwt.key
INFO :: Setting read permission on key for slurm-web user
INFO :: Setting read permission on key for slurm user
[root@slurm ~]#
ただしこの「/var/lib/slurm-web/jwt.key」は wslurm-web と slurm しか読めない仕様なのでagentの稼働ユーザ slurmrestd を加えます
[root@slurm ~]# ls -l /var/lib/slurm-web/jwt.key
-r--r-----+ 1 root root 64 Nov 3 23:56 /var/lib/slurm-web/jwt.key
[root@slurm ~]# cd /
[root@slurm /]# getfacl ./var/lib/slurm-web/jwt.key
# file: var/lib/slurm-web/jwt.key
# owner: root
# group: root
user::r--
user:slurm-web:r--
user:slurm:r--
group::---
mask::r--
other::---
[root@slurm /]#
(jwt.keyに user:slurmrestd を加える)
[root@slurm /]# setfacl -m user:slurmrestd:r ./var/lib/slurm-web/jwt.key
[root@slurm /]# getfacl ./var/lib/slurm-web/jwt.key
# file: var/lib/slurm-web/jwt.key
# owner: root
# group: root
user::r--
user:slurm-web:r--
user:slurm:r--
user:slurmrestd:r--
group::---
mask::r--
other::---
[root@slurm /]#
これでslurm-webの仕組みは完了ですが、次に RacksDBを用意します. こちらは単に場所(住所)とサーバ室とラックの位置関係を示すものですが、、、定義が大変...
本家様 https://github.com/rackslab/RacksDB
[root@slurm ~]# dnf --enablerepo=rackslab install racksdb
[root@slurm ~]# cp -r /usr/share/doc/python3-racksdb/examples/db/* /var/lib/racksdb/
[root@slurm ~]# ls -l /var/lib/racksdb/
total 0
drwxr-xr-x. 2 root root 41 Nov 3 23:58 datacenters
drwxr-xr-x. 2 root root 65 Nov 3 23:58 infrastructures
drwxr-xr-x. 6 root root 78 Nov 3 23:58 types
[root@slurm ~]#
本来ならここで「/var/lib/racksdb」にあるデータを修正して自分の環境に合わせます. っがすっごい面倒...
なので RacksDB の修正は後回しにslurm-webを起動してみます
[root@slurm ~]# systemctl enable --now slurm-web-agent.service
[root@slurm ~]# systemctl enable --now slurm-web-gateway.service
[root@slurm ~]# lsof -i -P
:
slurm-web 265981 slurmrestd 3u IPv4 247884 0t0 TCP localhost:5012 (LISTEN)
slurm-web 265569 slurm-web 3u IPv4 241239 0t0 TCP *:5011 (LISTEN)
:
[root@slurm ~]#
確認は 5012 にアクセスしてみます。
正直,, qload や squeue で足りそう..