読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

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いれてサービスインするまではやること基本決まってますので、最初の学習コストを除けば、楽なんじゃないかなーと思います。

ローカルに自分用のメモを書いて、コピペでひたすらやるのもありかもしれませんが、時間とられますし、他の人がそのメモ見てもわからないこともあったりするので、作業は自動化したほうがよいでしょう。

もちろん、最近はクラウド使ってるとこも多く、スナップショットのコピーのように、どっかの断面をコピーして使いまわすこともできるでしょうから、それ自体を否定するものでもありません。状況に応じて、使いやすいもの・楽できるものを使っていくのがよいかと思います。そのうち、クライアント側も書きまする。