Chef レシピによる環境のカスタマイズ

このドキュメントは英語版のドキュメントを日本語に翻訳したものです。原文に修正があった場合は随時反映致しますが、翻訳作業が完了するまでは英語版が最新の可能性がございます。


Engine Yard Cloud 環境をカスタマイズするには、Chef レシピを使用します。Engine Yard 提供のクックブックを編集するか、または独自のクックブックを作成します。

このページでは、以下について説明します。

Chef 環境のセットアップ

環境のカスタマイズを構築 (およびインスタンスを開始するたびに再構築) する Chef レシピを開発するには、engineyard gem を開発マシンのローカル環境にインストールする必要があります。

engineyard gem を既にインストールしている場合でも、最新版の gem がインストールされているかどうかを確認するために、"install engineyard" を実行することをお勧めします。

engineyard gem をインストールする方法

  1. 以下のように入力します。

    $ sudo gem install engineyard 
  2. プロンプトが表示されたら、Engine Yard アカウントのパスワードを入力します。

ey-cloud-recipes リポジトリの複製

ey-cloud-recipes リポジトリを使って作業するには、ローカル マシンの開発環境に分岐および複製する必要があります。使用する環境 (engineyard gem をインストールした環境と同じ) 用にカスタム Chef レシピを作成するときは、作業を行うディレクトリに ey-cloud-recipes リポジトリのローカル コピーを複製します。

ここでは、GitHub リポジトリを複製するための一般的な手順について説明します。

ey-cloud-recipes リポジトリを分岐して複製する方法

  1. GitHub で ey-cloud-recipes サイトを参照します。
  2. [Fork (分岐)] をクリックして、リポジトリを分岐します。
    これによって、GitHub のユーザー アカウントに分岐が作成されます。
  3. 分岐されたリポジトリの URL をクリップボードにコピーします。
  4. リポジトリをローカル開発マシンに複製します。
    メモ: 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.rbremote_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 ファイルのレシピのコメントを解除する必要があります。

既存のクックブックを有効にする方法

  1. 使用するクックブックを選択します。

  2. ローカル環境で編集する cookbooks/main/recipes/default.rb を開きます。

  3. 有効にするレシピの "require_recipe" 行のコメントを解除します。

  4. コメントに含まれる追加手順に従います。
    たとえば、Sphinx では cookbooks/sphinx/recipes/default.rb を編集する必要があります。詳細については、「Implement full text search with Sphinx on Engine Yard Cloud (Engine Yard Cloud での Sphinx によるフル テキスト検索の実装)」を参照してください。

  5. cookbooks/main/recipes/default.rb を保存して変更をローカルにコミットし、リモート リポジトリにプッシュします。

  6. レシピをアップロードして適用するには、ey レシピ コマンドを使用します。

    ey recipes upload -e environment_name 
    ey recipes apply -e environment_name

クックブックの作成

あらかじめ用意されているクックブックがニーズに合わない場合は、独自のクックブックを白紙の状態から作成できます。

以下の手順によって、nginx_logrotate という新しい Chef レシピの作成方法を示します。このレシピは、Nginx ログの保有期間を 30 日 (既定) から 60 日に変更します。

新しい Chef レシピを生成する方法

  1. ローカル環境の ey-cloud-recipes リポジトリ ディレクトリで、以下のように入力します。

    $ rake new_cookbook COOKBOOK=nginx_logrotate 

    これによって、cookbooks/nginx_logrotate/recipes/default.rb ファイルが作成されます。

  2. 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
  3. 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
    }
  4. cookbook/main/recipes/default.rb を編集して、レシピを有効にします。

     require_recipe "nginx_logrotate" 
  5. 新しいレシピの構文をテストします。

     $ rake test 
  6. 変更をローカルにコミットし、リモート リポジトリにプッシュします。

  7. レシピをアップロードして適用するには、ey レシピ コマンドを使用します。

        ey recipes upload -e environment_name 
    ey recipes apply -e environment_name

カスタム レシピからダッシュボードへの報告

カスタム Chef レシピを実行して、メッセージを表示することができます。これらのメッセージは [Instances (インスタンス)] 見出しの環境ページに表示され、Chef レシピのカスタム部分を実行しているときに確認できます。これらのメッセージは chef.custom.log ファイルにも含まれます。(以下の 「カスタム Chef レシピからログ ファイルへの報告」を参照してください。)

カスタム Chef レシピからダッシュボードに報告する方法

  1. 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 レシピからログ ファイルへ報告する方法

  1. 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 つの種類のインスタンスでのみレシピを実行します。たとえば、アプリケーション マスターでのみ実行し、アプリケーション スレーブ、データベース、ユーティリティ インスタンスなどでは実行しない場合があります。

レシピを実行するインスタンス (ロール) を指定する方法

  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 サポートにチケットを送信してください。

コメント

サインインしてコメントを残してください。

Powered by Zendesk