- From: Dalho PARK <
>
- To: "
" <
>
- Subject: [chef] RE: Re: RE: Re: nested data bag data to template file returns “can't convert String into Inte ger"
- Date: Tue, 25 Jun 2013 17:52:26 +0000
- Accept-language: en-US, fr-FR
Hi Matthias,
After removing the square blacked, everything went well.
Thank you so much.
Go
-----Original Message-----
From: Matthias Marschall
[mailto:
On Behalf Of Matthias Marschall
Sent: Tuesday, June 25, 2013 1:42 PM
To:
Subject: [chef] Re: RE: Re: nested data bag data to template file returns
“can't convert String into Integer"
Hi,
you should remove the square brackets from your data bag. It should look like
this:
>
{
>
"test": {
>
"part.name": "L12",
>
"transport.tcp.ip": "111.111.111.111",
>
"transport.tcp.port": "9199"
>
},
>
"transport.tcp.ip2": "222.222.222.222",
>
"id": "qa"
>
}
alternatively, you need to access the part.name by first accessing the
array's first element:
>
data1 = data_bag_item( 'mytest', 'qa' )['test'].first
or, similar
>
data1 = data_bag_item( 'mytest', 'qa' )['test'][0]
If you want to nicely nest your data bag, this could be what you initially
tried to do? But I'm guessing:
>
{
>
"test": {
>
"part": {
>
"name": "L12",
>
"transport": {
>
"tcp": {
>
"ip": "111.111.111.111",
>
"port": "9199"
>
}
>
}
>
}
>
},
>
"transport": {
>
"tcp": {
>
"ip2": "222.222.222.222"
>
}
>
},
>
"id": "qa"
>
}
hope this helps,
Matthias
Am 25.06.2013 um 19:16 schrieb Dalho PARK
<
>:
>
Hi Daniel,
>
Thanks for the reply.
>
>
I followed as you mentioned and used “require” and “pp” in my recipe and it
>
shows like below.
>
For me, it look like hash. I don’t know how to put value of “part.name” to
>
variable.
>
>
[{"part.name"=>"L12",
>
"transport.tcp.ip"=>"111.111.111.111",
>
"transport.tcp.port"=>"9199"}]
>
>
Also used Fpp and Fj option.
>
>
# knife data bag show mytest qa -Fpp
>
{"test"=>
>
[{"part.name"=>"L12",
>
"transport.tcp.ip"=>"111.111.111.111",
>
"transport.tcp.port"=>"9199"}],
>
"transport.tcp.ip2"=>"222.222.222.222",
>
"id"=>"qa"}
>
>
# knife data bag show mytest qa -Fj
>
{
>
"test": [
>
{
>
"part.name": "L12",
>
"transport.tcp.ip": "111.111.111.111",
>
"transport.tcp.port": "9199"
>
}
>
],
>
"transport.tcp.ip2": "222.222.222.222",
>
"id": "qa"
>
}
>
>
From: Daniel DeLeo
>
[mailto:
>
On Behalf Of Daniel
>
DeLeo
>
Sent: Tuesday, June 25, 2013 11:33 AM
>
To:
>
>
Subject: [chef] Re: nested data bag data to template file returns “can't
>
convert String into Integer"
>
>
>
On Tuesday, June 25, 2013 at 8:10 AM,
>
>
wrote:
>
>
Hello,
>
>
I'm creating simple test recipe with a template and data bag. What I'm
>
trying to do is creating a config file from data bag that has simple
>
nested information, but I receive error "can't convert String into
>
Integer" and I can't find how to get data bag item "part.name"
>
>
Here are my setting files.
>
>
1) recipe/default.rb
>
data1 = data_bag_item( 'mytest', 'qa' )['test']
>
data2 = data_bag_item( 'mytest', 'qa' ) template "/opt/env/test.cfg"
>
do source "test.erb"
>
action :create_if_missing
>
mode 0664
>
owner "root"
>
group "root"
>
variables({
>
:pepe1 => data1['part.name'],
>
:pepe2 => data2['transport.tcp.ip2']
>
})
>
end
>
>
2)my data bag named "mytest"
>
test.json
>
{
>
"test":[
>
{
>
"part.name": "L12",
>
"transport.tcp.ip": "111.111.111.111",
>
"transport.tcp.port": "9199"
>
}
>
],
>
"transport.tcp.ip2": "222.222.222.222",
>
"id": "qa"
>
}
>
>
$knife data bag show mytest qa
>
id: qa
>
test:
>
part.name: L12
>
transport.tcp.ip: 111.111.111.111
>
transport.tcp.port: 9199
>
transport.tcp.ip2: 222.222.222.222
>
>
3)template file test.erb
>
>
part.name=<%= @pepe1 %>
>
transport.tcp.binding=<%= @pepe2 %>
>
>
>
Error returns when I run chef-client on my server,
>
>
[2013-06-24T19:50:38+00:00] DEBUG: filtered backtrace of compile error:
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:in
>
[]',/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:inbloc
>
k in
>
from_file',/var/chef/cache/cookbooks/config_test/recipes/default.rb:12
>
:in from_file' [2013-06-24T19:50:38+00:00] DEBUG: filtered backtrace
>
of compile
>
error:
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:in[]',/var
>
/chef/cache/cookbooks/config_test/recipes/default.rb:19:in
>
block in
>
from_file',/var/chef/cache/cookbooks/config_test/recipes/default.rb:12:infrom_file'
>
[2013-06-24T19:50:38+00:00] DEBUG: backtrace entry for compile error:
>
'/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:in `[]''
>
[2013-06-24T19:50:38+00:00] DEBUG: Line number of compile error: '19'
>
>
Recipe Compile Error in
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb
>
>
TypeError
>
>
can't convert String into Integer
>
>
Cookbook Trace:
>
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:in []'
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:19:inblock in
>
from_file'
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:12:in
>
`from_file'
>
>
Relevant File Content:
>
>
/var/chef/cache/cookbooks/config_test/recipes/default.rb:
>
>
12: template "/opt/env/test.cfg" do
>
13: source "test.erb"
>
14: action :create_if_missing
>
15: mode 0664
>
16: owner "root"
>
17: group "root"
>
18: variables({
>
19>> :pepe1 => data1['part.name'],
>
20: :pepe2 => data2['transport.tcp.ip2']
>
21: })
>
22: end 23:
>
>
I tried many things and if I comment out "pepe1 =>
>
data1['part.name'],", then
>
:pepe2 => data2['transport.tcp.ip2'] works fine. only nested data
>
"part.name"
>
cannot be set to @pepe1.
>
>
Does anyone knows why I receive the errors?
>
>
thanks,
>
That type error is saying that you're accessing an Array as if it was
>
a hash. Try pretty printing your `data1` variable like
>
>
require 'pp'
>
pp data1
>
>
That should show you the data structure. BTW, you can also use different
>
formats with knife, e.g. knife TYPE show NAME -Fpp (for ruby pretty print)
>
or -Fj (for json). The default format is optimized for readability at the
>
expense of obscuring some details about the data.
>
>
--
>
Daniel DeLeo
>
Archive powered by MHonArc 2.6.16.