短題外話:食譜,食譜和 AWS OpsWorks 堆疊屬性 - AWS OpsWorks

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

短題外話:食譜,食譜和 AWS OpsWorks 堆疊屬性

重要

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

您現在有應用程式和資料庫伺服器,但它們還不能使用。您仍然需要設定資料庫以及設定應用程式的連線設定。 AWS OpsWorks Stacks 不會自動處理這些任務,但它確實支持 Chef 食譜,食譜和動態屬性。您可以實現一對配方,一個用於設置數據庫,另一個用於配置應用程序的連接設置,並具有 AWS OpsWorks 堆棧為您運行它們。

包含必要配方的 phpapp 技術指南已實作可供使用,如果想要,您可以直接跳到步驟 3.3:將自定義食譜添加到 MyStack。如果想知道更多,本節會提供一些有關技術指南和配方的背景,說明配方的運作方式。若要查看技術指南本身,請參閱 phpapp 技術指南

配方和屬性

Chef 配方基本上是專門在執行個體上執行任務 (例如安裝套件、建立組態檔案、執行 shell 命令等等) 的 Ruby 應用程式。相關配方的群組會組織成「技術指南」,其也包含支援的檔案,例如建立組態檔案的範本。

AWS OpsWorks 堆疊有一組支援內建圖層的食譜。您也可以使用自己的配方建立自訂技術指南,在您的執行個體上執行自訂任務。本主題提供配方的簡介,並示範如何使用它們設定資料庫以及設定應用程式的連線設定。如需技術指南和配方的詳細資訊,請參閱技術指南和配方自訂 AWS OpsWorks 堆疊

配方通常取決於輸入資料的 Chef「屬性」

  • 這些屬性有部分由 Chef 定義,提供執行個體的基本資訊,例如作業系統。

  • AWS OpsWorks 堆疊會定義一組屬性,其中包含堆疊的相關資訊 (例如圖層設定) 以及已部署應用程式的相關資訊,例如應用程式儲存庫。

    您可以將自訂屬性指派給堆疊或部署,將自訂屬性新增JSON至此組合。

  • 您的技術指南也可以定義技術指南專用的屬性。

    phpapp 技術指南屬性在 attributes/default.rb 中定義。

有關的完整列表 AWS OpsWorks 堆疊屬性,請參閱堆疊組態及部署屬性:Linux內建技術指南屬性。如需詳細資訊,請參閱覆寫屬性

屬性以階層式結構組織,可以表示為JSON物件。

您使用 Chef 節點語法將此資料併入您的應用程式,如下所示:

[:deploy][:simplephpapp][:database][:username]

deploy 節點有單一應用程式節點 simplephpapp,其包含應用程式資料庫、Git 儲存庫等等的資訊。此範例呈現資料庫使用者名稱的值,解析成 root

設定資料庫

My SQL 層的內置安裝程序配方會自動為應用程序的簡短名稱命名的應用程序創建一個數據庫,因此在本示例中,您已經有了一個名為 simplephpapp 的數據庫。不過,您需要建立表格供應用程式存放其資料,以完成設定。您可以手動創建表,但更好的方法是實現一個自定義配方來處理任務,並具有 AWS OpsWorks 堆棧為您運行它。本節說明如何實作配方 dbsetup.rb。具有的程序 AWS OpsWorks 堆棧運行配方將在後面描述。

若要查看儲存庫中的配方,請前往 dbsetup.rb。以下範例顯示 dbsetup.rb 程式碼。

execute 是執行指定命令的「Chef 資源」。在這種情況下,它是創建一個表的 My SQL 命令。如果指定的表格已存在,not_if 指令會確保命令不會執行。如需 Chef 資源的詳細資訊,請參閱關於資源和提供者

配方使用先前討論過的節點語法,將屬性值插入命令字串。例如,以下內容會插入資料庫的使用者名稱。

#{deploy[:database][:username]}

讓我們解釋這個有點隱晦的程式碼:

  • 每次重複,deploy 都設為目前的應用程式節點,所以它會解析成 [:deploy][:app_name]。在此範例中,它解析成 [:deploy][:simplephpapp]

  • 使用先前顯示的部署屬性值,整個節點會解析成 root

  • 您用 #{ } 包裝節點,將它插入字串中。

其他大部分的節點也以類似方式解析。但 #{node[:phpapp][:dbtable]} 是例外,它是由自訂技術指南的屬性檔案所定義,解析成表格名稱 urler。因此,在 My 實SQL例上運行的實際命令是:

"/usr/bin/mysql -uroot -pvjud1hw5v8 simplephpapp -e'CREATE TABLE urler( id INT UNSIGNED NOT NULL AUTO_INCREMENT, author VARCHAR(63) NOT NULL, message TEXT, PRIMARY KEY (id))' "

此命令會使用來自部署屬性的登入資料和資料庫名稱,建立有 ID、作者和訊息欄位的表格,名為 urler

將應用程式連線到資料庫

第二塊拼圖是應用程式,它需要連線資訊,例如存取表格的資料庫密碼。S 有implePHPApp 效地只有一個工作文件,app.php; 一切都index.php是加載app.php

app.php 包含處理資料庫連線的 db-connect.php,但此檔案不在儲存庫中。您不能事先建立 db-connect.php,因為它會根據特定的執行個體定義資料庫。反之,appsetup.rb 配方使用來自部署屬性的連線資料產生 db-connect.php

若要查看儲存庫中的配方,請前往 appsetup.rb。以下範例顯示 appsetup.rb 程式碼。

就像dbsetup.rbappsetup.rb迭代deploy節點中的應用程序-只是簡單的一次-。它會執行有 script 資源和 template 資源的程式碼區塊。

script資源會安裝 Composer — PHP 應用程式的相依性管理員。然後執行 Composer 的 install 命令,將範例應用程式的相依性安裝到應用程式的根目錄。

template 資源會產生 db-connect.php,並將它放在 /srv/www/simplephpapp/current。注意下列事項:

  • 此配方使用條件式陳述式指定檔案擁有者,這取決於執行個體的作業系統。

  • only_if 指令通知 Chef 只在指定目錄存在時產生範本。

template 資源在基本上與相關聯檔案有相同的內容和結構,但包含各種資料值的預留位置的範本上操作。source 參數指定範本 db-connect.php.erb,它在 phpapp 技術指南的 templates/default 目錄中,包含下列內容:

當 Chef 處理範本時,它會以範本資源中的對應變數值取代 <%= => 預留位置,因此取自部署屬性。因此產生的檔案為: