簡體   English   中英

訪問食譜中的廚師數據包

[英]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默認設置。 我指出這一點,因為在我的經驗中很少需要數據包。

我有兩個例子。


示例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

屬性/ 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:使用數據包

測試/集成目錄下帶有測試數據包的“演示”食譜

├── 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屬性將其傳遞給模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM