實作 Chef 11.10 堆疊的配方 - AWS OpsWorks

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

實作 Chef 11.10 堆疊的配方

重要

AWS OpsWorks Stacks不再接受新客戶。現有客戶可以正常使用 OpsWorks 主控台、API、CLI 和 CloudFormation 資源,直到 2024 年 5 月 26 日為止,屆時他們將停止使用。為了為此轉換做好準備,我們建議您AWS Systems Manager盡快將堆疊轉換為。如需詳細資訊,請參閱 AWS OpsWorks Stacks壽命終止常見問題將應用程式移轉至AWS OpsWorks Stacks應用AWS Systems Manager程式管

Chef 11.10 堆疊與 Chef 11.4 堆疊相比有下列優點:

  • Chef 執行使用 Ruby 2.0.0,因此您的配方可以使用新的 Ruby 語法。

  • 配方可以使用 Chef search 和資料包。

    Chef 11.10 堆疊可以使用許多社群技術指南,而無須修改。

  • 您可以使用 Berkshelf 來管理技術指南。

    Berkshelf 提供更多更靈活的方式來管理您的自訂技術指南,以及在堆疊中使用社群技術指南。

  • 技術指南必須在 metadata.rb 中宣告依存項目。

    若您的技術指南依存於其他技術指南,您必須在您技術指南的 metadata.rb 檔案中包含該依存項目。例如,若您的技術指南包含具有如 include_recipe anothercookbook::somerecipe 陳述式的配方,則您技術指南的 metadata.rb 檔案就必須包含下列內容:depends "anothercookbook"

  • AWS OpsWorks只有當堆棧包含 MySQL 層時,堆棧才會在堆棧的實例上安裝 MySQL 客戶端。

  • AWS OpsWorks只有當堆棧包含神經節層時,堆棧才會在堆棧的實例上安裝神經節客戶端。

  • 若部署執行 bundle install 但安裝失敗,部署也會失敗。

重要

請勿針對自訂或社群技術指南重複使用內建技術指南的名稱。和內建技術指南具有相同名稱的自訂技術指南可能會失敗。有關 Chef 11.10,11.4 和 0.9 堆棧可用的內置食譜的完整列表,請參閱上的操作食譜庫。 GitHub

帶有非 ASCII 字元並在 Chef 0.9 和 11.4 堆疊上可成功執行的技術指南,在 Chef 11.10 堆疊上可能會失敗。原因是 Chef 11.10 堆疊會針對 Chef run 使用 Ruby 2.0.0,該版本比 Ruby 1.8.7 具有更嚴格的編碼規範。為了確保這類技術指南能在 Chef 11.10 堆疊上成功執行,每個使用非 ASCII 字元的檔案都應在其頂端具備註解,提供關於編碼的提示。例如,針對 UTF-8 編碼,註解應為 # encoding: UTF-8。如需 Ruby 2.0.0 編碼的詳細資訊,請參閱 Encoding

技術指南安裝與優先順序

Chef 11.10 堆疊安裝 AWS OpsWorks Stacks 技術指南的程序與先前版本的 Chef 有些不同。針對 Chef 11.10 堆疊,在 AWS OpsWorks Stacks 安裝內建、自訂和 Berkshelf 技術指南後,它會根據下列順序,將他們合併到一個共用的目錄:

  1. 內建技術指南。

  2. Berkshelf 技術指南 (若有的話)。

  3. 自訂技術指南 (若有的話)。

當 AWS OpsWorks Stacks 執行此合併時,它會複製整個目錄的內容 (包含配方)。若有任何重複項目,則會套用下列規則:

  • Berkshelf 技術指南的內容會優先於內建技術指南。

  • 自訂技術指南的內容會優先於 Berkshelf 技術指南。

