Chefのrecipeを書いてみる その1 -とりあえずrecipeを書いてみる編-

Chefのcookbookを順を追って,説明しながら書いていこうと思います. 最初はナイーブにインストールすることを目標として,次にrecipeを分けてみたり,attributeを設定してみたりします. 今回はナイーブにインストールするところまで.

インストールするものは特になんでもいいんですが,丁度インストールしようとしていたので,flyway-cliのrecipeを書こうとおもいます. FlywayやEvolutions などのDB(Scheme)マイグレーションツールについては前回を参照.

cookbookを書いてみた

chefのrepositoryを準備する

まず,chefのcookbookやノードファイルを置くrepositoryを準備します.

git clone git://github.com/opscode/chef-repo.git
cd chef-repo
knife configure

cookbookを作成

早速,cookbookのひな形を作成します.本当は自作したcookbookはsite-cookbooksに入れるんだけど,今回はcookbooksで.

sudo knife cookbook create flyway-cli -o cookbooks
sudo knife cookbook create [cookbook名] -o [cookbookを配置するディレクトリ]

git で管理

必要であればgitでcookbookを管理しましょう.

git init
git add .
git commit -m 'First commit'

recipeを書く

先ほど作成したcookbookの中に移動します. とりあえず,recipes/default.rbflyway-cliをインストールするrecipeをナイーブに書いていきます. 今回はシェルスクリプトだけでできるのでexecuteを使います. このexecuteの部分に記述するものをresourceと呼びます.

基本的な流れは,次の通り.

  1. wgetでファイルのダウンロード
  2. tarで解凍
  3. lnシンボリックリンクを作成

  4. execute: sh -cでcommandを実行する

  5. command: ここに実行したいshllスクリプトを記述する
  6. <<-EOC: Rubyにおけるヒアドキュメント(キーワードはEOCじゃなくてもいい)
execute "flyway-cli" do
  command <<-EOC
     wget http://repo1.maven.org/maven2/com/googlecode/flyway/flyway-commandline/2.2.1/flyway-commandline-2.2.1.tar.gz -P /tmp
     tar xzfC /tmp/flyway-commandline-2.2.1.tar.gz /opt
     ln -s /opt/flyway-2.2.1 /opt/flyway
  EOC
end

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

solo.rbの作成

先ほど作成したchef-repoに戻ります.

chefでダウンロードしたファイルを置いておくfileキャッシュのディレクトリと,cookbookを配置しておくcookbooksディレクトリをsolo.rbに記述することが出来ます.

file_cache_path "/tmp/chef-solo"
cookbook_path [File.expand_path("./cookbooks", __FILE__)]

ノードファイル localhost.jsonの作成

chef-repoにlocalhost.jsonを作成します. ノードとはchefを実行してセットアップするコンピュータのことを指します.

このファイルはJSONで記述します.run_listのArrayにrecipeを追加していくことで,chef-soloを実行した時に走らせるrecipeを指定することが出来ます.

{
  "run_list" : [
    "recipe[flyway-cli]"
  ]
}

chef-soloの実行

chef-repoディレクトリでchef-soloを実行します.

sudo chef-solo -c solo.rb -j ./localhost.json

以下のコマンドを実行してUsageが表示されればひとまず完了です.

sudo /opt/flyway/flyway

続きはまた明日.

Chefのrecipeを書いてみる一覧

参考文献