[chef] RE: Re: nested data bag data to template file r eturns “can't convert String into Integer"


Chronological Thread 
  • From: Dalho PARK < >
  • To: " " < >
  • Subject: [chef] RE: Re: nested data bag data to template file r eturns “can't convert String into Integer"
  • Date: Tue, 25 Jun 2013 17:16:07 +0000
  • Accept-language: en-US, fr-FR

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.

§