Chef Howto with Vagrant + Berkshelf

>100 Views

April 26, 13

スライド概要

Chef Howto with Vagrant + Berkshelf

2013-04-26
Xtone Ltd. ピザ会
Aki / @nekoruri

profile-image

秋葉原生まれ大手町育ちの歌って踊れる江戸っ子インフラエンジニア。 0と1が紡ぐ「ゆるやかなつながり」に魅せられ早20年、 SNSとCGMの力で世界を幸福にするのがライフワーク。 市民、幸福は義務です。 あなたは幸福ですか?

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Chef Howto with Vagrant + Berkshelf 2013-04-26 Xtone Ltd. ピザ会 Aki / @nekoruri

2.

おさらい • Chef – 設定ファイルに書いたとおりにサーバ内を整備 – 新規環境でも既存環境でも結果は同じ – これで設定ファイルを差分管理できるね! • 原則 – もうサーバ上で直接作業をしない • パッケージの追加・更新 • 設定ファイルの変更

3.

今日のゴール • 誰でもChefで環境整備ができる – 新規の案件で、Capistrano走らせるところまで – Unicornは触らない(Capistranoから操作)

4.

Chefに欠かせない便利ツール • Vagrant – VirtualBox等を良い感じに操作してくれるツール – Chefを統合して操作できる – http://www.vagrantup.com/ からダウンロード • Berkshelf – BundlerのChef版 – Berksfileに書いたcookbookをGitHubから取得

5.

おおまかな流れ 1. 2. 3. 4. 5. 6. Chefレポジトリの新規構築 CookbookをBerkshelfで取得 共通の設定を記述 個別の設定を記述 Vagrantで作成したサーバに適用 本番サーバに適用

6.
[beta]
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を導入

7.
[beta]
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を追加

8.
[beta]
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(省略)= miku@client.example.local"
],
"groups": [ "sysadmin" ],
"shell": "/usr/bin/zsh"
}
EOF

base cookbookを作成
監視設定等を含む
社内共通のbaseを準備中

管理者ユーザ情報を追加

9.
[beta]
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(省略) = usera@a.example.jp",
"ssh-rsa AAAA(省略) = userb@b.example.jp"
],
"groups": [ "app" ],
"shell": "/usr/bin/zsh"
}
EOF

ウェブサイトの設定を
mysite cookbookとして作成

デプロイ用ユーザの情報を設定

10.
[beta]
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

11.
[beta]
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の設定を再適用

12.

6. 本番サーバに適用 • 前回紹介した手順と同じ % knife solo prepare root@192.0.2.100 % vi nodes/192.0.2.100.json % knife solo cook root@192.0.2.100