

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 實作 Chef 11.4 堆疊的配方
<a name="workingcookbook-chef11-4"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

**重要**  
請勿針對自訂或社群技術指南重複使用內建技術指南的名稱。和內建技術指南具有相同名稱的自訂技術指南可能會失敗。如需 Chef 11.10、11.4 和 0.9 堆疊可用內建技術指南的完整清單，請參閱 [GitHub 上的 opsworks-cookbooks 儲存庫](https://github.com/aws/opsworks-cookbooks)。

Chef 11.4 堆疊的主要限制為配方無法使用 Chef search 或資料包。不過， OpsWorks Stacks 會在每個執行個體上安裝[堆疊組態和部署屬性](workingcookbook-json.md)，其中包含您可以透過搜尋取得的大部分資訊，包括下列項目：
+ 來自主控台的使用者定義資料，例如主機或應用程式名稱。
+ Stacks OpsWorks 服務產生的堆疊組態資料，例如堆疊的 layer、應用程式和執行個體，以及 IP 地址等每個執行個體的詳細資訊。
+ 包含由使用者提供之資料的自訂 JSON 屬性，其用途與資料包幾乎相同。

OpsWorks Stacks 會在每個生命週期事件的每個執行個體上安裝目前版本的堆疊組態和部署屬性，然後再開始事件的 Chef 執行。資料會透過標準 `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 Stacks](customizing.md)。如需部署目錄的詳細資訊，請參閱[部署配方](create-custom-deploy.md)。

Chef 11.4 堆疊不支援資料包，但您可以透過指定[自訂 JSON](workingstacks-json.md)，將任意資料新增到堆疊組態及部署屬性。您的配方接著便能透過使用標準 Chef 節點語法來存取資料。如需詳細資訊，請參閱[使用自訂 JSON](workingcookbook-json-override.md)。

如果您需要加密資料包的功能，其中一個選項是將敏感屬性存放在安全的位置，例如私有 Amazon S3 儲存貯體。然後，您的配方可以使用安裝在所有 Stacks OpsWorks 執行個體上的 [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)。