厨师使用变量在模板中设置值

时间:2016-08-16 13:04:00

标签: chef

我需要在模板文件中设置服务器的外部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"/

我现在使用下面的数据字母设置:

Databag称为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

1 个答案:

答案 0 :(得分:0)

可能有多种方法可以解决这个问题。一些很容易检索并传递给模板变量的是:

  1. 将该对存储在数据包中,并在配方中相应地获取。

     data_bag_item("a", "b")['192.168.10.1']
    
  2. 以密钥值格式存储在某个json文件中并使用文件处理 和 JSON gem来提取特定值。

    JSON.load(File.read("file.json"))['192.168.10.1']
    
  3. 存储为属性文件并使用文件处理和 parseconfig gem 提取具体值。

    ParseConfig.new("file.properties")['192.168.10.1']
    
  4. 要访问您的数据字母&#34; extip&#34;,它应该是:

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