レシピの構造 - AWS OpsWorks

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

レシピの構造

重要

AWS OpsWorks Stacks は新規顧客を受け付けなくなりました。既存のお客様は、2024 年 5 月 26 日までは、通常どおり OpsWorks コンソール、API、CLI、および CloudFormation リソースを使用できます。その時点で廃止されます。この移行に備えて、できるだけ早くスタックを AWS Systems Manager に移行することをおすすめします。詳細については、「AWS OpsWorks Stacks サポート終了に関する FAQ」および「AWS Systems Manager アプリケーションマネージャへの AWS OpsWorks Stacks アプリケーションの移行」を参照してください。

クックブックは主に、インスタンス上のさまざまなタスクを実行できる一連のレシピです。レシピを実行する方法をわかりやすくするために、シンプルな例を見てみましょう。以下にあげるのは組み込み 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
注記

作業レシピおよび関連ファイルのここに挙げた例やその他の例については、「AWS 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" do attribute1 'value1' attribute2 'value2' ... action :action_name notifies : action 'resource' end

要素は以下のとおりです。

リソースタイプ

(必須) この例では 3 個のリソースタイプを含んでいます。packageservice、および template です。

リソース名

(必須) リソース名は特定のリソースを識別し、場合によっては属性のデフォルト値の 1 つとして使用されます。例では、packagehaproxy という名前のパッケージリソースを示し、最初の template リソースは /etc/default/haproxy という名前の設定ファイルを表します。

属性

(オプション) 属性はリソース設定を指定するもので、リソースのタイプと設定方法によって異なります。

  • 例にある template リソースは、作成されたファイルのソース、所有者、グループおよびモードを指定する一連の属性を明示的に定義します。

  • 例にある package および service リソースは、どのような属性も明示的に定義しません。

    通常、リソース名は必須属性のデフォルト値で、それだけで十分な場合もあります。たとえば、リソース名は package リソースの package_name 属性のデフォルト値であり、唯一の必須属性です。

また、リソースプロバイダーを実行する時に指定される、ガード属性と呼ばれる特殊な属性がいくつかあります。例えば、only_if 属性は指定された条件が満たされる場合だけリソースプロバイダーにアクション実行を指示します。HAProxy レシピはガード属性を使用しませんが、以下の例のいくつかで使用されています。

アクションおよび通知

(オプション) アクションおよび通知は、プロバイダーがどのタスクを実行するかを指定します。

  • action はインストールや作成など指定したアクションを実行するようにプロバイダーに指示します。

    各リソースには特定のリソースに依存する一連のアクションがあり、そのうちの 1 つはデフォルトのアクションです。例では、packageリソースのアクションは install であり、プロバイダーにパッケージをインストールするように指示します。最初の template リソースには action 要素はないので、プロバイダーはデフォルトの create アクションを実行します。

  • notifies はリソースの状態が変化した場合のみ、別のリソースのプロバイダーにアクションを実行するように指示します。

    notifies は通常、templatefile のようなリソースとともに使用され、設定ファイルを変更した後にサービスを再起動するなどのタスクを実行します。リソースにはデフォルトの通知はありません。通知が必要な場合は、リソースに明示的な notifies 要素が必要です。HAProxy レシピでは、2 番目の template リソースが HAProxy service に対し、関連する設定ファイルが変更された場合に 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」を参照してください。