

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

# レシピの構造
<a name="cookbooks-101-basics-structure"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

クックブックは主に、インスタンス上のさまざまなタスクを実行できる一連の*レシピ*です。レシピを実行する方法をわかりやすくするために、シンプルな例を見てみましょう。以下にあげるのは組み込み [HAProxyレイヤー](layers-haproxy.md)(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 スタック組み込みレシピ](https://github.com/aws/opsworks-cookbooks)」を参照してください。

例では、以下のセクションで説明するレシピの主要な要素に焦点を当てています。

**Topics**
+ [リソース](#cookbooks-101-basics-structure-resources)
+ [フロー制御](#cookbooks-101-basics-structure-ruby)
+ [内包レシピ](#cookbooks-101-basics-structure-include)

## リソース
<a name="cookbooks-101-basics-structure-resources"></a>

レシピは、Chef *リソース*のセットの大部分を構成します。それぞれのレシピは、インストールするパッケージや開始するサービスなど、インスタンスの最終状態の特定の部分を指定します。例には 4 つのリソースがあります。
+ `package` リソース。インストールされているパッケージを表します。この例では [HAProxy サーバー](http://haproxy.1wt.eu/)です。
+ `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 個のリソースタイプを含んでいます。`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` リソースが HAProxy `service` に対し、関連する設定ファイルが変更された場合に HAProxy サービスを再起動するように通知します。

リソースはオペレーティングシステムによって異なる場合があります。
+ 一部のリソースは Linux または Windows システムにのみ使用できます。

  たとえば、[package](https://docs.chef.io/chef/resources.html#package) によって、Linux システムにパッケージがインストールされ、[windows\$1package](https://docs.chef.io/chef/resources.html#windows-package) によって Windows システムにパッケージがインストールされます。
+ 一部のリソースはいずれのオペレーティングシステムでも使用できますが、特定のシステムに固有の属性があります。

  たとえば、[file](https://docs.chef.io/chef/resources.html#file) リソースは、Linux または Windows システムのいずれかに使用できますが、アクセス権限を設定するための属性の個別のセットはありません。

標準的なリソースおよびそれぞれの使用可能な属性、アクション、通知についての説明は、「[リソースおよびプロバイダーについて](https://docs.chef.io/resource.html)」を参照してください。

## フロー制御
<a name="cookbooks-101-basics-structure-ruby"></a>

レシピは Ruby アプリケーションであるため、レシピにフロー制御を組み込むために Ruby の制御構造を使用できます。たとえば、レシピが異なるシステムで異なる動作をするように Ruby の条件付きロジックを使用できます。HAProxy のレシピには、レシピが Debian または Ubuntu システムで実行中の場合に限り、設定ファイルを作成するために `if` リソースを使用する `template` ブロックが含まれています。

もう 1 つの一般的なシナリオとしては、ループを使用して異なる属性設定でリソースを複数回実行します。たとえば、異なるディレクトリで `directory` リソースを複数回実行するループを使用して、一連のディレクトリを作成できます。

**注記**  
Ruby になじみがない場合は、「[Chef のための Ruby 基礎](https://docs.chef.io/just_enough_ruby_for_chef.html)」を参照してください。ほとんどのレシピに必要な知識を説明しています。

## 内包レシピ
<a name="cookbooks-101-basics-structure-include"></a>

`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](workingcookbook-chef11-10.md)」を参照してください。