👮

ansible(FreeBSD) 研究 gather_fact 活用 その2

2025/01/23に公開

/etc/machine-id のこと。

  • linuxあたりだと dbusで拾ったりする。

https://learning.lpi.org/ja/learning-materials/101-500/102/102.6/102.6_01/
https://manimani.cc/blog/2022/20221125213006_machine-id-dbus-systemd-snmpd

  • FreeBSDでは、最近(この数年のことを指す) 13.2RELあたりで対応したから、常識ではない模様。

FreeBSD jail での /etc/machine-id について

  • 物理マシンじゃないから「そんなモノない」とか言われると困る。
  • 仮想環境でも識別するための工夫がしたい。

結論: uuidgen で でっち上げよう。

  • /etc/rc.d/hostid /etc/rc.d/hostid_save を使っても、sysctl で参照する.
  • 現状の実装では jail が 乗っかってる物理サーバに依存している jail 上でユニークになるはずがない。意味がない。
  • じゃあ、物理サーバの /etc/machine-id(/etc/host-id: 内容はハイフンがないだけで同じもの)に jailのIDを数字として足せば良いのでは?? 良くないけど。
  • で、jail の ID を jailの中で普通に拾えるのかと思ったら、実はそんな実装になってない(なってるべきと思ったらそうでないので愕然とする)
  • 取り敢えずユニークネスであることが求められているのだから、 uuidgen で作ってしまえ(開き直り)
# uuidgen | sed s/-//g > /etc/machine-id

ansible でぶち込んで終了。

  • インベントリに jail (sshjailの識別方法 は jail@host.domなので、 "@" で grep) だけ集めてグループ化 ([jails]とでもしとく)
  • jails グループに対して
$ ansible -m raw -a "uuidgen | sed s/-//g > /etc/machine-id  " jails

などとしておこう。

不可逆だけど一回しかやらない(jail作り直しでも付番したほうが良いかも)

ansible-cmdb で確認する。

$ ansible -m setup -o --tree ./all jails 2>/dev/null >hosts.sql

とかやってからの、

$ psql ansible_db < hosts.sql
INSERT 0 1
INSERT 0 1
....

なんて感じで、エラーが出なきゃあ取り敢えずぶつかってない..

実際には

  • FreeBSD 10,11,12 とか古いOSの機材でトラブった
  • VNET-jail で ssh 直接アクセスできる場合と、sshjail を 通した場合で同一ならID一つになるため、重複検知。
ERROR:  duplicate key value violates unique constraint "hosts_id_key"
DETAIL:  Key (id)=(175972964319969035692232675947062534033) already exists.

以下どうでもいいこと。

  • dynamic-inventory を使って、hosts手書きはやめたい。
  • jail作るたびに /etc/machine-id を作る処理をどこかに書いたほうが良さげ。

Discussion