2015-05-26 90 views
0

我有两个问题与问题相关。 (解决问题,下面提供解决方案)加载厨师数据袋项目时出错,通过厨师代码创建

我有一个名为数据包,JAVA。它包含具体到每个节点的主机名数据包项目,如下图所示

id:   node_hostname 
java_config: 
    jdk_version: 7 

我能够用厨师代码

dbag_hash = Hash[ "id" => node['hostname'], "java_config" => [ "jdk_version" => "7" ] ] 

    databag_item = Chef::DataBagItem.new 
    databag_item.data_bag("java") 
    databag_item.raw_data = dbag_hash 
    databag_item.save 

    userDataBag = data_bag_item('java', node['hostname']) 
    jdk_version = userDataBag['jdk_version']['java_config'] 

创建数据包,但在执行的食谱,我是在代码中获取低于错误的位置,它将值分配给jdk_version

>>  jdk_version = userDataBag['java_config']['jdk_version'] 
TypeError 
--------- 
can't convert String into Integer 

问题1:如何从上述数据包项目格式获取值?

如果我创建数据包下面,我能够获取jdk_version

id:   node_hostname 
jdk_version: 7 

守则上面的格式来创建数据包

dbag_hash = Hash[ "id" => node['hostname'], "jdk_version" => "7" ] 

    databag_item = Chef::DataBagItem.new 
    databag_item.data_bag("java") 
    databag_item.raw_data = dbag_hash 
    databag_item.save 

    userDataBag = data_bag_item('java', node['hostname']) 
    jdk_version = userDataBag['jdk_version'] 

问题2:我在做什么错在之前的数据包项目实现中?

解决的问题:: 我现在可以在以下提到的格式创建数据包项目,能够获取数据成功

id:   node_hostname 
java_config: 
    jdk_version: 7 

增加了“{}”括号而非“ []“为jdk_version及其值,同时创建数据包项哈希。

工作代码如下规定,

dbag_hash = Hash[ "id" => node['hostname'], "java_config" => { "jdk_version" => "7" } ] 

    databag_item = Chef::DataBagItem.new 
    databag_item.data_bag("java") 
    databag_item.raw_data = dbag_hash 
    databag_item.save 

    userDataBag = data_bag_item('java', node['hostname']) 
    jdk_version = userDataBag['java_config']['jdk_version'] 
+1

供参考:它更易于定义散列在红宝石/厨师例如:'dbag_hash = { ID:节点[ '主机'], java_config:{ jdk_version: “7” } }'(技术上这使用符号作为散列键,而不是字符串,但在厨师他们通常是可以互换的,特别是在'节点'属性或数据袋。) – Roland

+0

感谢您的澄清罗兰.. –

回答

0

我已在这个问题本身的分辨率。但为了读者的利益,我将其添加到答案部分。

我能够在格式创建数据包项下面提到并能够获取成功

id: node_hostname 
java_config: 
    jdk_version: 7 

工作代码如下提供的数据,

dbag_hash = Hash[ "id" => node['hostname'], "java_config" => { "jdk_version" => "7" } ] 

databag_item = Chef::DataBagItem.new 
databag_item.data_bag("java") 
databag_item.raw_data = dbag_hash 
databag_item.save 

userDataBag = data_bag_item('java', node['hostname']) 
jdk_version = userDataBag['java_config']['jdk_version'] 

添加大括号“{}”而不是方括号“[]”为jdk_version及其值,同时创建数据包项哈希。