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

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

實作 Chef 11.10 堆疊的配方

重要

所以此 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請聯絡 AWS Support 團隊上 AWS Re: 郵寄或透過 AWS 高級 Support

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 只有當堆疊包含「我的SQL層」時,Stacks 才會在堆疊的執行個體上安裝「我的SQL用戶端」。

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

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

重要

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

在 Chef 0.9 和 11.4 堆棧上成功運行的非ASCII字符的食譜可能會在 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

技術指南安裝與優先順序

安裝過程 AWS OpsWorks 與早期 Chef 版本相比,堆棧食譜對於 Chef 11.10 堆棧的工作方式有所不同。對於廚師 11.10 堆棧,之後 AWS OpsWorks Stacks 會安裝內建、自訂和 Berkshelf 食譜,它會依照下列順序將它們合併到通用目錄中:

  1. 內建技術指南。

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

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

當 AWS OpsWorks 堆棧執行此合併,它複製目錄的全部內容,包括配方。若有任何重複項目,則會套用下列規則:

  • 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 堆疊。這樣做會覆寫整個內建技術指南 (包含配方)。If AWS OpsWorks 堆棧更新該食譜,除非您手動更新私人副本,否則您的堆棧將無法獲得這些更新的好處。如需如何自訂堆疊的詳細資訊,請參閱自訂 AWS OpsWorks 堆疊

您可以在您的配方中使用 Chef search 方法來查詢堆疊資料。您使用與 Chef 服務器相同的語法,但是 AWS OpsWorks 堆棧從本地節點對象獲取數據,而不是查詢 Chef 服務器。此資料包括:

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

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

  • 由 Ohai 收集的系統資料。

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

的主要限制 AWS OpsWorks 堆棧搜索是只處理本地節點對象中的數據,特別是堆棧配置和部署屬性。因此,下列資料類型可能無法透過 search 取得:

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

    如果方案在本機定義屬性,則該資訊不會回報給 AWS OpsWorks 堆疊服務,因此您無法使用搜尋從其他執行個體存取該資料。

  • 自訂 deploy 屬性。

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

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

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

  • 離線執行個體。

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

下列方法摘錄說明如何使用搜尋取得PHP圖層執行個體的私有 IP 位址。

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

當 AWS OpsWorks 堆棧將堆棧配置和部署屬性添加到節點對象,它實際上創建了兩組層屬性,每個屬性都具有相同的數據。一個集合在layers命名空間中,這就是如何 AWS OpsWorks 堆棧存儲數據。另一組則位於 role 命名空間,即 Chef 伺服器存放對等資料的方式。role命名空間的目的是允許 Chef 服務器實現的搜索代碼在 AWS OpsWorks 堆棧實例。如果您正在專門編寫代碼 AWS OpsWorks 堆棧,您可以使用layers:php-approle:php-app在前面的例子中search,並返回相同的結果。

使用資料包

您可以在您的配方中使用 Chef data_bag_item 方法來查詢資料包中的資訊。您使用與 Chef 服務器相同的語法,但是 AWS OpsWorks 堆棧從實例的堆棧配置和部署屬性中獲取數據。然而, AWS OpsWorks 堆棧當前不支持 Chef 環境,因此node.chef_environment始終返回_default

您可以使用 custom 將一個或多個屬性新增JSON至屬性來建立資料袋。[:opsworks][:data_bags]下列範例顯示在 Custom 中建立資料包的一般格式JSON。

注意

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

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

通常,您可以JSON為堆疊指定 custom,該堆疊會在每個後續生命週期事件的每個例證上安裝自訂屬性。您也可以在部署應用程式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 來管理您的技術指南和其依存項目,讓您可以從多個儲存庫安裝技術指南。(如需詳細資訊,請參閱 本機封裝技術指南依存性。) 特別是,使用伯克架,您可以安裝 AWS OpsWorks 直接從其存儲庫中兼容堆棧的社區食譜,而不必將其複製到您的自定義食譜存儲庫中。支援的 Berkshelf 版本取決於作業系統。如需詳細資訊,請參閱AWS OpsWorks 堆疊作業系統

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

若要在 Berksfile 中指定外部食譜來源,請在指定預設儲存庫的檔案頂端加入 source 屬性。URLURLs除非您明確指定存儲庫,否則 Berkshelf 將在源代碼中查找食譜。然後,在每個您希望安裝的技術指南中包含一行文字,格式如下:

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

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

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

    如果您沒有包含任何其他欄位,Berkshelf 會從指定來源安裝食譜。URLs

  • cookbook_version — (選擇性) 指定食譜版本或版本。

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

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

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

重要

請不要透過在您的 Berksfile 中包含 metadata 並在 metadata.rb 中宣告技術指南依存項目,來宣告技術指南。若要使其正常執行,兩個檔案都必須位於相同的目錄中。同 AWS OpsWorks 堆棧中,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

內建技術指南及您的自訂技術指南會在設定時安裝在每個執行個體上,並且在之後不會更新,除非您手動執行更新自訂技術指南堆疊命令。 AWS OpsWorks 堆疊會berks install針對每個 Chef 執行執行執行,因此會根據下列規則,針對每個生命週期事件更新您的 Berkshelf 食譜:

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

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

注意

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

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