/etc/hosts
を書かずにRabbitMQのクラスタを構築したい- ansibleを使ってクラスタ化まで実行したい
- RabbitMQの各ホストがConsulで名前解決できる状態にある
- 例えば
node01.node.consul
、node02.node.consul
として個別ホストにアクセスできる- サービスとしては
rabbitmq.service.consul
としてアクセスできる - dnsmasqを利用し、シームレスに名前解決できる
- サービスとしては
普通にRabbitMQを構成すると、RabbitMQノード名はホスト名を用いて
rabbit@node01
のように自動設定される。
非クラスタ環境ではこれで問題ないが、
この場合、クラスタを組む際には node01
が名前解決できなければならない。
具体的には
rabbitmqctl join_cluster rabbit@node01
のステップで node01
が名前解決できずに失敗する
とはいえ、
rabbitmqctl join_cluster rabbit@node01.node.consul
とすると、consul+dnsmasqにより node01.node.consul
は名前解決できるが、
対向側のRabbitMQが rabbit@node01
の名前で起動しているので
ノード名がマッチせず、ジョインに失敗する。
ここで node01
が名前解決できればよいことから、
/etc/hosts
に記述すれば解決する。
最低限、RabbitMQのマスタノードを記載すれば良い。
しかし、consulを用いてhostsファイルを使わずに構築した環境なので、 このためだけにhostsを書くのは避けたい。
次の方針で解決する。
- RabbitMQのデフォルトのノード名を用いない
- ノードのドメインは「長いもの」を使う
以上をRabbitMQの設定ファイル /etc/rabbitmq/rabbitmq-env.conf
に記載することで対処する。
具体的な設定項目は
NODENAME=rabbit@node01.node.consul
USE_LONGNAME=true
ノード名の変更はrabbitmq-server起動中に実行してはならない。
(ノード名不一致で rabbitmqctl
が実行できなくなる)
rabbitmqctl stop_app
systemctl stop rabbitmq-server
vi /etc/rabbitmq/rabbitmq-env.conf でノード名を変更する
systemctl start rabbitmq-server
の順で実行する。