[chef] RE: Re: Calling Chef::Knife::Ssh directly(?)


Chronological Thread 
  • From: "Miles, Ken" < >
  • To: " " < >
  • Subject: [chef] RE: Re: Calling Chef::Knife::Ssh directly(?)
  • Date: Wed, 1 Jun 2011 21:14:35 +0000
  • Accept-language: en-US

Thanks for the help with this guys.  For the longer term I am planning on 
digging into plugins.  Shorter term, this is working for me:

  conf_file = File.expand_path('~') + '/.chef/' + 'knife.rb'
  knife_ssh = Chef::Knife::Ssh.new()
  knife_ssh.config[:config_file] = conf_file
  knife_ssh.configure_chef
  cmd_line = "hostname -f"
  knife_ssh.name_args = [query, cmd_line]
  knife_ssh.run

BTW, at one point I was getting a stack trace from:

/usr/lib/ruby/gems/1.8/gems/json-1.4.6/lib/json/common.rb:44:in 
`deep_const_get': can't find const Chef::Node (ArgumentError)
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `inject'

Which I resolved by adding a 
  require 'chef/node'

Regards,

Ken Miles


-----Original Message-----
From: Daniel DeLeo 
[mailto:
 On Behalf Of Daniel DeLeo
Sent: Wednesday, June 01, 2011 11:31 AM
To: 

Subject: [chef] Re: Calling Chef::Knife::Ssh directly(?)


On Wednesday, June 1, 2011 at 10:29 AM, Miles, Ken wrote:

> Folks,
> 
> I am investigating switching some of our Ruby scripts from using the 
> 'system' function to calling the Chef libraries directly and am not 
> having much success. My latest error is:
> 
> /usr/lib/ruby/gems/1.8/gems/chef-0.9.8/lib/chef/rest/auth_credentials.rb:41:
> in `signature_headers': Cannot sign the request without a client name,
> check that :node_name is assigned (ArgumentError)
> 
> Below is a code snippet. 
> 
>  query = "role:#{role}"
>  knife_ssh = Chef::Knife::Ssh.new()
>  knife_ssh.config[:config_file] = conf_file
>  knife_ssh.config[:identity_file] = params["private_key"]
>  knife_ssh.config[:node_name] = ENV['HOSTNAME']
>  knife_ssh.config[:client_name] = ENV['HOSTNAME']
>  cmd_line = "hostname -f"
>  knife_ssh.name_args = [query, cmd_line]
>  sys_status = knife_ssh.run
> 
The Chef::REST class that interacts with the API expects you to have 
configured Chef::Config[:node_name] and Chef::Config[:client_key]. The 
easiest way to accomplish this is to reuse the knife code to load your 
configuration. After setting `Knife#config[:config_file]` you can call 
`Knife#configure_chef` to load it.

As Bryan mentioned, you can skip a lot of boilerplate if you write your code 
as `knife exec` scripts, or as a knife plugin. Take a look at this for more 
info on knife plugins: 
http://www.opscode.com/blog/2011/04/22/chef-0-10-preview-knife-plugins-and-ui/

-- 
Dan DeLeo 
> What am I doing wrong here? 
> 
> Thanks,
> 
> Ken Miles
> 
>  
> (mailto: )





Archive powered by MHonArc 2.6.16.

§