為了示範此程序運作的方式,請考慮以下案例,其中三個技術指南目錄都包含名為 mycookbook 的技術指南:

  • 內建食譜 — mycookbook 包含名為的屬性檔案someattributes.rb、名為的範本檔案sometemplate.erb,以及名為somerecipe.rb的食譜。

  • 伯克架食譜-mycookbook 包括和。sometemplate.erb somerecipe.rb

  • 自定義食譜-mycookbook 包括somerecipe.rb

合併的技術指南包含以下內容:

  • 來自內建技術指南的 someattributes.rb

  • 來自 Berkshelf 技術指南的 sometemplate.erb

  • 來自自訂技術指南的 somerecipe.rb

重要

建議您不要透過將整個內建技術指南複製到您的儲存庫,然後修改技術指南的一部分,來自訂您的 Chef 11.10 堆疊。這樣做會覆寫整個內建技術指南 (包含配方)。若 AWS OpsWorks Stacks 更新該技術指南,您的堆疊將無法享有那些更新,除非您手動更新您的私有複本。如需如何自訂堆疊的詳細資訊,請參閱自訂 AWS OpsWorks Stacks

您可以在您的配方中使用 Chef search 方法來查詢堆疊資料。您會使用與您在使用 Chef 伺服器時相同的語法,但 AWS OpsWorks Stacks 會從本機節點物件取得資料,而非查詢 Chef 伺服器。此資料包括:

  • 執行個體的堆疊組態及部署屬性

  • 執行個體的內建和自訂技術指南之屬性檔案的屬性。

  • 由 Ohai 收集的系統資料。

堆疊組態和部署屬性包含方法通常透過搜尋取得的大部分資訊,包括堆疊中每個線上執行個體的主機名稱和 IP 位址等資料。 AWS OpsWorks堆疊會更新每個生命週期事件的這些屬性,以確保它們能準確反映目前的堆疊狀態。這表示您通常可以在您的堆疊中使用搜尋依存的社群配方,而無須修改。search 方法仍然會傳回適當的資料,只是該資料會來自堆疊組態及部署屬性,而非伺服器。

AWS OpsWorks Stacks search 的主要限制為它僅會處理本機節點物件中的資料,尤其是堆疊組態及部署屬性。因此,下列資料類型可能無法透過 search 取得:

  • 在其他執行個體上的本機定義屬性。

    若配方在本機定義屬性,該資訊將不會報告回 AWS OpsWorks Stacks 服務,因此您無法透過使用 search 從其他執行個體存取該資料。

  • 自訂 deploy 屬性。

    您可以在您部署應用程式時指定自訂 JSON,對應的屬性即會為該部署安裝在堆疊的執行個體上。但是,若您僅部署到選取的執行個體,屬性也會在那些執行個體上安裝。在所有其他執行個體上查詢那些自訂 JSON 屬性都會失敗。此外,自訂屬性也僅會包含在該特定部署的堆疊組態和部署 JSON 中。您僅能在下一次生命週期事件安裝新的一組堆疊組態及部署屬性之前存取他們。請注意,若您指定堆疊的自訂 JSON,屬性便會針對每個生命週期事件於每個執行個體上安裝,並且永遠可透過 search 進行存取。

  • 來自其他執行個體的 Ohai 資料。

    Chef 的 Ohai 工具會取得執行個體上的各種系統資料,並新增到節點物件。這項資料會存放於本機,而不會報告回 AWS OpsWorks Stacks 服務,因此 search 無法從其他執行個體存取 Ohai 資料。但是,這項資料的其中一部分可能會包含在堆疊組態及部署屬性中。

  • 離線執行個體。

    堆疊組態及部署屬性只包含線上執行個體的資料。

下列配方摘要會示範如何使用 search 取得 PHP layer 執行個體的私有 IP 地址。

appserver = search(:node, "role:php-app").first Chef::Log.info("The private IP is '#{appserver[:private_ip]}'")
注意

