Ruby

Chef 11 節點屬性可用和排序

  • September 16, 2013

在 Chef 10 中,我有許多角色可以設置自定義節點屬性,例如

"appname": "my_rails_app"

然後該屬性用於在包裝器說明書中載入應用程序特定的變數。例如,每個 Rails 應用程序都有不同的變數和變數數量。

app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

在 Chef 11 中,我的執行失敗,因為在成功執行 Chef 之後才設置“node.appname”。這意味著伺服器創建已成為一個 2 步過程 - 使用基本角色啟動,然後引導包裝器說明書。

我理解為什麼這種行為會改變,但我很好奇如何在不重寫我的食譜的情況下解決它並且仍然堅持 DRY。

更新

謝謝,這很有趣,但我不確定這是否有效。例如,也依賴於 appname 的通用部署說明書包含在 my_rails_app 配方中。所以跑步看起來像

角色 - 設置屬性的位置

"appname": "my_rails_app"

應用程序包裝手冊 - 載入變數

include_recipe "deploy"
app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

部署說明書 - 載入 SSH 密鑰

app = Chef::EncryptedDataBagItem.load('deploy', node.appname)

部署說明書是殺死廚師執行的原因。

已經在食譜屬性文件中定義的預設屬性可以在廚師客戶端執行期間再次解析node.from_file

# set the attribute
node.set[:appname] = "my_rails_app"

# optionally reload node so attribute is available during this chef-client run
node.from_file( run_context.resolve_attribute('your-railapp-cookbook', 'default') )

# and log it. 
Chef::Log.info( "appname [#{node[:appname]}]" )

這是從我關於使用屬性的答案中提取的部分:

如果您正在這樣做,您可能需要考慮將節點保存回伺服器,如果這是您的流程中足夠重要的檢查點,以保證額外呼叫回主廚伺服器。

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