[chef] Re: RE: Re: nested data bag data to temp late file returns “can't convert String into Integer"


Chronological Thread 
  • From: Matthias Marschall < >
  • To:
  • Subject: [chef] Re: RE: Re: nested data bag data to temp late file returns “can't convert String into Integer"
  • Date: Tue, 25 Jun 2013 19:42:23 +0200

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:inblock 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.

§