[Mac]『入門Chef Solo』を読んで試してみた
伊藤直也さんの『 入門Chef Solo』を読んで、実際にVagrantを使って試してみた。
所々でつまづいた部分があったのでメモを残しておく。
「まずはちゃんとしたやり方を教えます、その後、もっと手軽な方法を教えます」という流れで進んで行くので非常に読みやすかった。
「これなら自分にも手軽にできる」と思わせてくれる内容だったので本当にオススメ。
「コードしてのインフラ(Infrastructure as Code)」を管理していく時代がやってきた。
第1章から第3章までをさらっと読み進めて、第4章のVagrant環境の用意から始めた。
実験環境
MacOS X 10.7.5 仮想マシン(Vagrant):CentOS 6.3
Vagrantインストール
Chef Soloの試験環境を作るためにVagrantを使う。
- gemでインストール
gem install vagrant
- OSイメージを追加
vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box
- 適当なディレクトリを追加
mkdir ~/vagrant
- Vagrantの初期化
cd ~/vagrant
vagrant init
- Vagrantfileの編集
config.vm.box = "centos"
config.vm.network :hostonly, "192.168.50.12"
config.ssh.timeout = 60
NOTE
自分の環境ではVagrantfileの編集時に、 config.vm.boot\_mode = :gui
を有効にしておかないと、vagrant up時に、 Waiting for VM to boot. This can take a few minutes
から進めない現象が発生した。
参考URL: vagrant up
hangs at "Waiting for VM to boot. This can take a few minutes"
2013/4/20 追記
別のmacで試したところ、guiをonにしても同様の現象が発生したため再調査
sshのタイムアウト設定を追記することで動くようになった
config.ssh.timeout = 60
タイムアウト設定をしておけばguiをonにしておかなくても大丈夫だったのでコメントアウトしておく
参考URL: Vagrantが'Waiting for VM to Boot. This Can Take a Few Minutes.'でずっと止まる場合
- Vargant起動
vagrant up
- sshでアクセス
vagrant ssh
- ssh設定を追記しておく
# vagrant ssh-config --host {host名}
vagrant ssh-config --host vagrant >> ~/.ssh/config
こうしておけば以下のコマンドでアクセス可能に
ssh vagrant
MEMO
- 仮想サーバの一時停止: vagrant halt
- 仮想サーバの破壊: vagrant destroy
saharaのインストール
手軽に作って壊して遊べるようにsaharaプラグインを追加する。
- gemでインストール
vagrant gem install sahara
MEMO
- sandboxモードを有効に: vagrant sandbox on
- sandbox onにしたところまでOSの状態を戻す: vagrant sandbox rollback
- OSの状態変更を確定: vagrant sandbox commit
- sandboxモードを解除: vagrant sandbox offchef
で色々インストールする前に、sandboxモードを有効にしておき、インストール後にrollbackすれば手軽に元の状態に戻せるので便利。
knife-soloのインストール
リモートからchef-soloを実行できるようにする。
NOTE
本書では、0.3.0のインストールはgithubからcloneしてrakeコマンドでインストールする方法が書かれていたが自分の環境ではrake install時にエラーが発生した。
色々試して、最終的にbundleを用いることでknife-soloが正しくインストールできた。
- knife-soloをインストールするディレクトリを適当に作成
mkdir ~/vagrant/my-chef-repo
cd ~/vagrant/my-chef-repo
- bundle初期化
bundle init
- Gemfileを編集
# vi Gemfile
source "https://rubygems.org"
gem 'knife-solo', '0.3.0.pre3'
- gemでknife-solo 0.3.0をインストールする
bundle install --path=vendor/bundle --binstubs
- knife-soloの初期化
bin/knife solo init chef-repo
Chefレポジトリが作成される
- knife.rbに設定追加
#vi .chef/knife.rb
cookbook_path ["cookbooks", "site-cookbooks"]
role_path "roles"
data_bag_path "data_bags"
#encrypted_data_bag_secret "data_bag_key"
knife[:solo_path] = '/tmp/chef-solo' # 追加
NOTE
本書では、先にprepareを行うようになっていたが、init前はchef-repoが存在しないため下記エラーが表示されるので注意
ERROR: Errno::ENOENT: No such file or directory - nodes/vagrant.json
- vagrantにchef-soloをインストール
cd chef-repo
../bin/knife solo prepare vagrant
# ../bin/knife solo prepare {ホスト名}
インストールに結構時間がかかった。
vagrantにchef-soloがインストールされた後、nodes/vagrant.jsonが追加される。
NOTE
この状態で一度sandboxモードを更新しておくとレシピの動作確認を手軽に試せる
vagrant sandbox commit
nginxレシピの作成
- レシピのテンプレートを作成
../bin/knife cookbook create nginx -o cookbooks
- レシピを記述
# vi cookbooks/nginx/recipes/default.rb
package "nginx" do
action :install
end
service "nginx" do
supports :status => true, :restart => true, :reload => true
action [:enable, :start]
end
template "nginx.conf" do
path "/etc/nginx/nginx.conf"
source "nginx.conf.erb"
owner "root"
group "root"
mode 0644
notifies :reload, 'service[nginx]'
end
- テンプレートファイルの編集
# vi cookbooks/nginx/templates/default/nginx.conf.erb
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log
pid /var/run/nginx.pid
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen <%= node['nginx']['port'] %>;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
- jsonの編集
# vi nodes/vagrant.json
{
"nginx": {
"port": 80
},
"run_list": [
"nginx"
]
}
NOTE
本書で解説されているCentOS 6.3にnginxをインストールにはyumのEPELが必要となる
- epel追加(事前にローカルレポジトリを最新にしておく)
cd chef-repo
git add .
git commit -m 'add hoge'
../bin/knife cookbook site vendor yum
- iptablesを無効にするレシピを追加
NOTE
検証環境のためiptablesを無効化することにしたが、本来は特定ポートのみ許可と設定すべき
../bin/knife cookbook create iptables -o site-cookbooks
vi site-cookbooks/iptables/recipes/default.rb
service 'iptables' do
action [:disable, :stop]
end
- jsonを修正
# vi nodes/vagrant.json
{
"nginx": {
"port": 80
},
"run_list":[
"yum::epel",
"iptables",
"nginx"
]
}
- レシピ実行
../bin/knife solo cook vagrant
ブラウザからVagrantfileに設定したIP(192.168.50.12)にアクセスするとnginxのデフォルトページが表示される。
まだほんのさわりの部分にしか触れていないが、chef-soloを使うことで手軽にインフラ管理できることを体験できた。
今後サーバ構築を行う場合はchefで管理を行い、少しづつレシピを育てていきたい。
その他
第1章から第3章で解説されていたknife-soloを使わない方法も試してみた
- sshで仮想マシンにログイン
ssh vagrant
- gitのインストール
sudo yum install git
- chefのインストール
sudo gem install chef
- テンプレートとしてopscodeのchef-repoをclone
git clone git://github.com/opscode/chef-repo.git
- knife初期設定
knife configure
- サンプルレシピを作ってみる
cd chef-repo
knife cookbook create hello -o cookbooks/
- default.rbの編集
# vi cookbooks/hello/recipes/default.rb
package "zsh" do
action :install
end
- jsonの編集
# vi localhost.json
{
"run_list": [
"recipe[hello]"
]
}
- 設定ファイルの追加
# vi solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/vagrant/chef-repo/cookbooks"]
- レシピを実行
sudo chef-solo -c solo.rb -j ./localhost.json
うまくzshがインストールできた
MEMO
ChefSoloの流れ
1.レシピを作って
2.JSONファイルで実行するレシピを指定して
3.chef-soloコマンドでそれを実行する
参考URL
- knife-soloを使ってChefを始める準備
- [[bundler]Bunderを使ったGem管理のメモ](http://www.milligramme.cc/wp/archives/3475)
- chef-soloのセットアップとchefについての私感
- Knife-soloの環境を整える