[Mac]『入門Chef Solo』を読んで試してみた


[まとめ] 現在開催中のKindleセール情報はこちら

伊藤直也さんの『入門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 off

chefで色々インストールする前に、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

[まとめ] 現在開催中のKindleセール情報はこちら