

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

# recipe
<a name="workingcookbook-installingcustom-components-recipes"></a>

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

レシピは、システムの設定を定義する Ruby アプリケーションです。これを使用して、パッケージのインストール、テンプレートからの設定ファイルの作成、シェルコマンドの実行、ファイルとディレクトリの作成などを行います。通常 OpsWorks 、インスタンスで[ライフサイクルイベント](workingcookbook-events.md)が発生したときに スタックによってレシピが自動的に実行されますが、[Execute Recipes スタックコマンド](workingcookbook-executing.md)を使用していつでも明示的に実行することもできます。詳細については、「[レシピについて](http://docs.chef.io/recipes.html)」を参照してください。

通常、レシピの大部分は、それぞれがシステムのある側面の目的の状態を表す、一連の*リソース*で構成されます。各リソースには、目的の状態の定義と実行するアクションの指定を行う、一連の属性が含まれています。Chef によって、アクションを実行する適切な*プロバイダー*に各リソースが関連付けられます。詳細については、「[リソースおよびプロバイダーリファレンス](https://docs.chef.io/resource.html)」を参照してください。

`package` リソースは、Linux インスタンスのソフトウェアパッケージを管理するのに役立ちます。次の例では、Apache パッケージをインストールします。

```
...
package 'apache2' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    package_name 'httpd'
  when 'debian','ubuntu'
    package_name 'apache2'
  end
  action :install
end
...
```

Chef は、プラットフォーム用の適切なパッケージプロバイダーを使用します。通常、リソース属性には、単に値が割り当てられるだけですが、Ruby の論理演算子を使用して、条件付き割り当てを実行することもできます。例では、`case` 演算子を使用しています。これは、`node[:platform]` を使用してインスタンスのオペレーティングシステムを識別し、それに応じて `package_name` 属性を設定します。標準の Chef ノード構文を使用して、レシピに属性を挿入できます。属性は Chef によって、関連付けられている値に置き換えられます。ノードオブジェクトでは、クックブックにある属性だけでなく、任意の属性を使用できます。

適切なパッケージ名を判別したら、コードセグメントはパッケージをインストールする `install` アクションを実行して終了します。このリソースに対するアクションには、他に `upgrade` や `remove` などがあります。詳細については、「[package](https://docs.chef.io/chef/resources.html#id150)」を参照してください。

インストールや設定を行う複雑なタスクを 1 つ以上のサブタスクに分割し、それぞれを別個のレシピとして実装して、適切なタイミングでプライマリレシピで実行すると効率的です。次の例は、前述の例に続くコード行を示しています。

```
include_recipe 'apache2::service'
```

レシピで子レシピを実行するには、`include_recipe` キーワードを使用し、その後ろにレシピ名を指定します。レシピは、標準の Chef 構文である `CookbookName::RecipeName` を使用して識別されます。この `RecipeName` では `.rb` 拡張子が省略されます。

**注記**  
`include_recipe` ステートメントは、プライマリレシピにおいて、その時点のレシピを効率的に実行します。ただし、実際には、プライマリレシピの実行前に、Chef によって各 `include_recipe` ステートメントが指定されたレシピのコードで置き換えられます。

`directory` リソースはディレクトリ (パッケージのファイルが含まれるディレクトリなど) を表します。次に示す `default.rb` リソースは、Linux ログディレクトリを作成します。

```
directory node[:apache][:log_dir] do
    mode 0755
    action :create
end
```

ログディレクトリは、クックブックの属性ファイルのいずれかで定義されています。リソースでは、ディレクトリのモードを 0755 に指定し、`create` アクションを使用してディレクトリを作成します。詳細については、「[directory](https://docs.chef.io/chef/resources.html#directory)」を参照してください。また、Windows インスタンスでもこのリソースを使用できます。

`execute` リソースは、シェルコマンドやスクリプトなどのコマンドを表します。module.load ファイルを生成する例を次に示します。

```
execute 'generate-module-list' do
  if node[:kernel][:machine] == 'x86_64'
    libdir = 'lib64'
  else
    libdir = 'lib'
  end
  command "/usr/local/bin/apache2_module_conf_generate.pl /usr/#{libdir}/httpd/modules /etc/httpd/mods-available"
  action :run
end
```

リソースは、最初に CPU タイプを判別します。`[:kernel][:machine]` は、さまざまなシステムプロパティ (ここでは CPU タイプ) を表すために Chef が生成する、もう 1 つの自動属性です。次に、コマンド (Perl スクリプト) を指定し、`run` アクションを使用してスクリプトを実行します。これにより、module.load ファイルが生成されます。詳細については、「[execute](https://docs.chef.io/chef/resources.html#execute)」を参照してください。

`template` リソースは、クックブックのテンプレートファイルの 1 つから生成されるファイル (通常は設定ファイル) を意味します。次の例では、`httpd.conf` で説明した `apache2.conf.erb` テンプレートから [テンプレート](workingcookbook-installingcustom-components-templates.md) 設定ファイルが 作成されます。

```
template 'apache2.conf' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    path "#{node[:apache][:dir]}/conf/httpd.conf"
  when 'debian','ubuntu'
    path "#{node[:apache][:dir]}/apache2.conf"
  end
  source 'apache2.conf.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, resources(:service => 'apache2')
end
```

リソースは、インスタンスのオペレーティングシステムに基づいて、生成されるファイルの名前と場所を決定します。次に、ファイルの生成に使用するテンプレートとして `apache2.conf.erb` を指定し、ファイルの所有者、グループ、およびモードを設定します。`notify` アクションを実行して、Apache サーバーを表す `service` リソースに、サーバーを再起動するよう通知します。詳細については、「[template](https://docs.chef.io/chef/resources.html#template)」を参照してください。