chefで任意のネットワークインタフェイスのアドレスを取得する
設定ファイル中で、eth0じゃなくて、eth2のアドレスを指定しているところがあります。
eht0なら
node[:ipaddress]
でchef中のレシピでもテンプレートでも値が入ってきますが、eht1とかeth2だとどうするんだろ。
nodes/hostname.jsonに書いちゃえばいいんでしょうが、ohaiに情報があるはずなのでそれはやりたくない。
ohaiを叩いてみると、欲しい情報はこんなふうになっています。
"network": { "interfaces": { "lo": { "mtu": "65536", "flags": [ "LOOPBACK", "UP", "LOWER_UP" ], (中略) "eth2": { "type": "eth", "number": "2", "mtu": "1500", "flags": [ "BROADCAST", "MULTICAST", "UP", "LOWER_UP" ], "encapsulation": "Ethernet", "addresses": { "00:50:56:85:60:8A": { "family": "lladdr" }, "172.16.1.2": { "family": "inet", "prefixlen": "24", "netmask": "255.255.255.0", "broadcast": "172.16.1.255", "scope": "Global" }, "fe80::250:56ff:fe85:608a": { "family": "inet6", "prefixlen": "64", "scope": "Link" } (以下略)
ということは
node['network']['interface']['eth2']['addresses']
の中のデータとして入っています。
ハッシュ値の値としては2つで、familyがinetとinet6。ということはselectでfamilyの値を指定すればいい。
node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}
これで以下のハッシュ値が入手できます。
"172.16.31.58": { "family": "inet", "prefixlen": "24", "netmask": "255.255.255.0", "broadcast": "172.16.31.255", "scope": "Global" }
あとはこのハッシュ値のキーを出力すればOK。
node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}.keys[0]
テンプレートに書く場合はこんな感じ。
ListenIP=<%=node['network']['interfaces']['eth2']['addresses'].select { |address,data| data['family'] == 'inet'}.keys[0]%>
仮想アドレスかなんかで複数アドレスが割り振られているときは、[0]の数字を変えればいいと思う。