2015-03-02 38 views
1

我有一些主機需要在文件中使用不同的主服務器主機和唯一端口。所以端口和服務器的價值是已知的。爲使用相同食譜的已知主機生成獨特的erb模板 - 主廚

最終的結果是,我再培訓局的文件應該產生這種性質的東西將運行食譜中的所有主機:

PG_Host = -h myservername:unique_port 

我面臨的挑戰是如何獲得的方案,使依賴於重複的值服務器運行食譜時的簡短主機名,它挑選特定的端口和特定的主服務器。

我很難將模板與erb文件進行匹配。我想要一些簡單的解決方案來實現這一點。任何指針將不勝感激。

這裏是我的食譜:

template '/var/lib/pgsql/conf/mymonitor.sh' do 
      source 'mymonitor.sh.erb' 
      owner 'postgres' 
      action :create 
      variables(
        master_server: 'someserver.fqn', 
        master_port: '897' 
      ) 
end 

模板文件:

PG_HOST= -h <%= @master_server %>:<%= @master_port %> 

那麼,如何得到它使用某種形式的生產出在端口5555等爲anotherserver.fqn的類似文件循環?我不確定其他服務器和端口的變量應該如何。

回答

0

您傳遞給模板的變量可以在chef-client運行期間計算出來,因此在您的配方中,您可以按照自己的希望計算端口,並且服務器名稱(master_server)可以在chef-client運行,或者您可以使用某些節點的自動屬性(由ohai收集),例如node[:hostname]node[:fqdn]。 IE:

  • 傳遞配方變量動態

    server_port = "42#{node[:ipaddress].rpartition('.')[-1]}" 
    
    template '/var/lib/pgsql/conf/mymonitor.sh' do 
        source 'mymonitor.sh.erb' 
        owner 'postgres' 
        action :create 
        variables(
        master_server: node[:fqdn], 
        master_port: server_port 
        ) 
    end 
    
  • 或者你可以在你的模板節點的屬性直接使用:

    PG_HOST= -h <%= node[:fqdn] %>:<%= node[:mycookbook][:server_port] %> 
    

或使用字符串插值

PG_HOST= -h <%= "#{node[:fqdn]}:#{node[:mycookbook][:server_port]"} %> 

編輯: 可以爲每個節點(或角色)覆蓋屬性的值,因此您可以輕鬆地爲每個節點的屬性分配不同的值。查看chef attribute documentation以查看有關屬性如何工作的詳細信息。

+0

讓我稍微澄清一下......有一個以上的主服務器有不同的端口,所以我們生成的文件不是運行cookbook的服務器的實際fqdn,而是我的主服務器列表。因此,對於每個主機,具有特定唯一端口的特定主服務器必須動態匹配。 – Sentinel 2015-03-03 10:56:02

+0

你如何獲得知道哪個服務器必須具有每個節點的條件? – 2015-03-03 11:07:49

+0

這就是我感到困惑的地方,我想在主屬性和主屬性列表中匹配主機和唯一端口: – Sentinel 2015-03-03 13:43:45