1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>knife exec — Knife Man Pages</title>
<link rel="stylesheet" href="_static/chef.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="shortcut icon" href="_static/chef.ico"/>
<link rel="top" title="Knife Man Pages" href="index.html" />
</head>
<body>
<div style="background-color: #212c35; text-align: left; padding: 0px 0px 0px 0px">
<a href="http://docs.opscode.com/"><img src="_static/chef_html_logo.png" border="0" alt="Chef"/></a>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li><a href="http://docs.opscode.com/chef/knife.html" target="_products">Knife</a>•</li>
<li><a href="http://docs.opscode.com/chef/resources.html" target="_products">Resources</a>•</li>
<li><a href="http://docs.opscode.com/chef/dsl_recipe.html" target="_products">Recipe DSL</a>•</li>
<li><a href="http://docs.opscode.com/chef/lwrps_custom.html" target="_products">LWRPs</a>•</li>
<li><a href="http://docs.opscode.com/search.html">Search the Docs</a>•</li>
<li><a href="http://docs.opscode.com/">Home</a> »</li>
</ul>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="knife.html">
<img class="logo" src="_static/chef_logo.png" alt="Logo"/>
</a></p>
<h3><a href="knife.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">knife exec</a><ul>
<li><a class="reference internal" href="#authenticated-api-requests">Authenticated API Requests</a></li>
<li><a class="reference internal" href="#ruby-scripts">Ruby Scripts</a></li>
<li><a class="reference internal" href="#syntax">Syntax</a></li>
<li><a class="reference internal" href="#options">Options</a><ul>
<li><a class="reference internal" href="#knife-rb-settings">knife.rb Settings</a></li>
</ul>
</li>
<li><a class="reference internal" href="#examples">Examples</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="knife-exec">
<h1>knife exec<a class="headerlink" href="#knife-exec" title="Permalink to this headline">¶</a></h1>
<p>The <strong>knife exec</strong> 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 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.</p>
<div class="section" id="authenticated-api-requests">
<h2>Authenticated API Requests<a class="headerlink" href="#authenticated-api-requests" title="Permalink to this headline">¶</a></h2>
<p>The <tt class="docutils literal"><span class="pre">knife</span> <span class="pre">exec</span></tt> subcommand can be used to make authenticated API requests to the server using the following methods:</p>
<table border="1" class="docutils">
<colgroup>
<col width="13%" />
<col width="88%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Method</th>
<th class="head">Description</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">api.delete</span></tt></td>
<td>Use to delete an object from the server.</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">api.get</span></tt></td>
<td>Use to get the details of an object on the server.</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">api.post</span></tt></td>
<td>Use to add an object to the server.</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">api.put</span></tt></td>
<td>Use to update an object on the server.</td>
</tr>
</tbody>
</table>
<p>These methods are used with the <tt class="docutils literal"><span class="pre">-E</span></tt> option, which executes that string locally on the workstation using chef-shell. These methods have the following syntax:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'api.method(/endpoint)'</span>
</pre></div>
</div>
<p>where:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">api.method</span></tt> is the corresponding authentication method — <tt class="docutils literal"><span class="pre">api.delete</span></tt>, <tt class="docutils literal"><span class="pre">api.get</span></tt>, <tt class="docutils literal"><span class="pre">api.post</span></tt>, or <tt class="docutils literal"><span class="pre">api.put</span></tt></li>
<li><tt class="docutils literal"><span class="pre">/endpoint</span></tt> is an endpoint in the Chef Server API</li>
</ul>
<p>For example, to get the data for a node named “Example_Node”:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'puts api.get("/nodes/Example_Node")'</span>
</pre></div>
</div>
<p>and to ensure that the output is visible in the console, add the <tt class="docutils literal"><span class="pre">puts</span></tt> in front of the API authorization request:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'puts api.get("/nodes/Example_Node")'</span>
</pre></div>
</div>
<p>where <tt class="docutils literal"><span class="pre">puts</span></tt> is the shorter version of the <tt class="docutils literal"><span class="pre">$stdout.puts</span></tt> predefined variable in Ruby.</p>
<p>The following example shows how to add a client named “IBM305RAMAC” and the <tt class="docutils literal"><span class="pre">/clients</span></tt> endpoint, and then return the private key for that user in the console:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ client_desc</span> <span class="o">=</span> <span class="o">{</span>
<span class="s2">"name"</span> <span class="o">=</span>> <span class="s2">"IBM305RAMAC"</span>,
<span class="s2">"admin"</span> <span class="o">=</span>> <span class="nb">false</span>
<span class="o">}</span>
<span class="nv">new_client</span> <span class="o">=</span> api.post<span class="o">(</span><span class="s2">"/clients"</span>, client_desc<span class="o">)</span>
puts new_client<span class="o">[</span><span class="s2">"private_key"</span><span class="o">]</span>
</pre></div>
</div>
</div>
<div class="section" id="ruby-scripts">
<h2>Ruby Scripts<a class="headerlink" href="#ruby-scripts" title="Permalink to this headline">¶</a></h2>
<p>For Ruby scripts that will be run using the <tt class="docutils literal"><span class="pre">exec</span></tt> subcommand, note the following:</p>
<blockquote>
<div><ul class="simple">
<li>The Ruby script must be located on the system from which Knife is run (and not be located on any of the systems that Knife will be managing).</li>
<li>Shell commands will be run from a management workstation. For example, something like <tt class="docutils literal"><span class="pre">%x[ls</span> <span class="pre">-lash</span> <span class="pre">/opt/only-on-a-node]</span></tt> would give you the directory listing for the “opt/only-on-a-node” directory or a “No such file or directory” error if the file does not already exist locally.</li>
<li>When the chef-shell DSL is available, the chef-client DSL will not be (unless the management workstation is also a chef-client). Without the chef-client DSL, a bash block cannot be used to run bash commands.</li>
</ul>
</div></blockquote>
</div>
<div class="section" id="syntax">
<h2>Syntax<a class="headerlink" href="#syntax" title="Permalink to this headline">¶</a></h2>
<p>This argument has the following syntax:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec </span>SCRIPT <span class="o">(</span>options<span class="o">)</span>
</pre></div>
</div>
</div>
<div class="section" id="options">
<h2>Options<a class="headerlink" href="#options" title="Permalink to this headline">¶</a></h2>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Review the list of <a class="reference internal" href="knife_common_options.html"><em>common options</em></a> available to this (and all) Knife subcommands and plugins.</p>
</div>
<p>This subcommand has the following options:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">-E</span> <span class="pre">CODE</span></tt>, <tt class="docutils literal"><span class="pre">--exec</span> <span class="pre">CODE</span></tt></dt>
<dd>A string of code that will be executed.</dd>
<dt><tt class="docutils literal"><span class="pre">-p</span> <span class="pre">PATH:PATH</span></tt>, <tt class="docutils literal"><span class="pre">--script-path</span> <span class="pre">PATH:PATH</span></tt></dt>
<dd>A colon-separated path at which Ruby scripts are located.</dd>
</dl>
<div class="section" id="knife-rb-settings">
<h3>knife.rb Settings<a class="headerlink" href="#knife-rb-settings" title="Permalink to this headline">¶</a></h3>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">See <tt class="xref doc docutils literal"><span class="pre">knife.rb</span></tt> for more information about how to add optional settings to the knife.rb file.</p>
</div>
<p>The following <tt class="docutils literal"><span class="pre">knife</span> <span class="pre">exec</span></tt> settings can be added to the knife.rb file:</p>
<dl class="docutils">
<dt><tt class="docutils literal"><span class="pre">knife[:exec]</span></tt></dt>
<dd>Use to add the <tt class="docutils literal"><span class="pre">--exec</span></tt> option.</dd>
<dt><tt class="docutils literal"><span class="pre">knife[:script_path]</span></tt></dt>
<dd>Use to add the <tt class="docutils literal"><span class="pre">--script-path</span></tt> option.</dd>
</dl>
</div>
</div>
<div class="section" id="examples">
<h2>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h2>
<p>The following examples show how to use this Knife subcommand:</p>
<p><strong>Run Ruby scripts</strong></p>
<p>There are three ways to use <strong>knife exec</strong> to run Ruby script files. For example:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> /path/to/script_file
</pre></div>
</div>
<p>Or:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'RUBY CODE'</span>
</pre></div>
</div>
<p>Or:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span>
RUBY CODE
^D
</pre></div>
</div>
<p><strong>Chef Knife status</strong></p>
<p>To check the status of Knife using a Ruby script named “status.rb” (which looks like):</p>
<div class="highlight-ruby"><div class="highlight"><pre><span class="nb">printf</span> <span class="s2">"%-5s %-12s %-8s %s</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"Check In"</span><span class="p">,</span> <span class="s2">"Name"</span><span class="p">,</span> <span class="s2">"Ruby"</span><span class="p">,</span> <span class="s2">"Recipes"</span>
<span class="n">nodes</span><span class="o">.</span><span class="n">all</span> <span class="k">do</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span>
<span class="n">checkin</span> <span class="o">=</span> <span class="no">Time</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="n">n</span><span class="o">[</span><span class="s1">'ohai_time'</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%F %R"</span><span class="p">)</span>
<span class="n">rubyver</span> <span class="o">=</span> <span class="n">n</span><span class="o">[</span><span class="s1">'languages'</span><span class="o">][</span><span class="s1">'ruby'</span><span class="o">][</span><span class="s1">'version'</span><span class="o">]</span>
<span class="n">recipes</span> <span class="o">=</span> <span class="n">n</span><span class="o">.</span><span class="n">run_list</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="n">_default</span><span class="p">)</span><span class="o">.</span><span class="n">recipes</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span>
<span class="nb">printf</span> <span class="s2">"%-20s %-12s %-8s %s</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span> <span class="n">checkin</span><span class="p">,</span> <span class="n">n</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">rubyver</span><span class="p">,</span> <span class="n">recipes</span>
<span class="k">end</span>
</pre></div>
</div>
<p>and is located in a directory named “scripts”, enter:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec </span>scripts/status.rb
</pre></div>
</div>
<p><strong>List available free memory</strong></p>
<p>To show the available free memory for all nodes, enter:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'nodes.all {|n| puts "#{n.name} has #{n.memory.total} free memory"}'</span>
</pre></div>
</div>
<p><strong>List available search indexes</strong></p>
<p>To list all of the available search indexes, enter:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>knife <span class="nb">exec</span> -E <span class="s1">'puts api.get("search").keys'</span>
</pre></div>
</div>
<p><strong>Query for multiple attributes</strong></p>
<p>To query a node for multiple attributes using a Ruby script named <tt class="docutils literal"><span class="pre">search_attributes.rb</span></tt> (which looks like):</p>
<div class="highlight-ruby"><div class="highlight"><pre><span class="sx">% cat </span><span class="n">scripts</span><span class="o">/</span><span class="n">search_attributes</span><span class="o">.</span><span class="n">rb</span>
<span class="n">query</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span>
<span class="n">attributes</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">split</span><span class="p">(</span><span class="s2">","</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Your query: </span><span class="si">#{</span><span class="n">query</span><span class="si">}</span><span class="s2">"</span>
<span class="nb">puts</span> <span class="s2">"Your attributes: </span><span class="si">#{</span><span class="n">attributes</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">search</span><span class="p">(</span><span class="ss">:node</span><span class="p">,</span> <span class="n">query</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">n</span><span class="o">|</span>
<span class="n">results</span><span class="o">[</span><span class="n">n</span><span class="o">.</span><span class="n">name</span><span class="o">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">attributes</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="n">a</span><span class="o">|</span> <span class="n">results</span><span class="o">[</span><span class="n">n</span><span class="o">.</span><span class="n">name</span><span class="o">][</span><span class="n">a</span><span class="o">]</span> <span class="o">=</span> <span class="n">n</span><span class="o">[</span><span class="n">a</span><span class="o">]</span><span class="p">}</span>
<span class="k">end</span>
<span class="nb">puts</span> <span class="n">results</span>
<span class="nb">exit</span> <span class="mi">0</span>
</pre></div>
</div>
<p>enter:</p>
<div class="highlight-bash"><div class="highlight"><pre>% knife <span class="nb">exec </span>scripts/search_attributes.rb <span class="s2">"hostname:test_system"</span> ipaddress,fqdn
</pre></div>
</div>
<p>to return something like:</p>
<div class="highlight-bash"><div class="highlight"><pre>Your query: hostname:test_system
Your attributes: ipaddress fqdn
<span class="o">{</span><span class="s2">"test_system.example.com"</span><span class="o">=</span>><span class="o">{</span><span class="s2">"ipaddress"</span><span class="o">=</span>><span class="s2">"10.1.1.200"</span>, <span class="s2">"fqdn"</span><span class="o">=</span>><span class="s2">"test_system.example.com"</span><span class="o">}}</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li><a href="http://docs.opscode.com/chef/knife.html" target="_products">Knife</a>•</li>
<li><a href="http://docs.opscode.com/chef/resources.html" target="_products">Resources</a>•</li>
<li><a href="http://docs.opscode.com/chef/dsl_recipe.html" target="_products">Recipe DSL</a>•</li>
<li><a href="http://docs.opscode.com/chef/lwrps_custom.html" target="_products">LWRPs</a>•</li>
<li><a href="http://docs.opscode.com/search.html">Search the Docs</a>•</li>
<li><a href="http://docs.opscode.com/">Home</a> »</li>
</ul>
</div>
<div class="footer">
Documentation for current man pages for Knife.
Send feedback to <a href="mailto:docs@getchef.com">docs@getchef.com</a>.
This work is licensed under a Creative Commons Attribution 3.0 Unported License.
</div>
<!-- Start of Async Google Analytics Code -->
<script type="text/javascript">
var _gaq = _gaq || [];
var pluginUrl = (('https:' == document.location.protocol) ? 'https://ssl.' : 'http://www.') + 'google-analytics.com/plugins/ga/inpage_linkid.js';
_gaq.push(['_setAccount', 'UA-6369228-7']);
_gaq.push(['_setDomainName', '.opscode.com']);
_gaq.push(['_setAllowHash', false]);
_gaq.push(['_setAllowLinker', true]);
_gaq.push(['_addIgnoredRef','opscode.com']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s); })();
</script>
<!-- End of Async Google Analytics Code -->
<!-- Start of Contact Analytics Code -->
<script type="text/javascript">
(function() {
var didInit = false;
function initMunchkin() {
if(didInit === false) {
didInit = true;
Munchkin.init('255-VFB-268');
}
}
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = document.location.protocol + '//munchkin.marketo.net/munchkin.js';
s.onreadystatechange = function() {
if (this.readyState == 'complete' || this.readyState == 'loaded') {
initMunchkin();
}
};
s.onload = initMunchkin;
document.getElementsByTagName('head')[0].appendChild(s);
})();
</script>
<!-- End of Contact Analytics Code -->
</body>
</html>
|