本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS OpsWorks 堆疊資料袋參考
重要
該 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請透過 AWS Re: post
AWS OpsWorks 堆棧將各種各樣的設置暴露在食譜中作為廚師數據包內容。此參考清單列出資料包的內容。
「資料包」是一種 Chef 概念。資料包為以 JSON 資料存放在執行個體上的全域變數。JSON 資料可從 Chef 進行存取。例如,資料包可以儲存全域變數,例如應用程式的來源 URL、執行個體的主機名稱以及關聯堆疊的 VPC 識別碼。 AWS OpsWorks 堆棧將其數據包存儲在每個堆棧的實例中。在 Linux 執行個體上, AWS OpsWorks 堆疊會將資料包儲存在/var/chef/runs/
目錄中。在 Windows 執行個體上,它會將資料包存放在 run-ID
/data_bags
目錄中。在這兩種情況下,drive
:\chef\runs\run-id
\data_bagsRun-ID
都是 AWS OpsWorks Stacks 指派給執行個體上每個 Chef 執行的唯一 ID。這些目錄包含一組資料包 (子目錄)。每個資料包都包含零或多個資料包項目,即包含資料包內容組的 JSON 格式檔案。
注意
AWS OpsWorks 堆疊不支援加密資料袋。若要以加密形式存放機密資料 (例如密碼或憑證),建議您將它存放在私有 S3 儲存貯體中。然後,您可以建立自訂配方,定義其使用適用於 Ruby 的 Amazon 開發套件
資料包內容可包含下列任何項目:
-
字串內容遵循標準 Ruby 語法,可使用單引號或雙引號,雖然包含特定特殊字元的字串必須使用雙引號。如需詳細資訊,請前往 Ruby
文件網站。 -
布林值內容,為
true
或false
(無引號)。 -
數字內容,為整數或小數,例如
4
或2.5
(無引號)。 -
清單內容,其格式為以中括弧圍起的逗點分隔值 (無引號),例如
[ '80', '443' ]
-
JSON 物件,包含額外的資料包內容,例如
"my-app": {"elastic_ip": null,...}
。
Chef 配方可透過 Chef 搜尋或直接存取資料包、資料包項目,以及資料包內容。下列內容說明如何使用兩種存取方式 (雖然 Chef 搜尋為偏好選項)。
要通過 Chef 搜索訪問數據包,請使用搜索
-
aws_opsworks_app,代表堆疊的一組部署應用程式。
-
aws_opsworks_command,代表在堆疊上執行的一組命令。
-
aws_opsworks_ecs_cluster,它代表一組用於堆疊的 Amazon Elastic Container Service (Amazon ECS) 叢集執行個體。
-
aws_opsworks_elastic_load_平衡器,代表堆疊的一組 Elastic Load Balancing 負載平衡器。
-
aws_opsworks_instance,代表堆疊的一組執行個體。
-
aws_opsworks_layer,代表堆疊的一組 layer。
-
aws_opsworks_rds_db_instance,代表一個堆疊的一組 Amazon Relational Database Service 服務 (Amazon RDS) 執行個體。
-
aws_opsworks_stack,代表堆疊。
-
aws_opsworks_user,代表堆疊的一組使用者。
在您了解搜尋索引名稱之後,您便可以存取該搜尋索引的資料包內容。例如,下列配方程式碼使用 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_bag
# 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 搜尋。所有本指南中的相關範例都會示範此方法。