Chefのrecipeを書いてみる その2 -recipeからインストールするversionを指定してみる編-

前回書いた,Chefのrecipeを書いてみる その1 -とりあえずrecipeを書いてみる編-に引き続きchefのrecipeを順を追って書いていきます.今日は,versionを指定できるように改造しようと思います.

versionを指定できるようにしてみる

recipeをみてみると,いろいろ抽象化出来るところがありそうです. version,インストールするディレクトリなどなど. とりあえず,バージョンを指定できるようにしてみましょう.

前回はflyway-cliをインストールするためのrecipeを書きました. DL先を見るとちょっと面倒臭い事になりそうです.. 1.1から2.1.1まではtar.gzのファイル名が{version}-distというsuffixが付き, 2.2からは「-dist」は付きません.. そこら辺を考慮して書いていこうとしましたが,バージョンの判定をして2.2より小さかったら対応してないエラーを出す(色々と名前や,ディレクトリが異なるので今回は排除)という方向で行こうと思います.必要になったら書けばいいのです.

インストールディレクトリと,バージョンの指定

とりあえずファイルの中に変数としてインストールディレクトリと,インストールしたいバージョンを変数に代入しておきます.

install_dir = "/opt/flyway"
version = "2.2.1"

サポートバージョンの設定

バージョンの判定2.2より小さいものはサポートしないということで,対応しないものはエラーを出力して終了するように記述します.Ruby的にこの書き方が合ってるのかはわからないけど,REPLで試したら概ね動いたので,とりあえずいいかな?

if version < "2.2" then
  Chef::Log::error "#{cookbook_name} is supported versions in more than 2.2."
  exit 1
end

インストール先のディレクトリの作成

複数バージョンを持っておくためにversionディレクトリを作成します(そもそも,複数バージョンを保管する需要があるかどうかは要検討).

directory "#{install_dir}/versions" do
  owner     "root"
  group     "wheel"
  action    :create
  recursive true
end

flyway-cliをダウンロードして,展開,シンボリックリンクを貼る(インストール)

すでにシンボリックリンクが存在した場合コケるので,-nfを追記します. バージョンはとりあえず,シンボリックリンクの切り替えで対応することにします.

execute "flyway-cli" do
  command <<-EOH
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/#{version}/flyway-commandline-#{version}.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-#{version}.tar.gz #{install_dir}/versions
     ln -nfs #{install_dir}/versions/flyway-#{version} #{install_dir}/flyway
  EOH
end

MySqlを使う場合に必要なconnectorをインストール

MySqlを使う場合にはconnectorが必要なので,これもついでにインストールします.

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 /opt/flyway/flyway/jars
  EOH
end

まとめ

versionを指定するときはrecipeの頭に書いてあるバージョンを書き換えることで,指定したものをインストールすることが出来ます.nodeファイルなど,recipeの外側から指定する方法は追って書こうと思います.

Chefのrecipeを書いてみる一覧

参考文献