Chef
Chef 模板:通過另一個變數查找雜湊鍵
我正在嘗試為不同的環境建構 nginx 文件。我的食譜有一個像這樣的雜湊圖:
domain = { production: { public: 'example.com', internal: 'example.dev' }, staging: { public: 'examplestage.com', internal: 'examplestage.dev' } } template '/etc/nginx/conf.d/example.conf' do source 'example.conf.erb' variables( :domain => domain, ) end
在我的模板中,我想做這樣的事情:
... server <%= @domain[node.chef_environment][:public] %> <%= @domain[node.chef_environment][:public] %>; ...
我試圖讓它評估為這樣的東西,具體取決於節點所屬的環境
staging
或production
:server example.com example.dev;
問題是,該
node.chef_environment
部分沒有被插值。我該如何解決這個問題?
我懷疑你的程式碼失敗了,因為 ’node.chef_environment’ 是一個字元串,而你的雜湊鍵是符號。如果是這樣的話,
@domain[node.chef_environment.to_sym][:public]
可能會奏效。但是:通常最好避免將這種邏輯放入您的模板中 - 而不是在配方中進行:
template '/etc/nginx/conf.d/example.conf' do source 'example.conf.erb' variables( :domains => domain[node.chef_environment.to_sym], ) end
然後,在模板中:
... server <%= @domains[:public] %> <%= @domains[:internal] %>; ...
閱讀此配方程式碼時,很明顯模板不會使用所有域 - 僅使用與其環境相關的域。閱讀模板時,變數更短,更容易閱讀。