Chefのrecipeを書いてみる その5 -変数をAttribute化してみる編-

前回書いた,Chefのrecipeを書いてみる その4 -インストール済みの場合は実行しないようにしてみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,バージョンやインストールするディレクトリをnodeファイルから指定できるようにしてみようと思います.

変数をAttribute化

現在,varsioninstall_dirはrecipeに直接書いていますが, 毎回バージョンを指定するたび,recipeを書き換えるのはcoolじゃあありません. Chefにはattributeというモノがあり,nodeファイルにattributeを書くことで,recipeにその内容が反映される仕組みになっています. 例とともにattributeをつかってみます.

まずはdefalt値から

cookbooks/flyway-cliの下にattributesというディレクトリがあります. ここにdefalt.rbを作成し,記述するとdefaultの引数を与えることができます.

flyway-cli/attributes/default.rb

default['flyway-cli'][:version] = "2.2.1"
default['flyway-cli'][:install_dir] = "/opt/flyway"

ここで,:cookbook_nameを使うとCookBook名を取得でます.

flyway-cli/recipes/default.rb

recipeの方はただ置き換えるだけです(-は削除したところ,+は追加したところ).

-install_dir = "/opt/flyway"
-version = "2.2.1"
+install_dir = node['flyway-cli']['install_dir']
+version = node['flyway-cli']['version']

flyway-cli/recipes/mysql-connector.rb

こっちは変数も使ってなかったので,追加します.

install_dir ="#{node['flyway-cli']['install_dir']}/flyway/jars"
execute "mysql-connector" do
  command <<-EOH
     wget http://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.26.tar.gz -P /tmp
     tar xzfC /tmp/mysql-connector-java-5.1.26.tar.gz #{install_dir}
     ln -nfs #{install_dir}/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar #{install_dir}/mysql-connector-java-5.1.26-bin.jar
  EOH
  not_if { File.exists?("#{install_dir}/mysql-connector-java-5.1.26") }
end

chef-repo/loaclhost.json

nodeファイルにattributeを追加すると,defaultの値が上書きされて,指定した場所,バーションでインストールできるようになります.

{
  "flyway-cli": {
    "version": "2.2",
    "install_dir": "/tmp/test-flyway"
  },

  "run_list" : [
    "recipe[flyway-cli]",
    "recipe[flyway-cli::mysql-connector]"
  ]
}

まとめ

これで,nodeファイルからバージョンやインストール先を指定できるようになりました.

今回使ったソースはこちらにおいておきます.

その1からその5で,chefの基本的なrecipeの書き方は終わりです. 気が向いたらMac用のrecipeや,その書き方も紹介しようかと思います.

Chefのrecipeを書いてみる一覧

参考文献