访问食谱中的厨师数据包

Rav*_*mar 4 ruby-on-rails cookbook chef-infra

我创建了以下数据包项目:

{
  "name": "data_bag_item_nameservers_servers",
  "json_class": "Chef::DataBagItem",
  "chef_type": "data_bag_item",
  "data_bag": "nameservers",
  "raw_data": {
    "id": "servers",
    "serverslist": [
      "xxx.xxx.xxx.xxx",
      "xxx.xxx.xxx.xxx"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

在模板erb中我添加了以下调用,

<% @serverslist.each_with_index do |nmserver| %>
nameserver <%= nmserver %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

但它不适合我,并给出错误,因为,

在资源'template [/etc/resolve.conf]上执行操作创建时出错

厨师::密新::模板:: TemplateError

undefined方法each_with_index'为nil:NilClass

有人可以帮助我如何在食谱食谱中调用这些数据包项值?

提前致谢!

Mar*_*nor 6

您是否考虑过使用节点属性的更简单选项?

在运行时,很容易超越cookbook默认设置.我指出这一点,因为在我的经验中很少需要数据包.

我有两个例子.


示例1:使用属性

"演示"食谱

??? attributes
?   ??? default.rb
??? Berksfile
??? Berksfile.lock
??? chefignore
??? metadata.rb
??? README.md
??? recipes
?   ??? default.rb
??? templates
?   ??? default
?       ??? dummy.erb
??? test
    ??? integration
        ??? default
        ?   ??? serverspec
        ?       ??? default_spec.rb
        ??? helpers
            ??? serverspec
                ??? spec_helper.rb
Run Code Online (Sandbox Code Playgroud)

属性/ default.rb

default['demo']['nameservers']['one'] = "one"
default['demo']['nameservers']['two'] = "two"
default['demo']['nameservers']['three'] = "three"
Run Code Online (Sandbox Code Playgroud)

食谱/ default.rb

template "/etc/dummy" do
  source "dummy.erb"
  owner 'root'
  group 'root'
  mode '0644'
end
Run Code Online (Sandbox Code Playgroud)

模板/默认/ dummy.erb

<% node['demo']['nameservers'].each do |name,server| %>
nameserver <%= server %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

测试/集成/默认/ serverspec/default_spec.rb

require 'spec_helper'

describe file('/etc/dummy') do
  it { should be_file }
  it { should be_owned_by 'root' }
  it { should contain 'nameserver one' }
  it { should contain 'nameserver two' }
  it { should contain 'nameserver three' }
end
Run Code Online (Sandbox Code Playgroud)

示例2:使用数据包

测试/集成目录下带有测试数据包的"演示"食谱

??? Berksfile
??? Berksfile.lock
??? chefignore
??? metadata.rb
??? README.md
??? recipes
?   ??? default.rb
??? templates
?   ??? default
?       ??? dummy.erb
??? test
    ??? integration
        ??? data_bags
        ?   ??? stuff
        ?       ??? nameservers.json
        ??? default
        ?   ??? serverspec
        ?       ??? default_spec.rb
        ??? helpers
            ??? serverspec
                ??? spec_helper.rb
Run Code Online (Sandbox Code Playgroud)

测试/集成/ data_bags /材料/ nameservers.json

样本数据

{
  "id": "nameservers",
  "list": [
    "one",
    "two",
    "three"
  ]
}
Run Code Online (Sandbox Code Playgroud)

食谱/ default.rb

配方现在更加复杂.必须显式检索数据包中的数据,然后将其作为变量传递到模板中

nameservers = data_bag_item('stuff', "nameservers")

template "/etc/dummy" do
  source "dummy.erb"
  owner 'root'
  group 'root'
  mode '0644'
  variables ({
    "servers" => nameservers["list"]
  })
end
Run Code Online (Sandbox Code Playgroud)

模板/默认/ dummy.erb

<% @servers.each do |server| %>
nameserver <%= server %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

测试/集成/默认/ serverspec/default_spec.rb

require 'spec_helper'

describe file('/etc/dummy') do
  it { should be_file }
  it { should be_owned_by 'root' }
  it { should contain 'nameserver one' }
  it { should contain 'nameserver two' }
  it { should contain 'nameserver three' }
end
Run Code Online (Sandbox Code Playgroud)