Windows-Server-2012-R2

如何通過 Chef 配方向 AWS OpsWorks 中的 Windows Server 2012 實例添加標籤?

  • November 9, 2016

我的雇主需要在 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 送出案例,我收到了足夠多的指示來解決這個問題。

減速帶可以解決

  1. 使用存檔文件時針對不同平台的不同食譜目錄結構。

如果您通過儲存在 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 中設置的值更新“團隊”標籤。

為此,配方通過搜尋現有數據包來獲取實例詳細資訊。它還通過搜尋第二個現有數據包來獲取區域詳細資訊。

(它對我有用….)

  1. 在 AWS,建構堆棧
  2. 在 AWS,將自定義 json 分配給堆棧
  • { “aws-tag”: { “tags”: { “team”: “teamFooBar” } } }
  1. 在 AWS,使用自定義儲存庫配置堆棧。此範例使用 s3
  2. 在 AWS,建構層
  • 簡稱全小寫
  • 安全組 AWS-OpsWorks-Blank-Server
  • 配方/配置“配置生命週期事件”例如,如果您的配方被命名為一次性,那麼“配置生命週期事件”應包含onetime::default 配方
  1. 在本地,安裝ChefDK(Chef Development Kit)
  • 在本地安裝 Git for Windows
  • 我喜歡git-bash.exe
  1. 在本地,使用 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'
  1. 在本地,編輯 cookbook_dir\metadata.rb
  • 添加depends 'aws'
  1. 在本地,編輯 cookbook_dir\recipes\default.rb
  • ‘#{節點$$ ‘aws-tag’ $$$$ ’tags’ $$$$ ’team’ $$}’ 將在我的範例中返回“teamFooBar”
  • 編輯配方以呼叫正確的 ca-bundle.crt
  • 編輯後,檢查配方紅寶石語法$ ruby -c /path/to/cookbook_dir/recipes/default.rb
  1. 在本地,一次性設置,初始化 berksfile
  • 在 Git for Windows MinTTY cd 到 cookbook_dir 並用於$ berks install初始化 berksfile 和跟踪依賴項
  1. 在本地,編輯 cookbook_dir Berksfile
  • 添加cookbook 'aws'
  1. 在本地, cd 進入 cookbook_dir 並執行$ berks package以建構 cookbook_dir.tar.gz
  2. 在本地編輯 MS Windows Server 2012 的存檔文件
  • 解壓 cookbook_dir.tar.gz 。將所有內容移出目錄’cookbooks’並上一級。重新打包 cookbook_dir.tar.gz
  1. 將 cookbook_dir.tar.gz 上傳到 s3
  • 從 s3 中刪除以前的副本
  • 確保權限正確(必要時“公開所有內容”)
  1. 在 AWS,一次性設置,編輯分配給由 OpsWorks 啟動的實例的角色,更新標籤的權利
  • “aws-opsworks-ec2-role”“聲明”:$$ { “Action”: [ “ec2:CreateTags”, “ec2:DescribeTags” ], “Resource”: [ “*” ], “Effect”: “Allow” } $$
  1. 讓實例執行
  • 添加一個實例
  • 啟動一個實例
  • 堆棧>執行命令>更新自定義食譜
  1. 修復適用於 Windows 的 aws-sdk gem 未附帶正確的 ca-bundle.crt
  • 安裝紅寶石

    • 在初始設置中,需要此步驟
    • 在隨後的測試執行中,不需要此步驟
  • 安裝 aws-sdk

    • 在初始設置中,需要此步驟
    • 在隨後的測試執行中,不需要此步驟
  1. 確認有效
  • 檢查 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

引用自:https://serverfault.com/questions/810093