👮
ansible(FreeBSD) 研究 gather_fact 活用 その2
/etc/machine-id のこと。
- linuxあたりだと dbusで拾ったりする。
- 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