

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 Chef 11.4 堆栈实施配方
<a name="workingcookbook-chef11-4"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

**重要**  
请勿为自定义或社区说明书重复使用内置说明书名称。与内置说明书具有相同名称的自定义说明书可能会失败。[有关 Chef 11.10、11.4 和 0.9 堆栈中可用的内置食谱的完整列表，请参阅 opsworks-cookbooks 存储库。 GitHub](https://github.com/aws/opsworks-cookbooks)

Chef 11.4 堆栈的主要限制是：配方不能使用 Chef 搜索或数据包。但是， OpsWorks Stacks 会在每个实例上安装[堆栈配置和部署属性](workingcookbook-json.md)，这些属性包含您通过搜索获得的大部分信息，包括以下内容：
+ 控制台中用户定义的数据，如主机名或应用程序名称。
+ Stac OpsWorks ks 服务生成的堆栈配置数据，例如堆栈的层、应用程序和实例，以及有关每个实例的详细信息，例如 IP 地址。
+ 包含用户提供的、几乎能够充当数据包来进行使用的数据的自定义 JSON 属性。

OpsWorks 在事件的 Chef 运行开始之前，Stacks 会在每个生命周期事件的每个实例上安装最新版本的堆栈配置和部署属性。配方可通过标准 `node[:attribute][:child_attribute][...]` 语法获得这些数据。例如，堆栈配置和部署属性包括堆栈名称 `node[:opsworks][:stack][:name]`。

以下内容摘自其中一个内置配方，这部分摘录内容可获得堆栈名称并使用这个名称创建一个配置文件。

```
template '/etc/ganglia/gmetad.conf' do
  source 'gmetad.conf.erb'
  mode '0644'
  variables :stack_name => node[:opsworks][:stack][:name]
  notifies :restart, "service[gmetad]"
end
```

许多堆栈配置和部署属性值包含多个属性。您必须循环访问这些属性来获取所需的信息。下面的示例显示了堆栈配置和部署属性 (为方便起见，我们将其表示为 JSON 对象) 的摘录内容。它包含一个顶级属性 `deploy`，这个属性包含每个堆栈的应用程序的属性，并以应用程序的简称命名。

```
{
  ...
  "deploy": {
    "app1_shortname": {
      "document_root": "app1_root",
      "deploy_to": "deploy_directory",
      "application_type": "php",
      ...
    },
    "app2_shortname": {
      "document_root": "app2_root",
      ...
    }
  },
  ...
}
```

每个应用程序属性都包含一组描述应用程序特征的属性。例如，`deploy_to` 属性表示应用程序的部署目录。以下摘录设定每个应用程序的部署目录的用户、组和路径。

```
node[:deploy].each do |application, deploy|
  opsworks_deploy_dir do
    user deploy[:user]
    group deploy[:group]
    path deploy[:deploy_to]
  end
  ...
end
```

有关堆栈配置和部署属性的更多信息，请参阅[自定义堆栈 OpsWorks](customizing.md)。有关部署目录的更多信息，请参阅[Deploy 配方](create-custom-deploy.md)。

Chef 11.4 堆栈不支持数据包，但您可以通过指定[自定义 JSON](workingstacks-json.md) 向堆栈配置和部署属性中添加任意数据。然后，您的配方可以使用标准 Chef 节点语法访问这些数据。有关更多信息，请参阅 [使用自定义 JSON](workingcookbook-json-override.md)。

如果您需要使用加密数据包的功能，一种方法是将敏感属性存储到安全的位置，如私有 Amazon S3 存储桶。然后，您的配方可以使用安装在所有 OpsWorks Stacks 实例上的 [AWS Ruby 软件开发工具包](https://aws.amazon.com/documentation/sdkforruby/)从存储桶下载数据。

**注意**  
每个 OpsWorks Stacks 实例都有一个实例配置文件。关联的[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/WorkingWithRoles.html)指定在实例上运行的应用程序可以访问哪些 AWS 资源。要使您的配方能够访问 Amazon S3 存储桶，该角色的策略必须包括类似以下内容的语句，这可授予从指定的存储桶检索文件的权限。  

```
"Action": ["s3:GetObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
```
有关实例配置文件的更多信息，请参阅[为在 EC2 实例上运行的应用程序指定权限](opsworks-security-appsrole.md)。