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