実現したいこと
ラズパイのnode-redにおいて、自分で設定した環境変数(自分のIPアドレス)を使用したいです。
試したこと
ラズパイのコマンドラインで、
$ MYIP=`hostname -I` $ export MYIP
と記入して、
$ env
で確認すると、環境変数にMYIPが追加されたことを確認しました。
しかし、ラズパイのnode-redにおいて、changeノードで$MYIPを出力すると、""と出力されてしまいます。
また、/etc/rc.local において、
$ MYIP=`hostname -I` $ export MYIP
を追記して再起動してみましたが、
$ env
で環境変数を確認すると、MYIPが登録されていませんでした。
大きな勘違いをしているかもしれません、ご指導お願いいたします。
20230206追記
/lib/systemd/system/nodered.service
内で、[Service]下に、
Environment=MYIP=XXX.XXX.XXX.XXX
と記入したところ、node-red内で$MYIP
を出力するとXXX.XXX.XXX.XXX
が出力できるようになりました。
しかし、ラズパイが複数台あるので、
Environment=MYIP=$(hostname -I)
のように指定したいのですが、こちらだとnode-red内で$MYIP
を出力すると$(hostname
が出力されてしまって困っています...
20230206追記2
node-redをサービスで起動しているので、それより早くenvironmentを更新できるように、
/etc/systemd/system/set-envvar.service
というファイルを作って、以下の文章を記入しました。
MYIPがすでにある場合は更新、ない場合は追加、みたいなつもりです。
[Unit] Description=Update or Add MYIP in /etc/environment Before=nodered.service [Service] ExecStartPre=/bin/sh -c "if grep -q MYIP /etc/environment; then sed -i 's/MYIP=.*/MYIP=$(hostname -I)/g' /etc/environment; else echo MYIP=$(hostname -I) >> /etc/environment; fi" [Install] WantedBy=multi-user.target
ところが再起動後に/etc/environment
を確認してもMYIP
が追加されていなかったので、systemctl list-units -all --type=service
で確認したところ、
set-envvar.service
のLOAD
がbad-setting
になっていました。
原因がよくわからずに困っています。
20230207 追記3
/etc/environment での環境変数の設定は今回は避けるべきという指摘をいただいたので、
追記2で作ったset-envvar.serviceファイルは破棄して、/lib/systemd/system/nodered.service
において以下のような追記をしました。
ExecStartPre=/bin/sh -c "sudo /bin/systemctl set-environment MYIP=$(/bin/hostname -I)"
しかし、node-redのUI上において、デバグノードで$MYIPを出力しても""が返ってきます。
また、mqtt outノードでは$MYIPをトピックとしたところ、"不正なトピックが設定されています"と表示されました。
20230308追記4
"~/.node-red
内のenvironmentと
いう名称のファイル"を使用できなかったため、ラズパイに入っていたnode および node-redのバージョンを上げました。(これはこれで手間取ってしまいました)
node : v10.21.0 --> v16.19.1
node-red : v1.0.6 --> v3.0.2
しかしながら、~/.node-red/environment
を作ってそこに環境変数を指定しても、node-red内では使用することができませんでした。やり方が間違っていたのかもしれませんが、今回は諦めてしまいました。
結局以下3点の変更を加えることで、node-red内で使える環境変数にIPアドレスを指定することができました。
皆さん、いろいろ教えてくださってありがとうございました。皆さんのアドバイスを組み合わせた感じになりましたが、今回は86ps様をベストアンサーにいたします。
①ノードレッドのサービス(/lib/systemd/system/nodered.service)に以下の環境変数を追加
[Service] Environment=MYIP=192.168.XXX.XXX
②ノードレッドサービス内の環境変数を変更する、以下のシェルスクリプト(/usr/local/bin/update_myip.sh)を追加して、chmod +x update_myip.sh
で実行可能に設定
#!/bin/bash new_ip=$(grep -A 3 'wlan0' /etc/dhcpcd.conf | grep ip_address | grep -o '192.168.[0-9]\+.[0-9]\+') if [ -z "$new_ip" ]; then echo "No IP address containing '192.168' is found." else if grep -q 'MYIP=' /lib/systemd/system/nodered.service; then sed -i "s/MYIP=.*/MYIP=$new_ip/" /lib/systemd/system/nodered.service echo "MYIP variable has been updated to $new_ip" else echo "some error occurred" fi fi
③update_myip.shを実行するサービスupdate-myip-in-nodered.serviceを追加(/etc/systemd/system/update-myip-in-nodered.service)
[Unit] Description=Update MYIP Before=nodered.service [Service] Type=oneshot ExecStart=sudo /bin/sh -c 'sudo /usr/local/bin/update_myip.sh' [Install] WantedBy=multi-user.target
回答3件
あなたの回答
tips
プレビュー