當 AWS OpsWorks Stacks 將堆疊組態及部署屬性新增至節點物件時,它其實會建立兩組 layer 屬性,每一組都包含相同的資料。其中一組位於 layers 命名空間,即 AWS OpsWorks Stacks 存放資料的方式。另一組則位於 role 命名空間,即 Chef 伺服器存放對等資料的方式。role 命名空間的用途是允許為 Chef 伺服器實作的 search 程式碼在 AWS OpsWorks Stacks 執行個體上執行。若您要為 AWS OpsWorks Stacks 撰寫特定程式碼,您可以使用先前範例中的 layers:php-approle:php-appsearch 即會傳回相同的結果。

使用資料包

您可以在您的配方中使用 Chef data_bag_item 方法來查詢資料包中的資訊。您會使用與您在使用 Chef 伺服器時相同的語法,但 AWS OpsWorks Stacks 會從執行個體的堆疊組態及部署屬性取得資料。但是,AWS OpsWorks Stacks 目前不支援 Chef 環境,因此 node.chef_environment 一律都會傳回 _default

您會透過使用自訂 JSON 建立資料包,來將一或多個屬性新增至 [:opsworks][:data_bags] 屬性。以下範例示範在自訂 JSON 中建立資料包的一般格式。

注意

您無法透過將其新增至您的技術指南儲存庫,來建立資料包。您必須使用自訂 JSON。

