任意のIPアドレスを付与する際困ったのでその時の対応メモ。
ohaiでホストのIPを取得しようとするとValueではなくKeyにIPがあるので普通の値取得ができなかった。
できるだけDSLだけでスマートに解決したかったが未熟であるがゆえ無理やりコードを挿入して対応した。
前提
- プロビジョン対象インスタンスは複数インターフェース・IPアドレスを持っている
- eth0 172.〜、eth1 192.〜、eth1:0 10.〜など使い分けている
- IPアドレスについてはohaiで取得できる値を使いたい
- template内のロジカルな記述は避け参照のみにしたい
問題
- node["ipaddress"]で取得できる値はnode["network"]["default_interface"]に対して設定されているアドレスのみである。
したがってnode["network"]["default_interface"]がeth0である場合172.〜以外はnode["ipaddress"]で取得できない。 - node["network"]["interfaces"]["eth1"]["addresses"]でインターフェース毎のIPを取得しようとするとアドレスはvalueではなくkeyに格納されているのでシンプルに参照できない。
ohaiのeth1出力例
"eth1": {
〜省略〜
"192.168.1.11": {
"family": "inet",
"prefixlen": "24",
"netmask": "255.255.255.0",
"broadcast": "192.168.1.255",
"scope": "Global"
},
〜省略〜
解決
- recipe内でohaiの値をhash.selectで取り出し、hash.keysで格納し直したものをtemplateで使用する
site-cookbooks/hoge/recipes/default.rb
template "/etc/hoge.conf" do
mode 0644
source "hoge.conf.erb"
ohai_val = Ohai::System.new
ohai_val.all_plugins
host_address_val = ohai_val["network"]["interfaces"]["eth1"]["addresses"].select { |address_key, address_val| address_val["family"] == "inet" }
host_address_array = host_address_val.keys
variables({
:eth1_address => host_address_array[0]
})
end
site-cookbooks/hoge/templates/default/hoge.conf.erb
CLIENT_IP=<%= @eth1_address %>