DHCP Option 224でPXE boot後のrole情報を渡す

DHCP Option 224でPXE boot後のrole情報を渡す

目的

PXE boot では、firmware、initramfs、rootfs 上の network manager がそれぞれ DHCP を使うことがある。

このうち、OS 起動後の automation に必要な metadata を DHCP Option 224 で渡すと、同じ rootfs から起動する client でも role や stage を切り替えやすい。

ここでは Option 224 を overlay_id / role / roles / stage のような runtime config 伝播に使う設計をまとめる。

使い方

Option 224 の値は、単純な key-value 文字列にする。

overlay_id=pi-node-1,role=base,roles=base,worker,stage=staging

client 側では DHCP hook がこの値を受け取り、runtime env file を作る。

/run/dhcp/role.env

systemd unit や wrapper はこの env file を読み、対象 role でなければ skip する。

dhcpcd.conf例

define 224 string option224
require option224
option option224
  • define 224 string option224: Option 224 を string 型として扱う。
  • require option224: Option 224 が無い lease を不正扱いにする。
  • option option224: Parameter Request List に 224 を追加する。

dnsmasq側の考え方

router 側では host ごとに Option 224 を付与する。

dhcp-option=tag:pi-node-1,224,"overlay_id=pi-node-1,role=base,roles=base,worker,stage=staging"

ただし、Ansible inventory に raw option 文字列を直接書くと、quote や YAML indentation の事故が起きやすい。通常は hostvars の roles / stage / hostname から option 文字列を生成する方がよい。

DHCPのフェーズを分けて見る

Raspberry Pi の network boot では、少なくとも次を分けて見る。

firmware DHCP
  -> TFTP server / boot file selection

initramfs DHCP
  -> NFS root mount

rootfs DHCP
  -> OS runtime config / Option 224 hook

「TFTP は取れているが /run/dhcp/role.env が無い」場合、firmware DHCP ではなく rootfs 上の DHCP client / hook を見る。

role dispatch

boot 後の unit は、受け取った role list を見て実行可否を決める。

. /run/dhcp/role.env

case ",${ROLES}," in
  *,worker,*) exec /usr/local/sbin/run-worker ;;
  *) exit 0 ;;
esac

複数 role を同じ boot 内で走らせる場合、package manager や service restart が競合しないように flock などで直列化する。

Debug

router 側:

logread -f | grep -i dnsmasq
grep -nE '224|dhcp-host|dhcp-option' /tmp/dnsmasq.conf
dnsmasq --test -C /tmp/dnsmasq.conf

client 側:

cat /run/dhcp/role.env
journalctl -u dhcpcd -b --no-pager
journalctl -u pxe-write-role.service -b --no-pager
systemctl list-units 'ansible-pull@*' --no-pager

packet level で見る場合:

tcpdump -ni eth0 -vvv 'port 67 or port 68'

注意点

  • Option 224 は root overlay の upper/work 選択に使わない。root overlay は initramfs 側の責務にする。
  • Option 224 は rootfs 起動後の role dispatch、log directory、補助 mount、stage 情報などに使う。
  • raw option を手書きする場合は、必ず list field として書く。YAML の構造が崩れると DHCP host name や tag に option 文字列が混入する。
  • Option 値が hex encoding されて届く実装もある。client hook は decode の回数を固定し、二重 decode しない。