Python Developers Festa 2013.3 (pyfes)で Chef 話をしてきました

py と fes だけ略されて、一体 Developers はどこに行ってしまったんでしょうか(挨拶)

Developers 不在の pyfes 2013.3 で Chef と OpsCode の話をしてきました。

当日はネットワークにつながらないトラブルがあり、動いているところをお見せできませんでしたので、
ここではどういうことをデモしようとしていたのかと絡めて、今回のスライドをご紹介します。

キモになるのは community cookbooks

スライドでも触れましたが community cookbooks がキモになります。
いろんなサイトで、chef-solo を紹介する際には「レシピの書き方」が最初に紹介されていますが、
このスライドではその部分は端折って、"もっと効率良く使う" 際に書くものとして説明しています。

サーバを構築する際に、その作業のうち大半は

あなたのアプリケーション向けに調整が必要な作業はパッケージリポジトリの登録や
MTA や NTP など各種サーバの設定、開発用/運用ツールのインストールなど、
アプリケーションそのものに直接結びつかない、特別な設定の必要のないものが幾つもあるはずです。
こうしたものは簡単にインストールできる community cookbooks を使うことで
サーバ構築を加速させることができるはずです。

もちろん、チューニングや特殊な設定が必要なソフトウェアのセットアップをするために、
独自の cookbook を書く必要はでてくると思います。
使用しないサービスの停止、ユーザやデプロイ先ディレクトリの追加、設定ファイルの書き換えなど、
グルーとしての cookbook を書く機会はあります。

うまく community cookbooks を組み合わせて利用して、
なるべく車輪の再発明を避けつつサーバ構築を省力できるようにやっていきたいものです。

サンプルケース:Jenkins サーバを構築する

pyfes ではそのデモとして、Jenkins サーバを構築する様子をご紹介しようと考えていました。
僕の仕事ではプロジェクトによって OS やミドルウェアのバージョンなど環境に少しずつ差があるため、
プロジェクトごとに Jenkins サーバを構築しています。

こうしたケースでは、「開発環境を構築する cookbooks」を使って Jenkins も作ることで、
同じ環境でのテストを保証することができます。

では、librarian で cookbooks をリストアップするところから始めてみましょう。
以前の記事も参考にしつつ Cheffile を作ります。
Jenkins サーバを立てるために jenkins cookbook を、
さらにフロントエンドの Web サーバとして nginx 用の nginx cookbook をそれぞれ利用します。

site 'http://community.opscode.com/api/v1'

cookbook 'jenkins'
cookbook 'nginx'

次に run_list (実行する cookbooks のリスト)と Attributes を設定するために solo.json ファイルを作成します。
ここでは Jenkins と nginx の連携を設定させる jenkins.http_proxy.variant と、
nginx でデフォルトのサイトを無効にする nginx.default_site_enabled の値を設定しています。

{
  "jenkins" : {
    "http_proxy" : {
      "variant" : "nginx"
    }
  },
  "nginx" : {
    "default_site_enabled" : false
  },
  "run_list" : [
    "recipe[java]",
    "recipe[jenkins]",
    "recipe[nginx]"
  ]
}

最後に solo.rb を作ります。cookbooks のパスを定義しておけば ok です。

cookbook_path "/home/vagrant/cookbooks"

あとは実行するだけです。root 権限が必要になるので sudo 経由で実行しましょう。

$ sudo chef-solo -j solo.json -c $HOME/solo.rb

たったこれだけの手順で Jenkins サーバが構築できます。
実際にそのホストにブラウザでアクセスすると Jenkins のページが表示されるはずです。

手続き型ツールとの比較

pyfes では直前に Fabric の発表 があり、TL では Fabric の方が気に入った方が多かったようです。
仕組みがわかりやすく、今までの知識が活かしやすい Fabric は非常に使いやすいツールだと思います。

しかし、冪等性の担保を自分で行う必要があったり、
community cookbooks のようなものが今のところ存在しないため、
実際にサーバ構築をしていくのは、chef を使うのと同じような努力が必要になりそうな気がしています。

今後、cuisine と組み合わせての冪等性の確保や、community cookbook のような仕掛けが出てくると
chef の強力なライバルになりそうなのでちょっと期待してみようかな、と思います。