>100 Views
April 26, 13
スライド概要
Chef Howto with Vagrant + Berkshelf
2013-04-26
Xtone Ltd. ピザ会
Aki / @nekoruri
秋葉原生まれ大手町育ちの歌って踊れる江戸っ子インフラエンジニア。 0と1が紡ぐ「ゆるやかなつながり」に魅せられ早20年、 SNSとCGMの力で世界を幸福にするのがライフワーク。 市民、幸福は義務です。 あなたは幸福ですか?
Chef Howto with Vagrant + Berkshelf 2013-04-26 Xtone Ltd. ピザ会 Aki / @nekoruri
おさらい • Chef – 設定ファイルに書いたとおりにサーバ内を整備 – 新規環境でも既存環境でも結果は同じ – これで設定ファイルを差分管理できるね! • 原則 – もうサーバ上で直接作業をしない • パッケージの追加・更新 • 設定ファイルの変更
今日のゴール • 誰でもChefで環境整備ができる – 新規の案件で、Capistrano走らせるところまで – Unicornは触らない(Capistranoから操作)
Chefに欠かせない便利ツール • Vagrant – VirtualBox等を良い感じに操作してくれるツール – Chefを統合して操作できる – http://www.vagrantup.com/ からダウンロード • Berkshelf – BundlerのChef版 – Berksfileに書いたcookbookをGitHubから取得
おおまかな流れ 1. 2. 3. 4. 5. 6. Chefレポジトリの新規構築 CookbookをBerkshelfで取得 共通の設定を記述 個別の設定を記述 Vagrantで作成したサーバに適用 本番サーバに適用
1. Chefレポジトリの新規構築
% knife solo init myrepo
% cd myrepo
空のChefレポジトリを作成
% cat <<EOF > .gitignore
/vendor/bundle/
/vendor/cookbooks/
/.bundle/
/bin/
/.vagrant/
EOF
% git init
% git add .
% git commit -m 'initialized chef repository'
Gitレポジトリとして初期化
% bundle init
% cat <<EOF > 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'
chefとberkshelfを導入
2. CookbookをBerkshelfで取得
% cat <<EOF > Berksfile
site :opscode
cookbook 'apt'
cookbook 'chef-solo-search', git: 'git://github.com/edelight/chef-solo-search.git'
cookbook 'users'
cookbook 'sudo'
利用するcookbookを取得
cookbook 'nginx'
cookbook 'logrotate', git: 'git://github.com/drewrothstein/logrotate.git'
cookbook 'nginx_vhost', git: 'git://github.com/nekoruri/cookbook-nginx_vhost.git'
EOF
% bin/berks install --path vendor/cookbooks
% git add Berksfile Berksfile.lock
% git commit -m 'Import apt/users/sudo cookbooks'
% cat <<EOF > solo.rb
file_cache_path
data_bag_path
encrypted_data_bag_secret
cookbook_path
role_path
EOF
"/tmp/chef-solo"
"/tmp/chef-solo/data_bags"
"/tmp/chef-solo/data_bag_key"
[ "/tmp/chef-solo/site-cookbooks",
"/tmp/chef-solo/vendor/cookbooks" ]
"/tmp/chef-solo/roles"
chef-soloの設定ファイルに
vendor/cookbooksを追加
3. 共通の設定を記述
% bin/knife cookbook create base -o site-cookbooks
% cat <<EOF >> site-cookbooks/base/metadata.rb
depends
'apt'
depends
'users'
depends
'sudo'
EOF
% cat <<EOF >> site-cookbooks/base/recipes/default.rb
include_recipe 'apt'
include_recipe 'users::sysadmins'
node.override['authorization']['sudo']['passwordless'] = true
include_recipe 'sudo'
EOF
% mkdir data_bags/users
% cat <<EOF > data_bags/users/miku.json
{
"id": "miku",
"uid": "10000",
"comment": "HATSUNE Miku",
"ssh_keys": [
"ssh-rsa AAAA(省略)= [email protected]"
],
"groups": [ "sysadmin" ],
"shell": "/usr/bin/zsh"
}
EOF
base cookbookを作成
監視設定等を含む
社内共通のbaseを準備中
管理者ユーザ情報を追加
4. 個別の設定を記述
% bin/knife cookbook create mysite -o site-cookbooks
% cat <<EOF >> site-cookbooks/mysite/recipes/default.rb
users_manage 'app' do
group_id 10001
action :create
end
include_recipe 'nginx'
nginx_vhost 'static.example.jp'
nginx_vhost 'rails.example.jp' do
unicorn true
end
EOF
% cat <<EOF > data_bags/users/app.json
{
"id": "app",
"ssh_keys": [
"ssh-rsa AAAA(省略) = [email protected]",
"ssh-rsa AAAA(省略) = [email protected]"
],
"groups": [ "app" ],
"shell": "/usr/bin/zsh"
}
EOF
ウェブサイトの設定を
mysite cookbookとして作成
デプロイ用ユーザの情報を設定
4. 個別の設定を記述
% vim site-cookbooks/mysite/templates/default/static.example.jp.erb
% vim site-cookbooks/mysite/templates/default/rails.example.jp.erb
% cat <<EOF > roles/web.rb
name "web"
description "Web Server"
run_list(
"recipe[base]",
"recipe[mysite]"
)
EOF
% git add .
% git commit -m 'mysite configuration'
nginxの
設定ファイルを作成
baseとmysiteを呼ぶRoleを作成
ここまでの設定をcommit
5. Vagrantで作成したサーバに適用
% vagrant init precise32 http://files.vagrantup.com/precise32.box
サーバ準備
% vi Vagrantfile
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["vendor/cookbooks", "site-cookbooks"]
chef.roles_path = 'roles'
chef.data_bags_path = 'data_bags'
chef.add_role('web')
chef.json = {
"authorization" => {
"sudo" => {
"users" => [ "vagrant" ]
}
}
}
end
% git add Vagrantfile
Vagrantの設定
(Vagrant.configure block)
Role "Web"を適用
vagrantユーザにsudo許可
% git commit 'Initialized vagrant'
% vagrant up
% vagrant provision
サーバを起動してChefの設定を適用
サーバ起動後にChefの設定を再適用
6. 本番サーバに適用 • 前回紹介した手順と同じ % knife solo prepare [email protected] % vi nodes/192.0.2.100.json % knife solo cook [email protected]