[英]Access chef data bag in recipe
我創建了以下數據包項目:
{
"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"
]
}
}
在模板erb中我添加了以下調用,
<% @serverslist.each_with_index do |nmserver| %>
nameserver <%= nmserver %>
<% end %>
但它不適合我,並給出錯誤,因為,
在資源'template [/etc/resolve.conf]上執行操作創建時出錯
廚師::密新::模板:: TemplateError
undefined方法each_with_index'為nil:NilClass
有人可以幫助我如何在cookbook配方中調用這些數據包項值?
提前致謝!
您是否考慮過使用節點屬性的更簡單選項?
在運行時,很容易超越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
測試/集成目錄下帶有測試數據包的“演示”食譜
├── 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
樣本數據
{
"id": "nameservers",
"list": [
"one",
"two",
"three"
]
}
配方現在更加復雜。 必須顯式檢索數據包中的數據,然后將其作為變量傳遞到模板中
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.