hello-world
webエンジニアのメモ。とりあえずやってみる。

[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


Related #CentOS

CentOS6.4にOpenCV2.4.6.1をインストール

顔認識がしてみたくなったので調べてみたところ、「ruby-openc」というgemが公開されていたので、まずはOpenCVをインストールしてみました。

[Mac]chef-soloとBerkshelfを使ってNode.jsの環境構築(MongoDB, Redis)

今回はchef-soloとBerkshelfを使ってNode.jsの環境構築をやってみた。

CentOS6.3でyumを使ってphp5.4からphp5.3にダウングレード

諸事情によりCentOS6.3のサーバにインストールされたphp5.4をphp5.3にダウングレードする必要があったので、対応方法をメモしておきます。

CentOS6.3にmysql5.5をインストール

CentOS6.3はデフォルトのyumだとmysql5.1がインストールされますが、mysql5.5を使いたかったので5.1をアンインストールして5.5をインストールし直しました。