Chefサーバを動かすまでの方法をまとめてみた(自動化のススメ)
最近クラッシャーと呼ばれている@masudaKです。
エンジニアのための時間管理術、自動化に関するまとめ - Glide Noteでも述べられているように【自動化】には「スケーラビリティ」や「ミスの可能性を排除」含め多くのメリットがありますが、そのなかでもちょくちょくOSインストール or 増設することがあるエンジニアにはオススメのものということで、今回はChefのインストールに関して書いてみたいと思います。
まず環境構築
ChefはRuby製なので、Rubyが動く環境を作らないといけないのと、わりと依存関係が多いので、ディストリビューションもちゃんと選ぶ必要があったりします。
パッケージでいれたり、gemから入れたり、bootstrapというコマンドライクに入れる方法等色々あるのですが、個人的にはパッケージで入れるのが一番楽でした。
ので、パッケージインストールがサポートされている以下のディストリビューション+バージョンを選ぶのが無難なように思います。
- Ubuntu 11.10 oneiric
- Ubuntu 11.04 natty
- Ubuntu 10.10 maverick
- Ubuntu 10.04 lucid
- Debian (unstable) sid
- Debian (testing) wheezy
- Debian 6 (stable) squeeze
http://wiki.opscode.com/display/chef/Installing+Chef+Server+on+Debian+or+Ubuntu+using+Packagesより
10.04で入れたらわりと依存関係でスムーズに入らなかったので、新しいのでもいいんじゃないかなーという気がします。ひとまず、ディストリビューションはUbuntuかDebianがよいでしょう。
Rubyに関してはこれからRubyを始める人たちへに書かれてるようにrbenvを使ったり、rvmを使うのがよいでしょう。
僕はrvmに慣れてるので、以下の様な感じでやってます。
# curl -L get.rvm.io | bash -s stable ここでSSL周りのエラーが出たら、以下を打ちましょう # echo insecure >> ~/.curlrc 再度実行し、 # curl -L get.rvm.io | bash -s stable # source /etc/profile.d/rvm.sh # which rvm /usr/local/rvm/bin/rvm
という感じ。 その後、
# which rvm # rvm list known # rvm install 1.9.3 # rvm use 1.9.3
といった感じで淡々と入れるだけです。1.8系は2012年6月にbugfixも終わってしまうので、1.9系使ってます。
何かあればrvmで好きなバージョンいれられますし、ざっくりとした感じで。あと、Chef専用のサーバにするため、root権限で遠慮無く実行してます。
あとは
# rvm gemset create chef0.10 # rvm gemset use chef0.10 # gem install merb-assets merb-core merb-helpers merb-param-protection merb-slices thin merb-haml haml coderay --no-rdoc --no-ri
といった感じでgemset作って、依存関係あるものをgemで入れるだけです。
ここまででChefサーバを動かす前提の環境はできました。
Chefサーバのインストール
次にChefサーバを動かすまでやってみましょう。
基本的には公式サイトに書いてあることをやるだけです。
# echo "deb http://apt.opscode.com/ `lsb_release -cs`-0.10 main" | sudo tee /etc/apt/sources.list.d/opscode.list # 鍵登録 # mkdir -p /etc/apt/trusted.gpg.d # gpg --keyserver keys.gnupg.net --recv-keys 83EF826A # gpg --export packages@opscode.com | sudo tee /etc/apt/trusted.gpg.d/opscode-keyring.gpg > /dev/null # レポ更新。鍵の永続化 # apt-get update # apt-get install opscode-keyring # permanent upgradeable keyring # 依存関係あるもの含め、最新にする # apt-get upgrade # Chefパッケージいれる # apt-get install chef chef-server
ここまでやると、rabbitmqとwebuiのパスワードや、webuiのURIなど聞かれますので、入れましょう。
curl -G http://localhost:4040'
でずらずら出てきたらもう大丈夫でございます。
これでインストール終了。
knifeコマンドを使って、ターミナルでも全てできますが、まぁ最初はGUIのほうがわかりやすいかもです。まぁ、そんな手間ではないので、動かしてみてもよいでしょう。
次にCouchDBもGUIで見られるようにしておきましょう。まぁcurlでhttpプロトコル使って話せばいいのですが、せっかくなので。
apacheだったらプロキシ使ってやればよいでしょう。Couchのconfをあまりいじりたくなかっただけなので、別にここはやらなくてもよいですね。
# a2enmod proxy_http # vim /etc/apache2/mods-enabled/proxy.conf <Proxy *> AddDefaultCharset off Order allow,deny #Order deny,allow #Deny from all Allow from all #Allow from .example.com </Proxy> ProxyPass /couch/ http://localhost:5984/ ProxyPassReverse /couch/ http://localhost:5984/
セキュリティ等は随時環境に合わせてやってください。 あとは、[http://wiki.opscode.com/display/chef/Installing+Chef+Server+on+Debian+or+Ubuntu+using+Packages:title=Configure the Command Line Clientの項目に書かれているようにクライアント側の鍵を作って、その鍵の登録をクライアントサーバで行わなければいけませんが、まずサーバ側を完成させてしまいましょう。
次にレシピを作っていくので、その環境を作っていきます。読むの疲れた方は以下はまた別の日にやりましょうw
cookbookのレポジトリ管理
/var/lib/chef/cookbooksがレシピを作っていくデフォルトのパスになってますので、そこをバージョン管理します。Subversionだったらこんな感じ。
webuserというユーザとdevgroupというグループに権限与えて、必要であればdevgroupに開発者登録すれば楽かもですね。gitでもそんな差はないかと思います。
レシピ作成
これでレシピ書く環境が整ったので、書いていきましょう。レシピを書くためにはcookbookの作成・アップロードが必要になりますので、こんな感じ。以下は「masuda」というcookbookを作ってます。
# chgrp -R devgroup /var/lib/chef/cookbooks/ # chmod -R g+w /var/lib/chef/cookbooks/ $ cd /var/lib/chef/cookbooks $ knife cookbook create masuda -o . masudaできてる $ ls masuda sample cookbookの登録を行う $ knife cookbook upload masuda -o . Uploading masuda [0.0.1] upload complete できあがってる $ ls masuda/ README.md attributes definitions files libraries metadata.rb providers recipes resources templates
これであとは、recipes以下のファイルを編集していくわけですが、レポジトリの反映を/var/lib/chef/cookbooksにしなければいけないので、以下の様なhooksで対応。
COOKBOOKの箇所があまり美しくないので、なんかいい書き方あれば教えて下さいm(\_\_)m
CHEF_USERに関しては、sudoのノンパス設定をしてあげましょう。
これでコミットしたら、Chefサーバに反映されるまでできました。
レシピの書き方などは、以下を参考にするとよいでしょう。
終わりに
Chefのいいところは一度レシピを書くと、何度も使いまわせるので、ウェブサーバ・DBサーバ・キャッシュサーバ等あっても、必要な部分だけ区別し、あとは同じように自動オペレーションできるという点でしょう。
ユーザ作ったり、パッケージ入れたり、コマンド叩いたり、OSいれてサービスインするまではやること基本決まってますので、最初の学習コストを除けば、楽なんじゃないかなーと思います。
ローカルに自分用のメモを書いて、コピペでひたすらやるのもありかもしれませんが、時間とられますし、他の人がそのメモ見てもわからないこともあったりするので、作業は自動化したほうがよいでしょう。
もちろん、最近はクラウド使ってるとこも多く、スナップショットのコピーのように、どっかの断面をコピーして使いまわすこともできるでしょうから、それ自体を否定するものでもありません。状況に応じて、使いやすいもの・楽できるものを使っていくのがよいかと思います。そのうち、クライアント側も書きまする。