LoginSignup
7
6

More than 5 years have passed since last update.

Chefレシピ内で任意のIPアドレスを付与する

Last updated at Posted at 2015-02-16

任意の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 %>
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6