このドキュメントは英語版のドキュメントを日本語に翻訳したものです。原文に修正があった場合は随時反映致しますが、翻訳作業が完了するまでは英語版が最新の可能性がございます。
Engine Yard Cloud 環境をカスタマイズするには、Chef レシピを使用します。Engine Yard 提供のクックブックを編集するか、または独自のクックブックを作成します。
このページでは、以下について説明します。
- Chef 環境の設定
- ey-cloud-recipes リポジトリの複製
- ey-cloud-recipes のファイル構造
- クックブックの有効化
- クックブックの作成
- カスタム Chef レシピの起動
- カスタム Chef レシピからダッシュボードへの報告
- カスタム Chef レシピからログ ファイルへの報告
- カスタム Chef レシピを実行するインスタンス ロールの指定
Chef 環境のセットアップ
環境のカスタマイズを構築 (およびインスタンスを開始するたびに再構築) する Chef レシピを開発するには、engineyard gem を開発マシンのローカル環境にインストールする必要があります。
engineyard gem を既にインストールしている場合でも、最新版の gem がインストールされているかどうかを確認するために、"install engineyard" を実行することをお勧めします。
engineyard gem をインストールする方法
-
以下のように入力します。
$ sudo gem install engineyard
-
プロンプトが表示されたら、Engine Yard アカウントのパスワードを入力します。
ey-cloud-recipes リポジトリの複製
ey-cloud-recipes リポジトリを使って作業するには、ローカル マシンの開発環境に分岐および複製する必要があります。使用する環境 (engineyard gem をインストールした環境と同じ) 用にカスタム Chef レシピを作成するときは、作業を行うディレクトリに ey-cloud-recipes リポジトリのローカル コピーを複製します。
ここでは、GitHub リポジトリを複製するための一般的な手順について説明します。
ey-cloud-recipes リポジトリを分岐して複製する方法
- GitHub で ey-cloud-recipes サイトを参照します。
- [Fork (分岐)] をクリックして、リポジトリを分岐します。
これによって、GitHub のユーザー アカウントに分岐が作成されます。 - 分岐されたリポジトリの URL をクリップボードにコピーします。
- リポジトリをローカル開発マシンに複製します。
メモ: git にサブモジュールを使用していない場合は、ey-cloud-recipes リポジトリをアプリケーション リポジトリと同じディレクトリに配置しないでください。既定では、git は入れ子をサポートしません。
ey-cloud-recipes リポジトリの更新について
Engine Yard が加えた変更に対応するために、ey-cloud-recipes リポジトリを更新する必要が生じることがあります。リポジトリの更新は、正常に稼働していない部分がある場合や、新機能を利用する場合に行うと最適です。最新の変更は、リポジトリの GitHub Commit History (GitHub コミット履歴) から確認できます。
重要: リポジトリの更新後および新しい Chef レシピを本番環境に適用する前には、慎重にテストを行ってください。
ey-cloud-recipes のファイル構造について
ey-cloud-recipes リポジトリのファイル構造を理解しておいてください。
基本のファイルとディレクトリ
README.md
Rakefile
cookbooks/
main/
attributes/
definitions/
libraries/
recipes/
クックブック ディレクトリ
クックブックのディレクトリには、使用する環境に対して有効にしてカスタマイズできるさまざまな「コンポーネント」(Sphinx、MongoDB、Redis、Varnish など) の自己完結型レシピのディレクトリがあります。
クックブックの各ディレクトリには、さまざまなサブディレクトリがあります。このページでは、例として Sphinx レシピを使用します。
cookbooks/
sphinx/
files/
default/
sphinx.logrotate
recipes/
default.rb
teplates/
default/
sphinx.monitrc.erb
sphinx.yml.erb
レシピのディレクトリ
各クックブックのメインの定義ファイルは `recipes/default.rb で、Chef によってカスタマイズを実装するための各操作方法を定めます。Sphinx の例を参照してください。
ファイルのディレクトリ
Sphinx クックブックでは、recipes/default.rb
が remote_file
リソース (Chef 用語) を作成します。そのリソースは files/default/sphinx.logrotate
にあり、以下のコード ブロックの source の値に対応します。
remote_file "/etc/logrotate.d/sphinx" do
owner "root"
group "root"
mode 0755
source "sphinx.logrotate"
backup false
action :create
end
sphinx.logrotate
は変数を含まないファイルです。変数データを sphinx.logrotate ファイルに挿入するには、テンプレートと ERB を使用します。
テンプレートのディレクトリ
また、Sphinx クックブックでは、recipes/default.rb
がテンプレートを作成して、変数をそのテンプレートに渡します。
recipes/default.rb ファイル:
template "/etc/monit.d/sphinx.#{app_name}.monitrc" do
source "sphinx.monitrc.erb"
owner node[:owner_name]
group node[:owner_name]
mode 0644
variables({
:app_name => app_name,
:user => node[:owner_name],
:flavor => flavor
})
end
上記の変数はテンプレート (sphinx.monitrc.erb
) に渡され、Chef が静的ファイル (/etc/monit.d/sphinx.myapp.monitrc
) を表示します。
sphinx.monitrc.erb ファイル:
check process sphinx_<%= @app_name %>_3312
with pidfile /var/run/sphinx/<%= @app_name %>.pid
start program = "/engineyard/bin/<%= @flavor %>_searchd <%= @app_name %> start" as uid <%= @user %> and gid <%= @user %>
stop program = "/engineyard/bin/<%= @flavor %>_searchd <%= @app_name %> stop" as uid <%= @user %> and gid <%= @user %>
group sphinx_<%= @app_name %>
クックブックの有効化
クックブックを有効にして、アプリケーションをデプロイするときにその一連のレシピを実行するには、cookbooks/main/recipes/default.rb
ファイルのレシピのコメントを解除する必要があります。
既存のクックブックを有効にする方法
-
使用するクックブックを選択します。
-
ローカル環境で編集する
cookbooks/main/recipes/default.rb
を開きます。 -
有効にするレシピの "require_recipe" 行のコメントを解除します。
-
コメントに含まれる追加手順に従います。
たとえば、Sphinx では cookbooks/sphinx/recipes/default.rb を編集する必要があります。詳細については、「Implement full text search with Sphinx on Engine Yard Cloud (Engine Yard Cloud での Sphinx によるフル テキスト検索の実装)」を参照してください。 -
cookbooks/main/recipes/default.rb
を保存して変更をローカルにコミットし、リモート リポジトリにプッシュします。 -
レシピをアップロードして適用するには、ey レシピ コマンドを使用します。
ey recipes upload -e environment_name
ey recipes apply -e environment_name
クックブックの作成
あらかじめ用意されているクックブックがニーズに合わない場合は、独自のクックブックを白紙の状態から作成できます。
以下の手順によって、nginx_logrotate という新しい Chef レシピの作成方法を示します。このレシピは、Nginx ログの保有期間を 30 日 (既定) から 60 日に変更します。
新しい Chef レシピを生成する方法
-
ローカル環境の ey-cloud-recipes リポジトリ ディレクトリで、以下のように入力します。
$ rake new_cookbook COOKBOOK=nginx_logrotate
これによって、cookbooks/nginx_logrotate/recipes/default.rb ファイルが作成されます。
-
cookbooks/nginx_logrotate/recipes/default.rb を編集して、以下のコードを追加します。
remote_file "/etc/logrotate.d/nginx" do
owner "root"
group "root"
mode 0755
source "nginx.logrotate"
backup false
action :create
end -
files/default/nginx.logrotate というファイルを作成し、以下のコンテンツを追加します。
/var/log/engineyard/nginx/*.log {
daily
missingok
compress
rotate 60
dateext
notifempty
sharedscripts
extension gz
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
} -
cookbook/main/recipes/default.rb を編集して、レシピを有効にします。
require_recipe "nginx_logrotate"
-
新しいレシピの構文をテストします。
$ rake test
-
変更をローカルにコミットし、リモート リポジトリにプッシュします。
-
レシピをアップロードして適用するには、ey レシピ コマンドを使用します。
ey recipes upload -e environment_name
ey recipes apply -e environment_name
カスタム レシピからダッシュボードへの報告
カスタム Chef レシピを実行して、メッセージを表示することができます。これらのメッセージは [Instances (インスタンス)] 見出しの環境ページに表示され、Chef レシピのカスタム部分を実行しているときに確認できます。これらのメッセージは chef.custom.log ファイルにも含まれます。(以下の 「カスタム Chef レシピからログ ファイルへの報告」を参照してください。)
カスタム Chef レシピからダッシュボードに報告する方法
-
RB ファイル (recipes/default.rb など) を編集して、以下のようなコードを追加します。
ey_cloud_report "recipe_name" do
message "message text"
endここで「more message text」が、コードの一部が実行されるときにダッシュボードに表示するメッセージです。
以下に例を示します。
ey_cloud_report "nginx" do
message "custom logrotate for nginx"
end
Sphinx レシピに、ey_cloud_report メソッドの例が含まれています。
カスタム Chef レシピからログ ファイルへの報告
カスタム Chef レシピは、/var/log/chef.custom.log に記録されています。(既定の Engine Yard Cloud レシピは、/var/log/chef.main.log に記録されています。)
カスタム Chef レシピからログ ファイルへ報告する方法
-
RB ファイル (recipes/default.rb など) を編集して、以下のようなコードを追加します。
Chef::Log.info "message text"
たとえば、以下のようにします。Chef::Log.info "Doing step 1."
これは次のような行をファイルに書き込みます。[Sun, 22 Jan 2012 22:29:00 +0000] INFO: Doing step 1.
書き込み対象のファイルは、/var/log/chef.custom.log です。
レシピを実行するインスタンス ロールの指定
クラスター環境にさまざまなインスタンスがあり、それぞれが異なるロールを持つとします。ほとんどの場合は、1 つの種類のインスタンスでのみレシピを実行します。たとえば、アプリケーション マスターでのみ実行し、アプリケーション スレーブ、データベース、ユーティリティ インスタンスなどでは実行しない場合があります。
レシピを実行するインスタンス (ロール) を指定する方法
- if ステートメントをレシピ コードに追加します。
if node[:instance_role] == 'instance_role'
ここで、instance_role は以下のいずれかです。-
app_master
(アプリケーション マスター用) -
app
(アプリケーション スレーブ用) -
solo
(単一インスタンス用) -
db_master
(データベース マスター用) -
db_slave
(データベース スレーブ用) -
util
(ユーティリティ インスタンス用)
-
例
ssh_tunnel レシピで、クラスター環境内のアプリケーション マスターでのみレシピを実行します。
if node[:instance_role] == 'app_master'
...
end
ただし、同じレシピをクラスター環境または単一インスタンスの環境で実行するには、次のように条件を記述します。
if ['app_master', 'solo'].include?(node[:instance_role])
...
end
ユーティリティ サーバーについて
特定のユーティリティ サーバーでレシピを実行する場合は、インスタンス ロールではなく名前によってレシピを指定できます。
たとえば、以下のようにします。
if node[:name] == 'myutility'
...
end
ここで、myutility はユーティリティ インスタンスの名前です。
詳細情報
詳細情報 | 参照 |
---|---|
engineyard gem | Engine Yard CLI User Guide (Engine Yard CLI ユーザー ガイド) |
ey レシピ コマンド | Engine Yard CLI User Guide (Engine Yard CLI ユーザー ガイド) |
カスタム Chef レシピ | Common Custom Chef Solutions (一般的なカスタム Chef ソリューション) (Tim Littlemore 氏によるブログ記事) |
このページに関してフィードバックやご質問がございましたら、以下にコメントを入力してください。サポートが必要な場合は、Engine Yard サポートにチケットを送信してください。
コメント
サインインしてコメントを残してください。