[英]Access chef data bag in recipe
I have created below data bag item: 我创建了以下数据包项目:
{
"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"
]
}
}
And in template erb I added below call, 在模板erb中我添加了以下调用,
<% @serverslist.each_with_index do |nmserver| %>
nameserver <%= nmserver %>
<% end %>
But its not working for me and giving error as, 但它不适合我,并给出错误,因为,
Error executing action create on resource 'template[/etc/resolve.conf]'
在资源'template [/etc/resolve.conf]上执行操作创建时出错
Chef::Mixin::Template::TemplateError
厨师::密新::模板:: TemplateError
undefined method each_with_index' for nil:NilClass
undefined方法each_with_index'为nil:NilClass
Can someone please help me how can I call those data bag item values in cookbook recipe? 有人可以帮助我如何在cookbook配方中调用这些数据包项值?
Thanks in advance! 提前致谢!
Have you considered a simpler option using node attributes? 您是否考虑过使用节点属性的更简单选项?
At run-time it's easy to over-ride the cookbook default settings. 在运行时,很容易超越cookbook默认设置。 I point this out because data bags are rarely needed in my experience.
我指出这一点,因为在我的经验中很少需要数据包。
I have included two examples. 我有两个例子。
"demo" cookbook “演示”食谱
├── 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
default['demo']['nameservers']['one'] = "one"
default['demo']['nameservers']['two'] = "two"
default['demo']['nameservers']['three'] = "three"
template "/etc/dummy" do
source "dummy.erb"
owner 'root'
group 'root'
mode '0644'
end
<% node['demo']['nameservers'].each do |name,server| %>
nameserver <%= server %>
<% end %>
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
"Demo" cookbook with test data bag under the test/integration directory 测试/集成目录下带有测试数据包的“演示”食谱
├── 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
Sample data 样本数据
{
"id": "nameservers",
"list": [
"one",
"two",
"three"
]
}
The recipe is more complex now. 配方现在更加复杂。 The data in the data bag must be explicitly retrieved and then passed into the template as a variable
必须显式检索数据包中的数据,然后将其作为变量传递到模板中
nameservers = data_bag_item('stuff', "nameservers")
template "/etc/dummy" do
source "dummy.erb"
owner 'root'
group 'root'
mode '0644'
variables ({
"servers" => nameservers["list"]
})
end
<% @servers.each do |server| %>
nameserver <%= server %>
<% end %>
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
您需要从配方代码中显式加载数据包,通常使用data_bag_item(bagname, itemname)
函数,然后使用其variables
属性将其传递给模板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.