{ "opsworks": { "data_bags": { "bag_name1": { "item_name1: { "key1" : “value1”, "key2" : “value2”, ... } }, "bag_name2": { "item_name1": { "key1" : “value1”, "key2" : “value2”, ... } }, ... } } }

您通常會指定堆疊的自訂 JSON,針對每個接下來的生命週期事件,於每個執行個體上安裝自訂屬性。您也可以在您部署應用程式時指定自訂 JSON,但那些屬性只會針對該部署進行安裝,並且可能只會安裝到選取的執行個體。如需詳細資訊,請參閱部署應用程式

下列自訂 JSON 範例會建立名為 myapp 的資料包。其中有一個項目 (mysql),以及兩個鍵/值對。

{ "opsworks": { "data_bags": { "myapp": { "mysql": { "username": "default-user", "password": "default-pass" } } } } }

若要在您的配方中使用資料,您可以呼叫 data_bag_item 並將資料包和值名稱傳遞給它,如下列摘要所示。

mything = data_bag_item("myapp", "mysql") Chef::Log.info("The username is '#{mything['username']}' ")

若要修改資料包中的資料,您只需修改自訂 JSON,它便會針對下一次的生命週期事件安裝在堆疊的執行個體上。

使用 Berkshelf

在 Chef 0.9 和 Chef 11.4 堆疊中,您只能安裝一個自訂技術指南儲存庫。在 Chef 11.10 堆疊中,您可以使用 Berkshelf 來管理您的技術指南和其依存項目,讓您可以從多個儲存庫安裝技術指南。(如需詳細資訊,請參閱「本機封裝技術指南依存性」。) 尤其是,透過 Berkshelf,您可以直接從儲存庫安裝與 AWS OpsWorks Stacks 相容的社群技術指南,而無須將他們從儲存庫複製到您的自訂技術指南儲存庫。支援的 Berkshelf 版本取決於作業系統。如需詳細資訊,請參閱AWS OpsWorks堆疊作業系統

若要使用 Berkshelf,您必須明確啟用它,如安裝自訂技術指南中所說明。然後,在您的技術指南儲存庫根目錄中包含一個 Berksfile 檔案,指定要安裝的技術指南。

若要在 Berksfile 中指定外部技術指南來源,請在檔案的頂端包含一個來源屬性,指定預設儲存庫 URL。Berkshelf 會在來源 URL 中尋找技術指南,除非您明確指定儲存庫。然後,在每個您希望安裝的技術指南中包含一行文字,格式如下:

cookbook 'cookbook_name', ['>= cookbook_version'], [cookbook_options]

cookbook 之後的欄位會指定特定技術指南。

  • 食譜名稱 — (必要) 指定食譜的名稱。

    若您沒有包含任何其他欄位,Berkshelf 會從指定來源 URL 安裝技術指南。

  • 烹飪書版本 — (選擇性) 指定食譜版本或版本。

    您可以使用像是 =>= 等前綴,來指定特定版本或可接受的版本範圍。若您並未指定版本,Berkshelf 會安裝最新的版本。

  • cookbook_options — (選擇性) 最後一個欄位是雜湊,其中包含一或多個索引鍵值配對,可指定選項 (例如存放庫位置)。

    例如,您可以包含一個 git 鍵,指定特定的 Git 儲存庫,以及一個 tag 鍵,指定特定的儲存庫分支。指定儲存庫分支通常是確保安裝您偏好之技術指南的最佳方式。

重要

請不要透過在您的 Berksfile 中包含 metadata 並在 metadata.rb 中宣告技術指南依存項目,來宣告技術指南。若要使其正常執行,兩個檔案都必須位於相同的目錄中。使用 AWS OpsWorks Stacks,Berksfile 必須位於儲存庫的根目錄中,但 metadata.rb 檔案則必須位於其個別的技術指南目錄中。您應改為在 Berksfile 中明確宣告外部技術指南。

以下為 Berksfile 的範例,示範指定技術指南的不同方式。如需如何建立 Berksfile 的詳細資訊,請參閱 Berkshelf

source "https://supermarket.chef.io" cookbook 'apt' cookbook 'bluepill', '>= 2.3.1' cookbook 'ark', git: 'git://github.com/opscode-cookbooks/ark.git' cookbook 'build-essential', '>= 1.4.2', git: 'git://github.com/opscode-cookbooks/build-essential.git', tag: 'v1.4.2'

此檔案會安裝以下技術指南:

  • 來自社群技術指南儲存庫的最新版本 apt

  • 來自社群技術指南的最新版本 bluepill (只要其版本為 2.3.1 或更新版本)。

  • 來自指定儲存庫的最新版本 ark

    此範例的 URL 適用於上的公開社群食譜儲存庫 GitHub,但您可以從其他儲存庫 (包括私人儲存庫) 安裝食譜。如需詳細資訊,請參閱 Berkshelf

  • 來自指定儲存庫 v1.4.2 分支的 build-essential 技術指南。

除了 Berksfile,自訂技術指南儲存庫可以包含自訂技術指南。在此情況下,AWS OpsWorks Stacks 會安裝兩組技術指南,表示執行個體最多可以擁有三個技術指南儲存庫。

  • 內建的技術指南會安裝到 /opt/aws/opsworks/current/cookbooks

  • 或您的自訂技術指南儲存庫包含技術指南,他們會安裝到 /opt/aws/opsworks/current/site-cookbooks

  • 若您已啟用 Berkshelf,且您的自訂技術指南儲存庫包含 Berksfile,指定的技術指南便會安裝到 /opt/aws/opsworks/current/berkshelf-cookbooks

內建食譜和您的自訂食譜會在設定期間安裝在每個執行個體上,而且除非您手動執行「更新自訂 Cookbooks」堆疊命令,否則不會隨後更新。 AWS OpsWorks堆疊會berks install針對每個 Chef 執行執行執行,因此會根據下列規則,針對每個生命週期事件更新您的 Berkshelf 食譜:

  • 若您在儲存庫中有新的技術指南版本,此操作會從儲存庫更新技術指南。

  • 否則,此操作會從本機快取更新 Berkshelf 技術指南。

注意

操作會覆寫 Berkshelf 技術指南,因此若您已修改任何技術指南的本機複本,變更將會遭到覆寫。如需詳細資訊,請參閱 Berkshelf

您也可以透過執行更新自訂技術指南堆疊命令來更新您的 Berkshelf 技術指南,該命令會同時更新 Berkshelf 技術指南和您的自訂技術指南。