如何通過 Chef 配方向 AWS OpsWorks 中的 Windows Server 2012 實例添加標籤?
我的雇主需要在 OpsWorks 中啟動的 AWS ec2 實例上線後為其添加標籤。
這些實例都是此堆棧中的 MS Windows Server 2012 R2 Base。目標是向堆棧 Foo 中啟動的實例和堆棧 Bar 中的“應用程序”:“bar”添加自定義標籤,如“application”:“foo”。
我找到了一個github repo chef-aws-tag,如果我在 Linux 上執行 Chef 11,我相信它會滿足我的需求。OpsWorks 僅適用於 Windows Server 2012,並且僅適用於 Chef 12.2。
當我將 github 儲存庫中的 chef-aws-tag 配方添加到 Setup 生命週期事件時,實例在“running_setup”處失敗,並帶有“setup_failed”。
Chef 失敗日誌隨後在 running_setup 階段報告此失敗:
INFO: HTTP Request Returned 412 Precondition Failed : No such cookbook: aws ERROR: Running exception handlers FATAL: Net::HTTPServerException: 412 "Precondition Failed "
這與 metadata.rb 中的依賴項匹配,即:
depends 'aws', '>= 0.2.4'
我了解缺少依賴項。我不清楚如何實現這種依賴。配方在 S3 中,儲存庫 URL 是https://s3-us-west-2.amazonaws.com/employer/ec2instance-tagging.zip
當我將配方添加到配置生命週期事件時,機器可以正常聯機,但未添加標籤。ec2 實例顯示“stock”標籤;鍵 “opsworks:instance” 、 “opsworks:layer:foo_layer” 、 “opsworks:stack” 和 “Name” 都有我期望的值。我想通過配方添加的標籤(“應用程序”、“團隊”、“環境”)不存在。
自定義 JSON 在堆棧級別添加:
{ "aws-tag": { "tags": { "team": "specialteam", "application": "foo", "environment": "development" } } }
是否有特定於 OpsWorks AWS 的食譜或食譜我應該在啟動後呼叫以在實例上設置標籤?我怎麼稱呼那個食譜?
我已閱讀有關使用 OpsWorks 自定義應用程序部署的 AWS 部落格文章。我是否缺少相同的“通過廚師在實例上設置 aws 標籤”食譜或食譜,它位於 GitHub 上的Amazon Web Services - Labs儲存庫中?
github 上的aws opsworks-cookbooks說“對於 Chef 12.2 Windows 和 Chef 12 Linux,沒有內置的食譜”,但我希望這是錯誤的 :-) 並且已經添加了我還沒有找到的食譜。或者,希望有人已經這樣做並在某處記錄了它。
我正在按照這篇 AWS 部落格文章快速探索 AWS OpsWorks 中的 Chef 環境(再次為 Linux 編寫)和這個關於在 Opsworks 上調試 Chef 的 SF 問題進行故障排除
我能夠自己弄清楚其中的一些。通過向 AWS Support 送出案例,我收到了足夠多的指示來解決這個問題。
減速帶可以解決
- 使用存檔文件時針對不同平台的不同食譜目錄結構。
如果您通過儲存在 AWS S3 上的存檔文件提供配方,則 AWS 需要一種用於 Linux 的目錄結構和另一種用於 Windows 的不同目錄結構。
Linux 可以將多個說明書放在一個根目錄中。這是
$ berks package
預設情況下所做的。Windows 不接受該根目錄。該
$ berks package
命令沒有以 Windows 接受的方式建構一個包含多個說明書的存檔的選項。我不得不手動編輯 tarfile。 2. Windows 上的紅寶石‘aws’ 食譜中可能會出現一個
"error: Seahorse::Client::NetworkingError: SSL_connect"
錯誤。AWS 想要服務之間的 https。這需要一個有效的證書頒發機構捆綁包。Windows 上的 Ruby 無法訪問 OS CA 證書包。在以下情況下可以解決此問題:a)您安裝 aws-sdk gem,然後
b)在配方中設置路徑
curl-ca-bundle.crt
3. 有關依賴項和社區食譜的詳細資訊。Windows 上 Chef 12 的 AWS 文件沒有提及 Berksfile 或社區食譜。這些都記錄在 AWS for Chef 11 on Linux 上。 4. 呼叫更新時指定區域。
奇怪的是,在實例上執行配方說實例不存在。
FATAL: Aws::EC2::Errors::InvalidInstanceIDNotFound: aws_resource_tag[i-5ccd24d4] (stemsoft::default line 27) had an error: Aws::EC2::Errors::InvalidInstanceIDNotFound: The instance ID 'i-5ccd24d4' does not exist
AWS 錯誤程式碼顯示 InvalidInstanceID.NotFound 可能是由於 a) 不在區域內,或 b) 最近創建的實例的 ID 未通過系統傳播。
修復是包含
region stack['region']
在aws_resource_tag
配方的塊中。 5. 附加到正確角色的正確策略確保使用正確的策略設置“aws-opsworks-ec2-role”和“aws-opsworks-service-role”。‘aws-opsworks-service-role’ 可以保持原樣,因此 OpsWorks 服務可以對其他 AWS 服務進行 API 呼叫。“aws-opsworks-ec2-role”是預設 IAM 實例配置文件,需要 ec2 上的權限才能創建和描述標籤。
程序
以下步驟的目標是建構一個在 Microsoft Windows Server 2012 上執行 Chef 12 的 OpsWorks 堆棧,其中包含一個(自定義)說明書,其中包含用於設置自定義標籤的配方。在我的範例中,標籤從堆棧中設置的自定義 json 獲取其資訊。
我還沒有找到這樣做的現有食譜。我寧願使用現有的食譜而不是建構自定義食譜。
在此過程結束時,配方使用廚師社區“aws”食譜 從堆棧設置中定義的自定義 json 中設置的值更新“團隊”標籤。
為此,配方通過搜尋現有數據包來獲取實例詳細資訊。它還通過搜尋第二個現有數據包來獲取區域詳細資訊。
(它對我有用….)
- 在 AWS,建構堆棧
- 在 AWS,將自定義 json 分配給堆棧
- { “aws-tag”: { “tags”: { “team”: “teamFooBar” } } }
- 在 AWS,使用自定義儲存庫配置堆棧。此範例使用 s3
- 在 AWS,建構層
- 簡稱全小寫
- 安全組 AWS-OpsWorks-Blank-Server
- 配方/配置“配置生命週期事件”例如,如果您的配方被命名為一次性,那麼“配置生命週期事件”應包含onetime::default 配方
- 在本地,安裝ChefDK(Chef Development Kit)
- 在本地安裝 Git for Windows
- 我喜歡
git-bash.exe
- 在本地,使用 Chef 初始化說明書目錄 cookbook_dir
- cd 到 build_root
- 在 build_root 中製作目錄 cookbook_dir
- 在 build_root 中
chef generate cookbook cookbook_dir
- 例子:
$ chef generate cookbook cookbook_dir --berks --copyright 'EMPLOYER' --email 'administrator@employerexample.com'
- 在本地,編輯 cookbook_dir\metadata.rb
- 添加
depends 'aws'
- 在本地,編輯 cookbook_dir\recipes\default.rb
- ‘#{節點$$ ‘aws-tag’ $$$$ ’tags’ $$$$ ’team’ $$}’ 將在我的範例中返回“teamFooBar”
- 編輯配方以呼叫正確的 ca-bundle.crt
- 編輯後,檢查配方紅寶石語法
$ ruby -c /path/to/cookbook_dir/recipes/default.rb
- 在本地,一次性設置,初始化 berksfile
- 在 Git for Windows MinTTY cd 到 cookbook_dir 並用於
$ berks install
初始化 berksfile 和跟踪依賴項
- 在本地,編輯 cookbook_dir Berksfile
- 添加
cookbook 'aws'
- 在本地, cd 進入 cookbook_dir 並執行
$ berks package
以建構 cookbook_dir.tar.gz- 在本地編輯 MS Windows Server 2012 的存檔文件
- 解壓 cookbook_dir.tar.gz 。將所有內容移出目錄’cookbooks’並上一級。重新打包 cookbook_dir.tar.gz
- 將 cookbook_dir.tar.gz 上傳到 s3
- 從 s3 中刪除以前的副本
- 確保權限正確(必要時“公開所有內容”)
- 在 AWS,一次性設置,編輯分配給由 OpsWorks 啟動的實例的角色,更新標籤的權利
- “aws-opsworks-ec2-role”“聲明”:$$ { “Action”: [ “ec2:CreateTags”, “ec2:DescribeTags” ], “Resource”: [ “*” ], “Effect”: “Allow” } $$
- 讓實例執行
- 添加一個實例
- 啟動一個實例
- 堆棧>執行命令>更新自定義食譜
安裝紅寶石
- 在初始設置中,需要此步驟
- 在隨後的測試執行中,不需要此步驟
安裝 aws-sdk
- 在初始設置中,需要此步驟
- 在隨後的測試執行中,不需要此步驟
- 確認有效
- 檢查 ec2 實例是否存在正確的標籤
- 檢查 OpsWorks 實例日誌(配置命令)
- 成功範例:
INFO: AWS: Updating the following tags for resource i-12345678 (skipping AWS tags): { .... "team"=>"teamFooBar"}
範例配方
範例配方
example::default.rb
Chef::Log.info("********** from custom json, Team is '#{node['aws-tag']['tags']['team']}' **********") instance = search("aws_opsworks_instance", "self:true").first Chef::Log.info("Instance id from data bag: #{instance['ec2_instance_id']}" ) stack = search("aws_opsworks_stack").first Chef::Log.info("********** stack['region'] from data bag: '#{stack['region']}' **********") include_recipe 'aws' chef_gem "aws-sdk" do compile_time false action :install version node[:aws][:aws_sdk_version] end ruby_block "Set the AWS Bundle" do block do require 'aws-sdk' Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt' end action :run end aws_resource_tag instance['ec2_instance_id'] do tags('team' => node['aws-tag']['tags']['team'] ) region stack['region'] action :update Chef::Log.info("********** updated tags('team') **********") end