Chef

Chef 模板:通過另一個變數查找雜湊鍵

  • September 24, 2017

我正在嘗試為不同的環境建構 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] %>;
...

我試圖讓它評估為這樣的東西,具體取決於節點所屬的環境stagingproduction

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] %>;
...

閱讀此配方程式碼時,很明顯模板不會使用所有域 - 僅使用與其環境相關的域。閱讀模板時,變數更短,更容易閱讀。

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