Получите доступ к сумке данных повара в рецепте
Я создал ниже элемент сумки данных:
{
"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 %>
Но это не работает для меня и дает ошибку как,
Ошибка при выполнении действия create на ресурсе 'template[/etc/resolve.conf]'
Шеф:: Mixin:: Template:: TemplateError
undefined метод each_with_index'для nil:NilClass
Может кто-нибудь помочь мне, как я могу назвать эти значения пакета данных в рецепте поваренной книги?
Заранее спасибо!
2 ответа
Рассматривали ли вы более простой вариант с использованием атрибутов узла?
Во время выполнения легко изменить настройки по умолчанию для поваренной книги. Я подчеркиваю это, потому что в моем опыте мешки с данными редко нужны.
Я включил два примера.
Пример 1. Использование атрибутов
кулинарная книга "demo"
├── 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.rb
default['demo']['nameservers']['one'] = "one"
default['demo']['nameservers']['two'] = "two"
default['demo']['nameservers']['three'] = "three"
Рецепты / default.rb
template "/etc/dummy" do
source "dummy.erb"
owner 'root'
group 'root'
mode '0644'
end
шаблоны / по умолчанию / dummy.erb
<% node['demo']['nameservers'].each do |name,server| %>
nameserver <%= server %>
<% end %>
тест / интеграция / по умолчанию /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
Пример 2. Использование пакета данных
Кулинарная книга "Demo" с пакетом данных теста в каталоге test / интеграции
├── 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
тест / интеграция /data_bags/ материал /nameservers.json
Пример данных
{
"id": "nameservers",
"list": [
"one",
"two",
"three"
]
}
Рецепты / 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
шаблоны / по умолчанию / dummy.erb
<% @servers.each do |server| %>
nameserver <%= server %>
<% end %>
тест / интеграция / по умолчанию /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
Вам необходимо явно загрузить пакет данных из кода рецепта, обычно используя data_bag_item(bagname, itemname)
функции, а затем передать его в шаблон, используя его variables
имущество.