Получите доступ к сумке данных повара в рецепте

Я создал ниже элемент сумки данных:

{
  "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 имущество.

Другие вопросы по тегам