翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
レシピの構造
重要
- AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、 にお問い合わせください。 AWS Support でのチーム AWS re:Post
クックブックは主に、インスタンス上のさまざまなタスクを実行できる一連のレシピです。レシピを実行する方法をわかりやすくするために、シンプルな例を見てみましょう。以下は、組み込みHAProxyレイヤー のセットアップレシピです。現時点では全体的な構造に注目して詳細にはあまり気を取られないでください。詳細は後述の例で説明します。
package 'haproxy' do action :install end if platform?('debian','ubuntu') template '/etc/default/haproxy' do source 'haproxy-default.erb' owner 'root' group 'root' mode 0644 end end include_recipe 'haproxy::service' service 'haproxy' do action [:enable, :start] end template '/etc/haproxy/haproxy.cfg' do source 'haproxy.cfg.erb' owner 'root' group 'root' mode 0644 notifies :restart, "service[haproxy]" end
注記
作業レシピと関連ファイルのこの例とその他の例については、「」を参照してください。 AWS OpsWorks スタックの組み込みレシピ
例では、以下のセクションで説明するレシピの主要な要素に焦点を当てています。
リソース
レシピは、Chef リソースのセットの大部分を構成します。それぞれのレシピは、インストールするパッケージや開始するサービスなど、インスタンスの最終状態の特定の部分を指定します。例には 4 つのリソースがあります。
-
インストールされたパッケージを表す
package
リソース、この例のHAProxyサーバー。 -
このHAProxy例のサービスを表す
service
リソース。 -
指定されたテンプレートから作成されるファイルを表す 2 つの
template
リソース、この例の 2 つのHAProxy設定ファイル。
リソースはインスタンスの状態を指定する宣言方法を提供します。バックグラウンドで各リソースにはプロバイダーが関連付けられ、パッケージのインストール、ディレクトリの作成と設定、サービスの開始など必要なタスクを実行します。タスクの詳細が特定のオペレーティングシステムに依存する場合、リソースは複数のプロバイダーを持ってシステムに応じて使い分けます。たとえば、Red Hat Linux システムでは package
プロバイダーは yum
を使用してパッケージをインストールします。Ubuntu Linux システムでは、package
プロバイダーは apt-get
を使用します。
以下の一般的な形式で Ruby コードブロックとしてリソースを実行します。
resource_type
"resource_name
" doattribute1
'value1
'attribute2
'value2
' ... action :action_name
notifies :action
'resource
' end
要素は以下のとおりです。
- リソースタイプ
-
(必須) この例では 3 個のリソースタイプを含んでいます。
package
、service
、およびtemplate
です。 - リソース名
-
(必須) リソース名は特定のリソースを識別し、場合によっては属性のデフォルト値の 1 つとして使用されます。例では、
package
はhaproxy
という名前のパッケージリソースを示し、最初のtemplate
リソースは/etc/default/haproxy
という名前の設定ファイルを表します。 - 属性
-
(オプション) 属性はリソース設定を指定するもので、リソースのタイプと設定方法によって異なります。
-
例にある
template
リソースは、作成されたファイルのソース、所有者、グループおよびモードを指定する一連の属性を明示的に定義します。 -
例にある
package
およびservice
リソースは、どのような属性も明示的に定義しません。通常、リソース名は必須属性のデフォルト値で、それだけで十分な場合もあります。たとえば、リソース名は
package
リソースのpackage_name
属性のデフォルト値であり、唯一の必須属性です。
また、リソースプロバイダーを実行する時に指定される、ガード属性と呼ばれる特殊な属性がいくつかあります。例えば、
only_if
属性は指定された条件が満たされる場合だけリソースプロバイダーにアクション実行を指示します。HAProxy recipe はガード属性を使用しませんが、以下のいくつかの例で使用されます。 -
- アクションおよび通知
-
(オプション) アクションおよび通知は、プロバイダーがどのタスクを実行するかを指定します。
-
action
はインストールや作成など指定したアクションを実行するようにプロバイダーに指示します。各リソースには特定のリソースに依存する一連のアクションがあり、そのうちの 1 つはデフォルトのアクションです。例では、
package
リソースのアクションはinstall
であり、プロバイダーにパッケージをインストールするように指示します。最初のtemplate
リソースにはaction
要素はないので、プロバイダーはデフォルトのcreate
アクションを実行します。 -
notifies
はリソースの状態が変化した場合のみ、別のリソースのプロバイダーにアクションを実行するように指示します。notifies
は通常、template
やfile
のようなリソースとともに使用され、設定ファイルを変更した後にサービスを再起動するなどのタスクを実行します。リソースにはデフォルトの通知はありません。通知が必要な場合は、リソースに明示的なnotifies
要素が必要です。HAProxy recipe では、2 番目のtemplate
リソースは、関連付けられた設定ファイルが変更された場合にHAProxyサービスを再起動するように haproxyservice
リソースに通知します。
-
リソースはオペレーティングシステムによって異なる場合があります。
-
一部のリソースは Linux または Windows システムにのみ使用できます。
たとえば、package
によって、Linux システムにパッケージがインストールされ、windows_package によって Windows システムにパッケージがインストールされます。 -
一部のリソースはいずれのオペレーティングシステムでも使用できますが、特定のシステムに固有の属性があります。
たとえば、file
リソースは、Linux または Windows システムのいずれかに使用できますが、アクセス権限を設定するための属性の個別のセットはありません。
標準的なリソースおよびそれぞれの使用可能な属性、アクション、通知についての説明は、「リソースおよびプロバイダーについて
フロー制御
レシピは Ruby アプリケーションであるため、レシピにフロー制御を組み込むために Ruby の制御構造を使用できます。たとえば、レシピが異なるシステムで異なる動作をするように Ruby の条件付きロジックを使用できます。HAProxy recipe には、template
リソースを使用して設定ファイルを作成する if
ブロックが含まれていますが、レシピが Debian または Ubuntu システムで実行されている場合に限ります。
もう 1 つの一般的なシナリオとしては、ループを使用して異なる属性設定でリソースを複数回実行します。たとえば、異なるディレクトリで directory
リソースを複数回実行するループを使用して、一連のディレクトリを作成できます。
注記
Ruby になじみがない場合は、「Chef のための Ruby 基礎
内包レシピ
include_recipe
はコードの中に他のレシピを含め、レシピをモジュール化して複数のレシピで同じコードを再利用できます。ホストのレシピを実行すると、Chef はそれぞれの include_recipe
の要素を指定されたレシピのコードに置き換えてからホストのレシピを実行します。内包レシピは、標準の Chef 構文である cookbook_name::recipe_name
を使用して識別されます。この recipe_name
では .rb
拡張子が省略されます。この例には、HAProxyサービスを表すレシピ haproxy::service
が 1 つ含まれています。
注記
Chef 11.10 以降で実行されているレシピに include_recipe
を使用して他のクックブックからのレシピを含める場合、depends
ステートメントを使用してクックブックの metadata.rb
ファイル内の依存関係を宣言する必要があります。詳細については、「レシピの実装: Chef 11.10」を参照してください。