2014-10-07 54 views
0

每次我們創建一個新的服務器我有一個bash腳本向最終用戶詢問一組幫助廚師配置自定義服務器的問題,他/她對這些問題的回答需要注入廚師我可以在我的廚師腳本中使用他們的響應(例如,設置服務器「hostname」=「server1.stack.com」)。在運行chef-client時有一個json屬性我已經閱讀過這些可能有用的信息,但我不確定在我們的環境中該如何工作。廚師:傳遞變量

注意:我們通過cronjob每15分鐘在我們的所有系統上運行chef-client以獲取更新。

僞代碼:

echo -n "What is the server name?" 
read hostname 

chef-client -j {'hostname' => ENV['$hostname']} 

回答

1

兩個問題,第一個是-j一個文件名不生JSON和第二個是使用-j將完全覆蓋節點的數據從其中還包括運行列表和環境中的服務器來。如果這是在系統配置時完成的,那麼您絕對可以做這樣的事情,例如參見my AMI bootstrap script。如果這是在初始配置之後完成的,那麼您最好將這些響應寫入文件,然後從您的廚師配方代碼中讀取。

+0

我相信你錯了。我剛剛在我的服務器上驗證了傳入-j的參數不會覆蓋run_list或環境。 事實上,如果我正確地閱讀源代碼,它會在服務器的-j內容和常規屬性之間進行深度合併。 https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L293 – 2014-10-08 01:28:11

+0

我得到了腳本中的邏輯,它看起來像你在運行這個client-bootstrap.sh目標機器本身? – user3617841 2014-10-08 15:53:53

1

將原始json傳遞給廚師客戶端是可能的,但需要一點創意。你只需做這樣的事情:

echo '{"hostname": "$hostname"}' | chef-client -j /dev/stdin 

在你的JSON的值將與存儲在廚師服務器「正常」的屬性來深的合併。你也可以在你的json中包含一個run_list,它將取代(而不是合併)廚師服務器上的run_list。

你可以看到run_list這裏更換服務器運行列表: https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L327-L338

你可以看到屬性的深合併在這裏: https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L305-L311

而且,你在你的JSON聲明任何屬性將覆蓋已經存儲在廚師服務器上的屬性。

+0

@coderanger你介意看看這個嗎?我很樂意承認你在這方面的經驗比我多,如果我正在讀錯源,我很高興能夠糾正並刪除我的答案。 – 2014-10-08 17:47:42