Chef/初心者向けChef入門講座/ohaiとattributeの自動判定


ohaiとattributeの自動判定

前回attributeを使った際、直接インターネットに出られないdbserverと出られるwebserverという2つのroleを作成しました。
しかし実際にはDBサーバーであってもインターネットに出られる物があったり、出られないWebサーバーがあったりして一概に区別できないということもあるでしょう。
こういったあまり仕様が統一されていないような環境で個別にroleを作っていくと、指数関数的にroleの数が増えたりして混乱のもとになります。

しかし今回のようにインターネットに出られる、出られないという判断であれば、大抵の場合IPアドレスを見れば判断できることが多いのではないでしょうか。
異なるデータセンターでは異なるntpサーバーを参照させたいといった場合にも使えそうです。
(普通は異なる拠点では異なるIPアドレス帯を使用していることがほとんどだと思いますので)

では早速ノードのIPアドレスで自動的に参照先を判断する方法を実際に書いてみたいところですが、その前にohaiというソフトウェアについて説明します。
ohaiはChefがサーバー環境の情報収集のために使うソフトウェアです。
収集できる情報はハードウェアからOS、ネットワークまで一通りの物が対象です。

実際どんな情報が取得できるのかはohaiコマンドで確認できます。
出力される情報はそこそこ多いのでmoreやlessにパイプした方が良いかもしれません。
$ ohai
フォーマットはJSON形式です。
"hostname"でホスト名、"ipaddress"でIPアドレスなどが取得できることを確認できます。

では実際にattributeに反映させる方法です。
attributeファイルに書く場合はこう書けます。
if node["ipaddress"] == "192.168.0.1" then
  default["test_cookbook"]["servers"] = ['192.168.0.100']
else
  default["test_cookbook"]["servers"] = ['ntp1.jst.mfeed.ad.jp', 'ntp2.jst.mfeed.ad.jp', 'ntp3.jst.mfeed.ad.jp']
end
普通にrubyのコードですね。
ohaiが取得したデータはnodeという連想配列から参照できます。

また、rubyのコードが書けるので正規表現を使うこともできます。
if /192\.168\.[0-9]+\.[0-9]+/.match( node["ipaddress"] ) then
  default["test_cookbook"]["servers"] = ['192.168.0.100']
else
  default["test_cookbook"]["servers"] = ['ntp1.jst.mfeed.ad.jp', 'ntp2.jst.mfeed.ad.jp', 'ntp3.jst.mfeed.ad.jp']
end
これで実行すればIPアドレスが192.168で始まる場合はローカルのntpサーバーを参照するようになります。
nodeやroleでattributeを記述している場合は消しておきましょう。

recipe側でもohaiの情報を扱うことができるので、attribute側は一旦このように。
default["test_cookbook"]["local_servers"] = ['192.168.0.100']
default["test_cookbook"]["global_servers"] = ['ntp1.jst.mfeed.ad.jp', 'ntp2.jst.mfeed.ad.jp', 'ntp3.jst.mfeed.ad.jp']

そしてrecipe側ではこのように指定すれば同じ結果が得られます。
template "/etc/ntp.conf" do
  source "etc/ntp.conf.erb"
  notifies :restart, "service[ntpd]"
  action :create
  if /192\.168\.[0-9]+\.[0-9]+/.match( node["ipaddress"] ) then
    variables({
      :ntp_servers => node["test_cookbook"]["local_servers"]
    })
  else
    variables({
      :ntp_servers => node["test_cookbook"]["global_servers"]
    })
  end
end

どちらのやり方も一長一短な感じですが、recipeで判断するやり方だとattributeの見通しは良くなりますが、recipeの書き換え頻度が上がりそうなのと、roleやnode側からattributeを上書きしにくくなるのが気になる所です。




  • 最終更新:2016-01-19 13:37:15

このWIKIを編集するにはパスワード入力が必要です

認証パスワード