AWS OpsWorks 堆疊資料袋參考 - AWS OpsWorks

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

AWS OpsWorks 堆疊資料袋參考

重要

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

AWS OpsWorks 堆棧將各種各樣的設置暴露在食譜中作為廚師數據包內容。此參考清單列出資料包的內容。

「資料包」是一種 Chef 概念。資料包為以 JSON 資料存放在執行個體上的全域變數。JSON 資料可從 Chef 進行存取。例如,資料包可以儲存全域變數,例如應用程式的來源 URL、執行個體的主機名稱以及關聯堆疊的 VPC 識別碼。 AWS OpsWorks 堆棧將其數據包存儲在每個堆棧的實例中。在 Linux 執行個體上, AWS OpsWorks 堆疊會將資料包儲存在/var/chef/runs/run-ID/data_bags目錄中。在 Windows 執行個體上,它會將資料包存放在 drive:\chef\runs\run-id\data_bags 目錄中。在這兩種情況下,Run-ID 都是 AWS OpsWorks Stacks 指派給執行個體上每個 Chef 執行的唯一 ID。這些目錄包含一組資料包 (子目錄)。每個資料包都包含零或多個資料包項目,即包含資料包內容組的 JSON 格式檔案。

注意

AWS OpsWorks 堆疊不支援加密資料袋。若要以加密形式存放機密資料 (例如密碼或憑證),建議您將它存放在私有 S3 儲存貯體中。然後,您可以建立自訂配方,定義其使用適用於 Ruby 的 Amazon 開發套件擷取資料。如需範例,請參閱使用適用於 Ruby 的 SDK

資料包內容可包含下列任何項目:

  • 字串內容遵循標準 Ruby 語法,可使用單引號或雙引號,雖然包含特定特殊字元的字串必須使用雙引號。如需詳細資訊,請前往 Ruby 文件網站。

  • 布林值內容,為 truefalse (無引號)。

  • 數字內容,為整數或小數,例如 42.5 (無引號)。

  • 清單內容,其格式為以中括弧圍起的逗點分隔值 (無引號),例如 [ '80', '443' ]

  • JSON 物件,包含額外的資料包內容,例如 "my-app": {"elastic_ip": null,...}

Chef 配方可透過 Chef 搜尋或直接存取資料包、資料包項目,以及資料包內容。下列內容說明如何使用兩種存取方式 (雖然 Chef 搜尋為偏好選項)。

要通過 Chef 搜索訪問數據包,請使用搜索方法,指定所需的搜索索引。 AWS OpsWorks 堆疊提供下列搜尋索引:

在您了解搜尋索引名稱之後,您便可以存取該搜尋索引的資料包內容。例如,下列配方程式碼使用 aws_opsworks_app 搜尋索引取得 aws_opsworks_app 資料包 (aws_opsworks_app 目錄) 中第一個資料包項目 (第一個 JSON 檔案) 的內容。然後,程式碼將兩個訊息寫入 Chef 日誌,一個有應用程式短名資料包內容 (JSON 檔案中的字串),另一個有應用程式來源 URL 資料包內容 (JSON 檔案中的另一個字串):

app = search("aws_opsworks_app").first Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********") Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")

其中 ['shortname']['app_source']['url'] 指定對應 JSON 檔案中的下列資料包內容:

{ ... "shortname": "mylinuxdemoapp", ... "app_source": { ... "url": "https://s3.amazonaws.com/opsworks-demo-assets/opsworks-linux-demo-nodejs.tar.gz", }, ... }

如需您可以搜尋的資料包內容清單,請參閱本節中的參考主題。

您也可以逐一查看資料包中的一組資料包項目。例如,下列配方程式碼 (與先前範例相似) 會在有超過一個資料包項目時,逐一查看資料包中的每個資料包項目。

search("aws_opsworks_app").each do |app| Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********") Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********") end

若您知道特定資料包內容存在,您可以使用下列語法尋找對應的資料包項目:

search("search_index", "key:value").first

例如,下列配方程式碼使用 aws_opsworks_app 搜尋索引尋找包含應用程式短名 mylinuxdemoapp 的資料包項目。程式碼接著會使用資料包項目的內容將對應應用程式短名和來源 URL 寫入 Chef 日誌:

app = search("aws_opsworks_app", "shortname:mylinuxdemoapp").first Chef::Log.info("********** For the app with the short name '#{app['shortname']}', the app's URL is '#{app['app_source']['url']}' **********")

僅適用於 aws_opsworks_instance 搜尋索引,您可以指定 self:true 代表正在執行配方的執行個體。下列方案程式碼會使用對應的資料包項目的內容,將訊息寫入 Chef 記錄檔,其中包含對應執行個體的 AWS OpsWorks 堆疊產生 ID 和作業系統:

instance = search("aws_opsworks_instance", "self:true").first Chef::Log.info("********** For instance '#{instance['instance_id']}', the instance's operating system is '#{instance['os']}' **********")

除了使用 Chef 搜尋存取資料包、資料包項目和資料包內容之外,您也可以直接存取他們。若要執行此作業,請使用 data_bagdata_bag_item 方法分別存取資料包和資料包項目。例如,下列配方程式碼會執行與先前範例一模一樣的動作,但是它會直接存取單一資料包項目,並會在超過一個的時候存取多個資料包項目:

# Syntax: data_bag_item("the data bag name", "the file name in the data bag without the file extension") app = data_bag_item("aws_opsworks_app", "mylinuxdemoapp") Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********") Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********") data_bag("aws_opsworks_app").each do |data_bag_item| app = data_bag_item("aws_opsworks_app", data_bag_item) Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********") Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********") end

在這兩種方法中,我們建議您使用 Chef 搜尋。所有本指南中的相關範例都會示範此方法。