2016-08-16 71 views
0

我需要在模板文件中設置服務器的外部IP。服務器在NAT後面,所以我打算使用一個靜態文件,我將不斷更新。該文件將包含本地IP和相關的外部IP。示例如下。廚師使用變量來設置模板中的值

但我需要一種方法來返回變量值並將其應用到我的模板文件中。我只是堅持如何去做這件事。我猜我在我的屬性文件中以某種方式將本地IP引用到我的靜態文件中。

服務器文件:

192.168.10.1=88.54.45.15 
192.168.10.2=88.54.45.16 
192.168.10.2=88.54.45.17 
192.168.10.3=88.54.45.18 

當前模板文件(這正確帶回本地IP,所以我需要再使用此作爲查找到細的外部IP):

data="local_ip_v4=<%= @local_ip_v4 %>" 
data="external_sip_ip=UNSURE WHAT TO PUT HERE"/ 

我現在使用的數據安裝如下:

數據包稱爲freeswitch,包含:
{ "192.168.1.1": { "extip": "88.54.45.15" }, "192.168.1.2": { "extip": "88.54.45.16" }, "192.168.1.3": { "extip": "88.54.45.17" }, "192.168.1.4": { "extip": "88.54.45.18" }, "192.168.1.5": { "extip": "88.54.45.19" }, "192.168.1.6": { "extip": "88.54.45.20" }, "192.168.1.7": { "extip": "88.54.45.21" }, "192.168.1.8": { "extip": "88.54.45.22" }, "id": "extaddress" }

配方有:

data = data_bag_item('freeswitch', 'extaddress') 
template "/usr/local/freeswitch/conf/vars.conf.xml" do 
source "vars.conf.xml.erb" 
mode 0644 
variables(:exitip => data[[node['freeswitch']['local_ip']]['extip']]) 
end 

它我無法格式化的變量部分。僅供參考我有一個屬性是['freeswitch'] ['local_ip']。

錯誤我現在得到的是:

Recipe Compile Error in /var/chef/cache/cookbooks/freeswitch/recipes/default.rb 
================================================================================ 

NoMethodError 
------------- 
undefined method `[]' for nil:NilClass 

Cookbook Trace: 
--------------- 
    /var/chef/cache/cookbooks/freeswitch/recipes/default.rb:31:in `block in from_file' 
    /var/chef/cache/cookbooks/freeswitch/recipes/default.rb:28:in `from_file' 

Relevant File Content: 
---------------------- 
/var/chef/cache/cookbooks/freeswitch/recipes/default.rb: 

24: mode 0644 
25: end 
26: 
27: data = data_bag_item('freeswitch', 'extaddress')[node['freeswitch']['local_ip']] 
28: template "/usr/local/freeswitch/conf/vars.conf.xml" do 
29: source "vars.conf.xml.erb" 
30: mode 0644 
31>> variables(:exitip => data[node['freeswitch']['local_ip']]['extip']) 
32: end 

回答

0

可能有多種方式來解決這個問題。有些容易找到並傳遞給模板變量的是:

  1. 將這對存儲在數據包中,並在配方中相應提取。

    data_bag_item("a", "b")['192.168.10.1'] 
    
  2. 儲存於關鍵值的格式和使用文件處理 和JSON寶石提取特定值的一些JSON文件。

    JSON.load(File.read("file.json"))['192.168.10.1'] 
    
  3. 存儲爲屬性文件和使用文件處理和parseconfig寶石 提取特定的值。

    ParseConfig.new("file.properties")['192.168.10.1'] 
    

要訪問您的databag「extip」,它應該是:

variables(:exitip => data[node['freeswitch']['local_ip']]['extip']) 
+0

感謝您的答覆,但您所指定的IP地址,但我不能把這個在我的食譜我在腳本運行之前不知道本地IP。除非我錯過了什麼? – jaseUK

+0

通常,您可以在配方中使用節點['ipaddress']來獲取機器的內部IP,否則您可以檢查ohai數據。 –

+0

我決定使用數據包,但是nodeIP我遇到了如何在代碼中聲明它的問題,請參閱下面的變量。 數據= data_bag_item( 'FreeSWITCH的', 'extip') 模板 「/usr/local/freeswitch/conf/vars.conf.xml」 做 源 「vars.conf.xml.erb」 模式0644 變量( :exitip => data [node ['ipaddress'] ['extip']) end – jaseUK