vagrantとberkshelfで超捗る、みたいな記事は一杯あるんですが、その先のちょっと弄りたいってなった時に一瞬悩む。
コミュニティcookbookのattributesとかカスタムしたい。
自分で作ったcookbookのレシピも追加したい。
で、色々調べてみたんですが、run_listで呼ぶよりも、そのプロヴィジョニングしたい環境の名前のcookbookを新しく作って、依存対象となるコミュニティcookbookをmetadataに書き、include_recipeする方が良いんじゃないかと思いました。
既に、BerksfileとVagrantfileがあるものとします。
vagrant plugin install vagrant-berkshelf
も完了済みと想定。
bundle exec berks cookbook ENV_NAME # ENV_NAMEは各自読み替え
でcookbookを作ります。
BerksfileとVagrantfileはこんな感じに。
site :opscode
cookbook 'ENV_NAME', path: 'ENV_NAME'
config.berkshelf.enabled = true
config.vm.provision :chef_solo do |chef|
chef.run_list = [
"recipe[ENV_NAME]",
]
end
で、ENV_NAME
のcookbookのmetadata.rbに依存するcookbookを書く。
場合によってはcookbookのバージョンも指定する。
name 'ENV_NAME'
maintainer 'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license 'All rights reserved'
description 'Installs/Configures createdb'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.1.0'
depends 'mysql'
depends 'database'
depends 'redisio'
depends 'imagemagick'
そして、ENV_NAME
のレシピを書く。
include_recipe 'mysql::server'
include_recipe 'redisio::install'
include_recipe 'redisio::enable'
include_recipe 'imagemagick::devel'
include_recipe 'database::mysql'
mysql_connection_info = {
host: 'localhost',
username: 'root',
password: node['mysql']['server_root_password'],
}
mysql_database 'development_db' do
connection mysql_connection_info
action :create
end
こんな感じ。
こうしておけば、コミュニティcookbookの値を使って、追加のレシピ作るのが楽になる。
この例だとattributesを書けば、ちゃんとmysql関連のパスワード設定も上書きできる。
実際、コミュニティcookbookを半端に使って中身を弄ると後からハイパー面倒になるので、
それはそのまま使って、必要な追加処理だけこうやって書くのが分かりやすいし管理もしやすいかなーと思いました。
そもそも、本当に本番環境のインフラとして使う場合は、コミュニティcookbookは余りお呼びでない事もあって、そういう場合は一部を除いてスクラッチで書いた方が良い気がします。
私のように開発者向けのテスト環境をVMでサクっと立てたい、という目的でとりあえずアプリが動く構成を作る場合には便利です。