chefではレシピを汎用的に書くためにattributeというものを作っておくといいそうな。
opscodeに上がっているレシピでよくみかけるnode[hoge][fuga]みたいなものです。
今回は早速覚えたattriburteの機能を使ってGitをソースコードからインストールするレシピを書いてみた。
Gitはバージョンアップのスピードが早いので、パッケージでインストールではちょっと古めのバージョンがインストールされる。
centOSに限っては問題多い1.7.1のバージョンが未だに入ってくる!!
このレシピはきっと大いに役に立つに違いない(とっくに他の誰かがもっと良いレシピを作って公開しているとは思うけど...)。
レシピ
レシピのディレクトリはcookbooks/git/
で作成したことにします。
まずは、gitのattributeを定義しておくためのファイルを作成しよう、cookbooks/git/attributes/default.rb
で作成する。
versionの他にconfigureオプションやGitのインストールに必要なpackageをデフォルト値として設定した。
default['git']['version'] = '1.8.4'
default['git']['source_uri'] = 'https://git-core.googlecode.com/files/git-1.8.4.tar.gz'
default['git']['configure'] = './configure'
default['git']['packages'] = %w{gettext gettext-devel zlib-devel openssl-devel libcurl-devel perl-ExtUtils-MakeMaker}
次に、Gitをインストールするレシピを書く。
レシピはcookbooks/git/recepies/default.rb
で作成する。
install_dir = '/usr/local/src'
version = node['git']['version']
source_uri = node['git']['source_uri']
configure = node['git']['configure']
node['git']['packages'].each do |package_name|
package "#{package_name}" do
:install
end
end
remote_file "/tmp/git-#{version}.tar.gz" do
not_if 'which git'
source "#{source_uri}"
end
bash 'install_git' do
not_if 'which git'
user 'root'
code <<-EOL
install -d #{install_dir}
tar xfz /tmp/git-#{version}.tar.gz -C #{install_dir}
cd #{install_dir}/git-#{version}
#{configure} && make && make install
EOL
end
実行するときに以下のようなjsonファイルを用意してchefコマンドから指定してあげればインストールバージョンが変更出来る。
{
"git": {
"version": "1.8.3.4",
"source_uri": "https://git-core.googlecode.com/files/git-1.8.3.4.tar.gz"
}
}
vagrantではjsonファイルを用意しないで、chef.json
というプロパティに連想配列で設定するみたい。
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = './cookbooks'
chef.add_recipe 'git'
# jsonファイル作る代わりにこう書く
chef.json = {
:git => {
:version => '1.8.3.4',
:source_uri => 'https://git-core.googlecode.com/files/git-1.8.3.4.tar.gz'
}
}
end
まとめ
かなりスッキリレシピが書けた。
以上