[chef] Berkshelf使ってみた

とりあえず依存関係の解決にだけBerkshelf使ってみた。
自分で作ったcookbook(この例だと site-cookbooks/base)をどう管理するかがまだ整理できていない。完全にプロジェクト間で共用しているなら別gitレポジトリでもいいんだけど、プロジェクト個別のcookbookなんかは中に収めておきたい。

素直に、共有するcookbookはgitで取ってきてレポジトリには入れず、個別のは今まで通り knife cookbook create してレポジトリ内に直接突っ込むで良いのかな。

前提

system rubyでもrvmでもrbenvでもllenvでもいいので、rubyとbundlerが入ってる環境。

ゴール

  • apt-get updateする
  • 管理者ユーザを作成してsudoできるようにする

レポジトリ作成

knife solo init repo
cd repo

cat < .gitignore
/vendor/bundle/
/vendor/cookbooks/
/.bundle/
/bin/
EOF

git init
git add .
git commit -m 'initialized chef repository'

bundle init

cat < Gemfile
source 'https://rubygems.org'

gem 'knife-solo'
gem 'berkshelf'
EOF

bundle install --path vendor/bundle --binstubs
git add Gemfile Gemfile.lock
git commit -m 'installed knife-solo, berkshelf'

BerkshelfでCookbook取得


cat < Berksfile
site :opscode

cookbook 'apt'
cookbook 'users'
cookbook 'sudo'
EOF
bin/berks install --path vendor/cookbooks

git add Berksfile Berksfile.lock
git commit -m 'Import apt/users/sudo cookbooks'

cat < solo.rb
file_cache_path "/tmp/chef-solo"
data_bag_path "/tmp/chef-solo/data_bags"
encrypted_data_bag_secret "/tmp/chef-solo/data_bag_key"
cookbook_path [ "/tmp/chef-solo/site-cookbooks",
"/tmp/chef-solo/vendor/cookbooks" ]
role_path "/tmp/chef-solo/roles"
EOF

ノード追加


knife solo prepare vag

クックブック base 作成


bin/knife cookbook create base -o site-cookbooks

cat <> site-cookbooks/base/recipes/default.rb

include_recipe 'apt'
include_recipe 'users::sysadmins'
node.override['authorization']['sudo']['passwordless'] = true
include_recipe 'sudo'

EOF

cat <> site-cookbooks/base/metadata.rb
depends 'apt'
depends 'users'
depends 'sudo'
EOF

ロール web 作成


cat < roles/web.rb
name "web"
description "Web Server"
run_list(
"recipe[base]"
)
EOF

ノードにロール web を紐付け


cat < nodes/vag.json
{"run_list": ["role[web]"]}
EOF

管理者ユーザ miku をdata_bagsに追加


mkdir data_bags/users
cat < data_bags/users/miku.json
{
"id": "miku",
"uid": "10000",
"comment": "HATSUNE Miku",
"ssh_keys": [
"ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= miku@client.example.local",
"ssh-rsa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= miku@notepad.example.local"
],
"groups": [ "sysadmin" ],
"shell": "/usr/bin/zsh"
}
EOF

適用!


git add .
git commit -m 'Implemented base recipe'
knife solo cook vag