2015-05-26 155 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及其值,同時創建數據包項哈希。