

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

# 透過覆寫屬性自訂 OpsWorks Stacks 組態
<a name="workingcookbook-attributes"></a>

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

**注意**  
對於 Windows 堆疊和 Chef 12 Linux 堆疊， OpsWorks Stacks 會針對內建配方和自訂配方使用個別的 Chef 執行。這表示您無法使用本節討論的技術覆寫 Windows 堆疊和 Chef 12 Linux 堆疊的內建屬性。

配方和範本取決於執行個體的各種 Chef 屬性，或堆疊限定的資訊 (例如 layer 組態或應用程式伺服器設定)。這些屬性有幾個來源：
+ **自訂 JSON** – 您可以在建立、更新或複製堆疊或部署應用程式時選擇性地指定自訂 JSON 屬性。
+ **堆疊組態屬性** –OpsWorks 堆疊會定義這些屬性以保留堆疊組態資訊，包括您透過主控台設定指定的資訊。
+ **部署屬性** – AWS OpsWorks 會定義部署事件的部署相關屬性。
+ **技術指南屬性** – 內建和自訂技術指南通常包含一或多個[屬性檔案](workingcookbook-installingcustom-components-attributes.md)，其中包含代表技術指南特定值的屬性，例如應用程式伺服器組態設定。
+ **Chef**–Chef 的 [Ohai 工具](http://docs.chef.io/resource_ohai.html)定義了代表各種系統組態設定的屬性，例如 CPU 類型和已安裝的記憶體。

如需堆疊組態、部署屬性和內建技術指南屬性的完整清單，請參閱[堆疊組態及部署屬性：Linux](attributes-json-linux.md) 和[內建技術指南屬性](attributes-recipes.md)。如需 Ohai 屬性的詳細資訊，請參閱 [Ohai](https://docs.chef.io/ohai.html)。

當部署或設定等[生命週期事件](workingcookbook-events.md)發生時，或是您執行像是 [ 或 ](workingstacks-commands.md) 等`execute_recipes`堆疊命令`update_packages`時， OpsWorks Stacks 會執行下列作業：
+ 將對應的命令傳送到每個受影響之執行個體的代理程式。

  代理程式會執行適當的配方。例如，針對部署事件，代理程式會執行內建的部署配方，其後跟隨任何自訂部署配方。
+ 將任何自訂 JSON 和部署屬性與堆疊組態屬性合併，然後在執行個體上安裝他們。

來自自訂 JSON、堆疊組態和部署屬性、技術指南屬性和 Ohai 屬性的屬性會合併成一個「*節點物件*」，該物件會將屬性值提供給配方。針對堆疊組態屬性，執行個體基本上是無狀態的，包含任何自訂 JSON。當您執行部署或堆疊命令時，關聯的配方會使用以命令下載的堆疊組態屬性。

**Topics**
+ [屬性優先順序](workingcookbook-attributes-precedence.md)
+ [使用自訂 JSON 覆寫屬性](workingcookbook-json-override.md)
+ [使用自訂技術指南屬性覆寫 OpsWorks Stacks 屬性](workingcookbook-cookbook-attributes.md)

# 屬性優先順序
<a name="workingcookbook-attributes-precedence"></a>

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

若屬性的定義是唯一的，Chef 會直接將其併入節點物件。但是，任何屬性來源都可以定義任何屬性，因此相同的屬性可能會有值不同的多個定義。例如，內建的 `apache2` 技術指南定義了 `node[:apache][:keepalive]`，但您也可以在自訂 JSON 或自訂技術指南中定義該屬性。若屬性具有多個定義，他們會按照稍後說明的順序進行評估，並且節點物件會接收到具有最高優先順序的定義。

一個屬性定義如下：

```
node.type[:attribute][:sub_attribute][:...]=value
```

如果屬性有多個定義， 類型會決定哪個定義具有優先順序，且該定義會併入節點物件中。 OpsWorks Stacks 會使用下列屬性類型：
+ **default** – 這是最常見的類型，基本上表示「如果尚未定義屬性，請使用此值」。若所有屬性的定義皆為 `default` 類型，評估順序中的第一個定義便具有優先順序，其餘值則會遭到忽略。請注意， Stacks OpsWorks 會將所有堆疊組態和部署屬性定義設定為 `default`類型。
+ 具有此類型的 **normal**–Attributes 會覆寫先前在評估順序中定義的任何 `default`或 `normal` 屬性。例如，若第一個屬性是來自內建的技術指南，並且具有 `default` 類型，而第二個則是具有 `normal` 類型的使用者定義屬性，則第二個定義便具有優先順序。
+ **set** – 這是您在舊版技術指南中可能看到的已棄用類型。它已由具有相同優先順序的 `normal` 取代。

Chef 支援數種額外的屬性類型，包含優先順序高於任何其他屬性定義的 `automatic` 類型。由 Chef 的 Ohai 工具產生的屬性定義全部皆為 `automatic` 類型，因此他們基本上等同於唯讀。這通常不是問題，因為沒有理由覆寫它們，而且它們與 OpsWorks Stacks 的屬性不同。不過，建議您小心地為自訂技術指南屬性命名，使其與 Ohai 屬性相異。如需詳細資訊，請參閱[關於屬性](http://docs.chef.io/attributes.html)。

**注意**  
Ohai 工具為您可以從命令列執行的可執行檔。若要列出執行個體的 Ohai 屬性，請登入執行個體並在終端機視窗中執行 `ohai`。請注意，它會產生非常長的輸出。

以下為將各種屬性定義併入節點物件的步驟：

1. 將任何自訂堆疊組態屬性併入堆疊組態和部署屬性。

   您可為堆疊或特定部署設定自訂 JSON 屬性。他們會位於評估的第一優先順序，基本上等同於 `normal` 類型。若一或多個堆疊組態屬性也在自訂 JSON 中定義，則自訂 JSON 的值會具有優先順序。否則 OpsWorks Stacks 會直接將自訂 JSON 屬性併入堆疊組態。

1. 將任何部署自訂 JSON 屬性併入堆疊組態和部署屬性。

   部署自訂 JSON 屬性也等同於 `normal` 類型，因此他們會優先於內建和自訂堆疊組態 JSON 及內建部署 JSON。

1. 將堆疊組態和部署屬性合併成執行個體的節點物件。

1. 將執行個體的內建技術指南屬性合併成節點物件。

   內建技術指南屬性全部皆為 `default` 類型。如果堆疊組態和部署屬性中也定義了一或多個內建技術指南屬性，通常是因為您使用自訂 JSON 定義它們，則堆疊組態定義優先於內建技術指南定義。所有其他內建技術指南屬性也會直接併入節點物件。

1. 將執行個體的自訂技術指南屬性合併成節點物件。

   自訂技術指南屬性通常不是 `normal` 就是 `default` 類型。唯一屬性會併入節點物件。如果步驟 1–3 中也定義了任何自訂技術指南屬性 （通常是因為您使用自訂 JSON 定義了它們），則優先順序取決於自訂技術指南屬性的類型：
   + 步驟 1-3 中定義的屬性優先於自訂技術指南`default`屬性。
   + 自訂 c ookbook `normal` 屬性優先於步驟 1–3 的定義。

**重要**  
請勿使用自訂技術指南的 `default` 屬性覆寫堆疊組態或內建技術指南屬性。由於自訂技術指南屬性會在最後評估，`default` 屬性具有最低的優先順序，因此無法覆寫任何內容。

# 使用自訂 JSON 覆寫屬性
<a name="workingcookbook-json-override"></a>

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

**注意**  
由於 OpsWorks Stacks 處理 Chef 的執行方式與 Linux 堆疊不同，因此您無法針對 Windows 堆疊使用本節中討論的技術。

覆寫 OpsWorks Stacks 屬性的最簡單方法是在自訂 JSON 中定義它，其優先順序高於堆疊組態和部署屬性，以及內建和自訂技術指南`default`屬性。如需詳細資訊，請參閱[屬性優先順序](workingcookbook-attributes-precedence.md)。

**重要**  
建議您小心覆寫堆疊組態和部署屬性。例如：覆寫 `opsworks` 命名空間中的屬性可能會影響內建配方。如需詳細資訊，請參閱[堆疊組態及部署屬性](workingcookbook-json.md)。

您也可以使用自訂 JSON 定義唯一屬性，通常是將資料傳遞到您的自訂配方。屬性會直接併入節點物件，並且配方可以透過使用標準 Chef 節點語法參考他們。

## 如何指定自訂 JSON
<a name="workingcookbook-json-override-specify"></a>

若要使用自訂 JSON 覆寫屬性值，您必須先判斷屬性的完整屬性名稱。您接著會建立包含您希望覆寫之屬性的 JSON 物件，將其設為您喜好的值。為了方便起見，[堆疊組態及部署屬性：Linux](attributes-json-linux.md) 和[內建技術指南屬性](attributes-recipes.md)文件常會使用堆疊組態、部署和內建技術指南屬性，包含其完整名稱。

物件的父系和子系關聯必須對應到適當的完整 Chef 節點。例如，假設您希望變更以下 Apache 屬性：
+ 節點為 [ 並且預設值為 `keepalivetimeout` 的 ](attributes-recipes-apache.md#attributes-recipes-apache-keep-timeout)`node[:apache][:keepalivetimeout]``3` 屬性。
+ 節點為 `logrotate` 並且預設值為 [ 的 `schedule`](attributes-recipes-apache.md#attributes-recipes-apache-log-schedule)`node[:apache][:logrotate][:schedule]``"daily"` 屬性。

若要覆寫屬性並將值分別設為 `5` 和 `"weekly"`，您會使用下列自訂 JSON：

```
{
  "apache" : {
    "keepalivetimeout" : 5,
    "logrotate" : {
       "schedule" : "weekly"
    }
  }
}
```

## 何時指定自訂 JSON
<a name="workingcookbook-json-override-when"></a>

您可以為下列任務指定自訂 JSON：
+ [建立新的堆疊](workingstacks-creating.md)
+ [更新堆疊](workingstacks-edit.md)
+ [執行堆疊命令](workingstacks-edit.md)
+ [複製堆疊](workingstacks-cloning.md)
+ [部署應用程式](workingapps-deploying.md)

對於每個任務， OpsWorks Stacks 會將自訂 JSON 屬性與堆疊組態和部署屬性合併，並將其傳送至執行個體，以合併至節點物件。但是，請注意以下內容：
+ 若您在建立、複製或更新堆疊時指定自訂 JSON，針對後續生命週期事件和堆疊命令，屬性會合併至堆疊組態和部署屬性。
+ 若您為部署指定自訂 JSON，屬性只會針對對應的事件合併至堆疊組態和部署屬性。

  若您希望針對後續部署使用那些自訂屬性，您必須再次明確指定自訂 JSON。

請務必記得，屬性只有在由配方使用時才會影響執行個體。若您覆寫屬性值，但是沒有任何後續的配方參考該屬性，則變更便不具有效果。您必須確保在關聯配方執行前傳送自訂 JSON，或是重新執行適當的配方。

## 自訂 JSON 最佳實務
<a name="workingcookbook-json-override-best"></a>

您可以使用自訂 JSON 覆寫任何 OpsWorks Stacks 屬性，但手動輸入資訊有些麻煩，而且不在任何來源控制下。自訂 JSON 最適合用於以下目的：
+ 當您希望覆寫少量的屬性，並且不需要使用自訂技術指南時。

  透過自訂 JSON，您可以免於僅為了覆寫幾個屬性而設定及維護技術指南儲存庫的額外負荷。
+ 敏感性值，例如密碼或身分驗證金鑰。

  技術指南屬性存放於儲存庫中，因此任何敏感性資訊都會暴露在洩漏的風險中。相反的，請使用 dummy 值定義屬性，並使用自訂 JSON 設定真正的值。
+ 值應不同。

  例如，建議的實務是使用獨立的開發和預備堆疊支援您的生產堆疊。假設這些堆疊支援接受付款的應用程式。若您使用自訂 JSON 指定付款端點，您可以為您的預備堆疊指定測試 URL。當您準備好將更新後的堆疊遷移至您的生產堆疊時，您可以使用相同的技術指南，並使用自訂 JSON 將付款端點設為生產 URL。
+ 特定堆疊或部署命令專屬的值。

# 使用自訂技術指南屬性覆寫 OpsWorks Stacks 屬性
<a name="workingcookbook-cookbook-attributes"></a>

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

**注意**  
對於 Windows 堆疊， OpsWorks Stacks 會針對內建配方和自訂配方使用個別的 Chef 執行。這表示您無法使用本節討論的技術覆寫 Windows 堆疊的內建屬性。

自訂 JSON 是覆寫 OpsWorks Stacks 堆疊組態和內建技術指南屬性的便利方式，但有一些限制。特別是您必須為每一次的使用手動輸入自訂 JSON，因此您可用來管理定義的強固方法。較佳的方法通常是使用自訂技術指南屬性檔案覆寫內建的屬性。這樣做可讓您將定義置放在來源控制之下。

使用自訂屬性檔案覆寫 OpsWorks Stacks 定義的程序非常簡單。

**覆寫 OpsWorks Stacks 屬性定義**

1. 設定技術指南儲存庫，如[技術指南和配方](workingcookbook.md)中所述。

1. 使用與內建技術指南相同的名稱建立技術指南，其中包含您希望覆寫的屬性。例如，若要覆寫 Apache 屬性，技術指南的名稱應為 apache2。

1. 將一個 `attributes` 資料夾新增至技術指南，並在該資料夾中新增一個名為 `customize.rb` 的檔案。

1. 針對每一個內建技術指南中您希望覆寫的屬性，將屬性定義新增至檔案，並設為您喜好的值。屬性必須是 `normal` 類型或更高版本，並且與對應的 OpsWorks Stacks 屬性具有完全相同的節點名稱。如需 OpsWorks Stacks 屬性的詳細清單，包括節點名稱，請參閱 [堆疊組態及部署屬性：Linux](attributes-json-linux.md)和 [內建技術指南屬性](attributes-recipes.md)。如需屬性和屬性檔案的詳細資訊，請參閱[關於屬性檔案](http://docs.chef.io/attributes.html)。
**重要**  
您的屬性必須是`normal`類型才能覆寫 OpsWorks Stacks 屬性；`default`類型沒有優先順序。例如，若您的 `customize.rb` 檔案包含 `default[:apache][:keepalivetimeout] = 5` 屬性定義，內建 `apache.rb` 屬性檔案中的對應屬性會先受到評估，並取得優先順序。如需詳細資訊，請參閱[覆寫屬性](workingcookbook-attributes.md)。

1. 為每個內建技術指南重複步驟 2 – 4，其中包含您要覆寫的屬性。

1. 為您的堆疊啟用自訂技術指南，並提供 Stacks OpsWorks 將技術指南下載至堆疊執行個體所需的資訊。如需詳細資訊，請參閱[安裝自訂技術指南](workingcookbook-installingcustom-enable.md)。

**注意**  
如需此程序的完整演練，請參閱[覆寫內建屬性](cookbooks-101-opsworks-attributes.md)。

後續生命週期事件、部署命令和堆疊命令所使用的節點物件現在將包含您的屬性定義，而不是 OpsWorks Stacks 值。

例如，若要覆寫`keepalivetimeout` 中討論的內建 Apache `logrotate schedule` 和 [如何指定自訂 JSON](workingcookbook-json-override.md#workingcookbook-json-override-specify) 設定，請將 `apache2` 技術指南新增至您的儲存庫，然後將 `customize.rb` 檔案新增至技術指南的 `attributes` 資料夾，並帶有以下內容。

```
normal[:apache][:keepalivetimeout] = 5
normal[:apache][:logrotate][:schedule] = 'weekly'
```

**重要**  
您不應透過修改相關聯的內建屬性檔案複本來覆寫 OpsWorks Stacks 屬性。假設您將 `apache.rb` 複製到您的 `apache2/attributes` 資料夾並修改其部分設定，您基本上便已覆寫內建檔案中的每個屬性。配方會使用您複本中的屬性定義，並忽略內建檔案。若 OpsWorks Stacks 稍後修改了內建屬性檔案，配方將無法存取變更，除非您手動更新您的複本。  
為避免這種情況，所有內建的技術指南都包含一個空白的 `customize.rb` 屬性檔案，為所有透過 `include_attribute` 指示詞之模組的必要項目。透過覆寫您 `customize.rb` 複本中的屬性，您只會影響那些特定的屬性。配方會從內建屬性檔案取得任何其他的屬性值，並自動取得任何您未覆寫之屬性的目前值。  
這種方法可協助您將您技術指南儲存庫中的屬性維持在較小的數目，減少您的維護額外負荷，並使未來的升級更容易管理。