翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
レシピの構造
重要
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、AWS re:Post
クックブックは主に、インスタンス上のさまざまなタスクを実行できる一連のレシピです。レシピを実行する方法をわかりやすくするために、シンプルな例を見てみましょう。以下にあげるのは組み込み HAProxyレイヤー(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
注記
作業レシピおよび関連ファイルのここに挙げた例やその他の例については、「OpsWorks スタック組み込みレシピ
例では、以下のセクションで説明するレシピの主要な要素に焦点を当てています。
リソース
レシピは、Chef リソースのセットの大部分を構成します。それぞれのレシピは、インストールするパッケージや開始するサービスなど、インスタンスの最終状態の特定の部分を指定します。例には 4 つのリソースがあります。
-
packageリソース。インストールされているパッケージを表します。この例では HAProxy サーバーです。 -
serviceリソース。サービスを表します。この例では HAProxy サービスです。 -
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_namenotifies :action'resource' end
要素は以下のとおりです。
- リソースタイプ
-
(必須) この例では 3 個のリソースタイプを含んでいます。
package、service、およびtemplateです。 - リソース名
-
(必須) リソース名は特定のリソースを識別し、場合によっては属性のデフォルト値の 1 つとして使用されます。例では、
packageはhaproxyという名前のパッケージリソースを示し、最初のtemplateリソースは/etc/default/haproxyという名前の設定ファイルを表します。 - 属性
-
(オプション) 属性はリソース設定を指定するもので、リソースのタイプと設定方法によって異なります。
-
例にある
templateリソースは、作成されたファイルのソース、所有者、グループおよびモードを指定する一連の属性を明示的に定義します。 -
例にある
packageおよびserviceリソースは、どのような属性も明示的に定義しません。通常、リソース名は必須属性のデフォルト値で、それだけで十分な場合もあります。たとえば、リソース名は
packageリソースのpackage_name属性のデフォルト値であり、唯一の必須属性です。
また、リソースプロバイダーを実行する時に指定される、ガード属性と呼ばれる特殊な属性がいくつかあります。例えば、
only_if属性は指定された条件が満たされる場合だけリソースプロバイダーにアクション実行を指示します。HAProxy レシピはガード属性を使用しませんが、以下の例のいくつかで使用されています。 -
- アクションおよび通知
-
(オプション) アクションおよび通知は、プロバイダーがどのタスクを実行するかを指定します。
-
actionはインストールや作成など指定したアクションを実行するようにプロバイダーに指示します。各リソースには特定のリソースに依存する一連のアクションがあり、そのうちの 1 つはデフォルトのアクションです。例では、
packageリソースのアクションはinstallであり、プロバイダーにパッケージをインストールするように指示します。最初のtemplateリソースにはaction要素はないので、プロバイダーはデフォルトのcreateアクションを実行します。 -
notifiesはリソースの状態が変化した場合のみ、別のリソースのプロバイダーにアクションを実行するように指示します。notifiesは通常、templateやfileのようなリソースとともに使用され、設定ファイルを変更した後にサービスを再起動するなどのタスクを実行します。リソースにはデフォルトの通知はありません。通知が必要な場合は、リソースに明示的なnotifies要素が必要です。HAProxy レシピでは、2 番目のtemplateリソースが HAProxyserviceに対し、関連する設定ファイルが変更された場合に HAProxy サービスを再起動するように通知します。
-
リソースはオペレーティングシステムによって異なる場合があります。
-
一部のリソースは Linux または Windows システムにのみ使用できます。
たとえば、package
によって、Linux システムにパッケージがインストールされ、windows_package によって Windows システムにパッケージがインストールされます。 -
一部のリソースはいずれのオペレーティングシステムでも使用できますが、特定のシステムに固有の属性があります。
たとえば、file
リソースは、Linux または Windows システムのいずれかに使用できますが、アクセス権限を設定するための属性の個別のセットはありません。
標準的なリソースおよびそれぞれの使用可能な属性、アクション、通知についての説明は、「リソースおよびプロバイダーについて
フロー制御
レシピは Ruby アプリケーションであるため、レシピにフロー制御を組み込むために Ruby の制御構造を使用できます。たとえば、レシピが異なるシステムで異なる動作をするように Ruby の条件付きロジックを使用できます。HAProxy のレシピには、レシピが Debian または Ubuntu システムで実行中の場合に限り、設定ファイルを作成するために if リソースを使用する template ブロックが含まれています。
もう 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」を参照してください。