[和訳] Chef Provisioning (旧Chef Metal): Infrastructure As Code
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本項は Chef Provisioning: Infrastructure As Code (2014/11/12) の和訳です。
Chef Provisioningがリリース候補版となり、ChefDKバージョン0.3.4から含まれるようになりました! この強力で新しいChefの機能群は、マシン、イメージ、ロードバランサやその他のインフラをべき等に作成・収束を行えます。それらがクラウド、ベアメタル、仮想マシン、コンテナのどれであろうとです。これは構成管理におけるInfrastructure as Codeの次の段階と言えるでしょう。
Chefは既に、クラスタ化されたアプリケーションにおける個別のマシン上でソフトウェアをすばらしくうまく記述でき自動化できています。Chef ProvisioningはChefの単純さと強力さを用いて、より先の段階へと進みます。つまり、Chefによってクラスタ全体の始めから終わり、ハードウェア、ネットワーク、ソフトウェアの記述と自動化を行うということです。これこそがInfrastructure as Codeの未来です。クラスタ設定をコードに書き下したら、そのクラスタは即テスト可能で、再現可能で、自己修復可能で、べき等で、そしてもっとも重要なことは理解しやすいということです。
Chef Provisioningの機能をいくつか挙げてみましょう。
- machine Resource群によるアプリケーションクラスタの記述
- アプリケーションクラスタの大量のコピー(テスト、統合、本番...)のデプロイ
- 冗長性と可用性のためにクラスタを異なるクラウドとマシンに分散
- デプロイを調整し、例えば、データベースをセカンダリより前にプライマリが確実に起動するように
- machine_batchによりマシンを並列化し、デプロイを高速化
- machine_imageにより、マシン群の標準化と、パッチ当ての能力を失うことなしにイメージを作成することで構築の高速化
- load_balancer Resourceとmachine Resourceによって楽々とサービスをスケーリング
machine: 超簡単
次はMySQLのデータベースマシンをデプロイするRecipeです。この先一緒に見ていくなら、これをファイルに保存しておいてください。
# mycluster.rb
require 'chef/provisioning'
machine 'db' do
recipe 'mysql'
end
これを動作させるためには、ChefとChef Provisioningをインストールし、CHEF_DRIVERにクラウドプロバイダを設定する必要があります。そしてRecipeを実行するだけです。
Chef Provisioningリリース候補版はChefDKに含まれています! まず初めにインストールしましょう。
クラウドの選択、どんなクラウドでも
マシンをプロビジョニングするには、どこにマシンを置くかを決めなければいけません。好みのサポートされているクラウド、仮想マシン、コンテナ、ベアメタルのドライバを選択し、CHEF_DRIVER環境変数に設定してください。
ここでは、デフォルトで~/.aws/configのデフォルトのAWSアカウントにマシンを作成するawsを選びました。
export CHEF_DRIVER=aws # on Unix
set CHEF_DRIVER=aws # on Windows
Recipeを実行
Recipeを実行できるようになりました。
chef-client -z mycluster.rb
なんとマシンの起動が小さな緑色の文字で表されています! Chefがはるか彼方からインストールされています! Chefが収束を行い、MySQLが新しいサーバで起動しました!
これだけです。
マシン3台は1台より良い
「これはすごいけどさ、1台が3分かかっただけでしょ。たくさんのマシンをデプロイしたいときはどうなの?」いい質問です! その答えがmachine_batchによる並列化です。先程のRecipeを書き換えて、2つのウェブマシンを追加しましょう。
# mycluster.rb
require 'chef/provisioning'
machine_batch do
machine 'db' do
recipe 'mysql'
end
# Create 2 web machines
1.upto(2) do |i|
machine "web#{i}" do
recipe 'apache2'
end
end
end
ここでは2つのことをしています。
- machine_batchブロックに3台のマシンを入れました。これはつまり、すべてのマシンが並列にプロビジョニングされることになります。すなわち、1台のマシンが3分かかるのなら、3台のマシンは……合計3分かかります。
- 1台より多くのマシンを作成するためにループを用いました! これはChef ProvisioningがChefの強力な言語の一部として定義されているので、Chef DSLとすべてのRecipeやResourceが有効だからです。もし10台のウェブマシンがほしければ2を10に変えてRecipeを実行するだけです。
chef-client -z mycluster.rb
を実行したとき、dbマシンが作成される代わりに「最新である」と通知されるでしょう! これはすべてのChef Resourceと同じように、machineがべき等だからです。dbマシンが既に存在して期待通りに設定されているので、何もしないのです。
イメージを取り、長持ちさせる
Chef Provisioningにある他に強力なツールとしてmachine_imageがあります。これを用いることで、ChefのRecipeが意味しているプロビジョニング前のイメージを作ることで、apache2をすべてのマシンに毎回インストールしなくてもよくなります。動作を見てみましょう。
# mycluster.rb
machine_image 'web_image' do
recipe 'apache2'
end
machine 'another_web_machine' do
from_image 'web_image'
end
chef-client -z mycluster.rb
これを実行すると、マシンを作成し、イメージを保存し、マシンを破棄するという、イメージ作成の様子が見られるでしょう。そして、another_web_machineがApacheをダウンロードとインストールすることなしで作成される様子がわかるでしょう。
ロードバランサ
ネットワークはマシン同様にクラスタを占める大きな部分です。Chef Provisioningはこれを助けるためにload_balancer Resourceを持っています。最初のRecipeを書き換えてみましょう。
# mycluster.rb
...
load_balancer 'web' do
machines %w(web1 web2)
end
chef-client -z mycluster.rb
このRecipeを実行すると、2つのウェブサーバに対するロードバランサが作成されます!
ドライバ
Chef Provisioningは多くのクラウド、仮想マシン、コンテナ、さらにベアメタルで動作するための拡張可能なドライバ機構を持っています。次は一部です。
クラウド
- aws: Amazon Web Services。ロードバランサ、マシン、イメージと、それらと同じくSQS(Amazon Simple Queue Service)とセキュリティグループを含む増え続ける要素を管理するためのResourceのサポートを含みます。
- azure: Microsoft Azure。マシンとイメージなどのサポートを含みます。
- fog: 多くのクラウドでのマシンとイメージをサポートします。
- AWS
- CloudStack
- OpenStack
- Joyent
- Rackspace
- DigitalOcean
コンテナ
仮想マシン
- vagrant: Vagrantのサポートにより、VirtualBox、VMware Fusionなどもサポートします。
ベアメタル
もっと欲しい?
これはChef Provisioningがどのようなことができるかという基本的な動作の上っ面をなでただけですが、新しい世界への可能性の扉を開いたかと思います。豊富な情報はchef-provisioningレポジトリにあり、多くのドキュメントや例を含んでいます。そこではイシューの登録もできます。もしチャットが好みならGitterチャンネルがあります。それではハッピー・プロビジョニング!