DragonFly On-Line Manual Pages
KNIFE-EXEC(1) knife exec KNIFE-EXEC(1)
NAME
knife-exec - The man page for the knife exec subcommand.
The knife exec subcommand uses the Knife configuration file to execute
Ruby scripts in the context of a fully configured chef-client. This
subcommand is most often used to run scripts that will only access Chef
server one time (or otherwise very infrequently). Use this subcommand
any time that an operation does not warrant full usage of the Knife
subcommand library.
Authenticated API Requests
The knife exec subcommand can be used to make authenticated API
requests to the Chef server using the following methods:
+-----------+----------------------------+
|Method | Description |
+-----------+----------------------------+
|api.delete | Use to delete an object |
| | from the Chef server. |
+-----------+----------------------------+
|api.get | Use to get the details of |
| | an object on the Chef |
| | server. |
+-----------+----------------------------+
|api.post | Use to add an object to |
| | the Chef server. |
+-----------+----------------------------+
|api.put | Use to update an object on |
| | the Chef server. |
+-----------+----------------------------+
These methods are used with the -E option, which executes that string
locally on the workstation using chef-shell. These methods have the
following syntax:
$ knife exec -E 'api.method(/endpoint)'
where:
o api.method is the corresponding authentication method --- api.delete,
api.get, api.post, or api.put
o /endpoint is an endpoint in the Chef Server API
For example, to get the data for a node named "Example_Node":
$ knife exec -E 'puts api.get("/nodes/Example_Node")'
and to ensure that the output is visible in the console, add the puts
in front of the API authorization request:
$ knife exec -E 'puts api.get("/nodes/Example_Node")'
where puts is the shorter version of the $stdout.puts predefined
variable in Ruby.
The following example shows how to add a client named "IBM305RAMAC" and
the /clients endpoint, and then return the private key for that user in
the console:
$ client_desc = {
"name" => "IBM305RAMAC",
"admin" => false
}
new_client = api.post("/clients", client_desc)
puts new_client["private_key"]
Syntax
This subcommand has the following syntax:
$ knife exec SCRIPT (options)
Options
This subcommand has the following options:
-c CONFIG_FILE, --config CONFIG_FILE
The configuration file to use.
--chef-zero-port PORT
The port on which chef-zero will listen.
--[no-]color
Use to view colored output.
-d, --disable-editing
Use to prevent the $EDITOR from being opened and to accept data
as-is.
--defaults
Use to have Knife use the default value instead of asking a user
to provide one.
-E CODE, --exec CODE
A string of code that will be executed.
-e EDITOR, --editor EDITOR
The $EDITOR that is used for all interactive commands.
--environment ENVIRONMENT
The name of the environment. When this option is added to a
command, the command will run only against the named
environment.
-F FORMAT, --format FORMAT
The output format: summary (default), text, json, yaml, and pp.
-h, --help
Shows help for the command.
-k KEY, --key KEY
The private key that Knife will use to sign requests made by the
API client to the Chef server.
-p PATH:PATH, --script-path PATH:PATH
A colon-separated path at which Ruby scripts are located.
--print-after
Use to show data after a destructive operation.
-s URL, --server-url URL
The URL for the Chef server.
-u USER, --user USER
The user name used by Knife to sign requests made by the API
client to the Chef server. Authentication will fail if the user
name does not match the private key.
-v, --version
The version of the chef-client.
-V, --verbose
Set for more verbose outputs. Use -VV for maximum verbosity.
-y, --yes
Use to respond to all confirmation prompts with "Yes". Knife
will not ask for confirmation.
-z, --local-mode
Use to run the chef-client in local mode. This allows all
commands that work against the Chef server to also work against
the local chef-repo.
Examples
There are three ways to use knife exec to run Ruby script files. For
example:
$ knife exec /path/to/script_file
Or:
$ knife exec -E 'RUBY CODE'
Or:
$ knife exec
RUBY CODE
^D
To check the status of Knife using a Ruby script named "status.rb"
(which looks like):
printf "%-5s %-12s %-8s %s\n", "Check In", "Name", "Ruby", "Recipes"
nodes.all do |n|
checkin = Time.at(n['ohai_time']).strftime("%F %R")
rubyver = n['languages']['ruby']['version']
recipes = n.run_list.expand(_default).recipes.join(", ")
printf "%-20s %-12s %-8s %s\n", checkin, n.name, rubyver, recipes
end
and is located in a directory named "scripts", enter:
$ knife exec scripts/status.rb
To show the available free memory for all nodes, enter:
$ knife exec -E 'nodes.all {|n| puts "#{n.name} has #{n.memory.total} free memory"}'
To list all of the available search indexes, enter:
$ knife exec -E 'puts api.get("search").keys'
To query a node for multiple attributes using a Ruby script named
search_attributes.rb (which looks like):
% cat scripts/search_attributes.rb
query = ARGV[2]
attributes = ARGV[3].split(",")
puts "Your query: #{query}"
puts "Your attributes: #{attributes.join(" ")}"
results = {}
search(:node, query) do |n|
results[n.name] = {}
attributes.each {|a| results[n.name][a] = n[a]}
end
puts results
exit 0
enter:
% knife exec scripts/search_attributes.rb "hostname:test_system" ipaddress,fqdn
to return something like:
Your query: hostname:test_system
Your attributes: ipaddress fqdn
{"test_system.example.com"=>{"ipaddress"=>"10.1.1.200", "fqdn"=>"test_system.example.com"}}
AUTHOR
Chef
Chef 11.14 KNIFE-EXEC(1)