「プログラミング Erlang 10.1 名前サーバ」のステージ3
ステージ1,2はうまくいったという状況から。まずサーバー側で `$erl -name gandalf -setcookie abc` を実行しようとすると以下のようなエラーが出た。
$ erl -name gandalf -setcookie abc
2020-05-31 04:11:14.711061
args: []
format: "Can't set long node name!\nPlease check your configuration\n"
label: ...(略)
これは、サーバーの名前がドメインを含むものでなかったのでエラーが出ている。今回はサーバーの名前を `localserver.com` と付けることにする。hogehoge.fuga の形になっていればなんでも良い。もし自分で別な名前にする場合はこれ以降に出てくる`localserver.com`は全て置きかえる必要がある。
まずはサーバー側で`sudo hostname localserver.com`というコマンドを実行する。
$ sudo hostname localserver.com
その後、そのサーバーのローカルIPを調べて、今度はクライアント側の/etc/hostsに`#{調べたIP} localserver.com`という行を追加しておく。具体例として、サーバーのローカルIPが192.168.0.4の場合、クライアント側の/etc/hostsに追加する行は `192.168.0.4 localserver.com`となる。
❯ cat /etc/hosts
127.0.0.1 localhost
192.168.11.8 localserver.com # 追加
... # 省略
上記の設定をした状態でサーバー側で`erl -name gandalf -setcookie abc`を実行すると、erlプロンプトの表示は`(gandalf@localserver.dom)1>`となっている。その状態で`kvs:start().`でサーバー側の準備は完了。
$ erl -name gandalf -setcookie abc
Erlang/OTP 23 [erts-11.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]
Eshell V11.0.2 (abort with ^G)
(gandalf@localserver.com)1> kvs:start().
true
次に、クライアント側で`erl -name bilbo -setcookie abc`でErlangノードを立ち上げると、以下のように実行できるはず。
(bilbo@MBP.local)2> rpc:call('gandalf@localserver.com', kvs, store, [weather, cold]).
true
(bilbo@MBP.local)3> rpc:call('gandalf@localserver.com', kvs, lookup, [weather]).
{ok,cold}
この時の注意点として、'gandalf@loclalserver.com' というようにサーバーの名前を「''」で囲む必要がある。本のサンプルではなぜか実行できているが、「''」が無いと`* 1: syntax error before: '.'`という構文エラーが出る。
もしこれでうまく行かなかった場合は、サーバーとクライアント側のバージョンが合っていない可能性がある。自分の場合も、クライアント側が v11.0 だったのに対して Ubuntuサーバーで適当にaptを使って入れたErlangのバージョンがv9.2と古かった。以下を参考に最新のものをインストールしたところv11.0.2になった。この状態で上のkvsのサンプルは問題無く動作したので、マイナーバージョンの違い(0.0.2の違い)はErlang間の通信では問題にはならなかった。
この記事が気に入ったらサポートをしてみませんか?