chef 0.9.8 → 0.9.10.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. data/README.rdoc +1 -1
  2. data/distro/common/man/man8/knife.8 +89 -79
  3. data/distro/common/markdown/knife.mkd +7 -0
  4. data/distro/debian/etc/default/chef-server +3 -0
  5. data/distro/debian/etc/default/chef-server-webui +3 -0
  6. data/distro/debian/etc/default/chef-solr +3 -0
  7. data/distro/debian/etc/default/chef-solr-indexer +3 -0
  8. data/distro/debian/etc/init.d/chef-server +3 -1
  9. data/distro/debian/etc/init.d/chef-server-webui +3 -1
  10. data/distro/redhat/etc/init.d/chef-client +1 -1
  11. data/lib/chef/application.rb +2 -0
  12. data/lib/chef/application/client.rb +5 -3
  13. data/lib/chef/application/knife.rb +16 -5
  14. data/lib/chef/application/solo.rb +0 -1
  15. data/lib/chef/checksum.rb +65 -1
  16. data/lib/chef/checksum_cache.rb +173 -0
  17. data/lib/chef/client.rb +84 -121
  18. data/lib/chef/cookbook/remote_file_vendor.rb +10 -3
  19. data/lib/chef/cookbook/syntax_check.rb +2 -2
  20. data/lib/chef/cookbook_loader.rb +2 -0
  21. data/lib/chef/cookbook_site_streaming_uploader.rb +29 -0
  22. data/lib/chef/cookbook_uploader.rb +8 -7
  23. data/lib/chef/cookbook_version.rb +155 -114
  24. data/lib/chef/exceptions.rb +5 -0
  25. data/lib/chef/handler.rb +43 -0
  26. data/lib/chef/index_queue/consumer.rb +1 -1
  27. data/lib/chef/index_queue/indexable.rb +1 -1
  28. data/lib/chef/knife.rb +18 -5
  29. data/lib/chef/knife/bootstrap.rb +2 -2
  30. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  31. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  32. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  33. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -7
  34. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  35. data/lib/chef/knife/configure_client.rb +4 -2
  36. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  37. data/lib/chef/knife/cookbook_site_share.rb +2 -1
  38. data/lib/chef/knife/cookbook_site_vendor.rb +6 -0
  39. data/lib/chef/knife/cookbook_test.rb +1 -1
  40. data/lib/chef/knife/ec2_server_create.rb +51 -26
  41. data/lib/chef/knife/exec.rb +52 -0
  42. data/lib/chef/knife/ssh.rb +27 -15
  43. data/lib/chef/knife/status.rb +27 -10
  44. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  45. data/lib/chef/mixin/checksum.rb +2 -2
  46. data/lib/chef/mixin/xml_escape.rb +75 -49
  47. data/lib/chef/node.rb +54 -58
  48. data/lib/chef/node/attribute.rb +61 -53
  49. data/lib/chef/platform.rb +19 -2
  50. data/lib/chef/provider/breakpoint.rb +1 -1
  51. data/lib/chef/provider/cookbook_file.rb +3 -3
  52. data/lib/chef/provider/cron.rb +3 -3
  53. data/lib/chef/provider/cron/solaris.rb +195 -0
  54. data/lib/chef/provider/deploy.rb +3 -3
  55. data/lib/chef/provider/directory.rb +2 -2
  56. data/lib/chef/provider/env.rb +5 -5
  57. data/lib/chef/provider/execute.rb +1 -1
  58. data/lib/chef/provider/file.rb +10 -9
  59. data/lib/chef/provider/git.rb +12 -4
  60. data/lib/chef/provider/group.rb +5 -5
  61. data/lib/chef/provider/http_request.rb +25 -9
  62. data/lib/chef/provider/ifconfig.rb +2 -2
  63. data/lib/chef/provider/link.rb +11 -6
  64. data/lib/chef/provider/log.rb +1 -0
  65. data/lib/chef/provider/mdadm.rb +3 -3
  66. data/lib/chef/provider/mount.rb +5 -5
  67. data/lib/chef/provider/mount/mount.rb +1 -1
  68. data/lib/chef/provider/ohai.rb +41 -0
  69. data/lib/chef/provider/package.rb +5 -5
  70. data/lib/chef/provider/package/yum-dump.py +5 -2
  71. data/lib/chef/provider/remote_directory.rb +11 -5
  72. data/lib/chef/provider/remote_file.rb +2 -2
  73. data/lib/chef/provider/route.rb +154 -133
  74. data/lib/chef/provider/ruby_block.rb +1 -1
  75. data/lib/chef/provider/service.rb +6 -6
  76. data/lib/chef/provider/subversion.rb +12 -9
  77. data/lib/chef/provider/template.rb +2 -2
  78. data/lib/chef/provider/user.rb +7 -7
  79. data/lib/chef/provider/user/useradd.rb +15 -1
  80. data/lib/chef/providers.rb +2 -0
  81. data/lib/chef/resource.rb +164 -58
  82. data/lib/chef/resource/http_request.rb +9 -0
  83. data/lib/chef/resource/ohai.rb +40 -0
  84. data/lib/chef/resource/remote_directory.rb +10 -1
  85. data/lib/chef/resource/rpm_package.rb +34 -0
  86. data/lib/chef/resource_collection.rb +3 -2
  87. data/lib/chef/resources.rb +2 -0
  88. data/lib/chef/rest.rb +13 -7
  89. data/lib/chef/rest/auth_credentials.rb +1 -1
  90. data/lib/chef/rest/rest_request.rb +3 -1
  91. data/lib/chef/runner.rb +31 -55
  92. data/lib/chef/shef/shef_session.rb +1 -1
  93. data/lib/chef/util/windows/net_use.rb +1 -1
  94. data/lib/chef/version.rb +1 -1
  95. data/lib/chef/webui_user.rb +0 -1
  96. metadata +38 -19
  97. data/lib/chef/cache.rb +0 -61
  98. data/lib/chef/cache/checksum.rb +0 -91
@@ -116,11 +116,11 @@ class Chef
116
116
  require 'highline'
117
117
 
118
118
  if @name_args.first == nil
119
- Chef::Log.error("Must pass a node name/ip to bootstrap")
119
+ Chef::Log.error("Must pass an FQDN or ip to bootstrap")
120
120
  exit 1
121
121
  end
122
122
 
123
- config[:server_name] = @name_args.first
123
+ config[:server_name] = Array(@name_args).first
124
124
 
125
125
  $stdout.sync = true
126
126
 
@@ -0,0 +1,44 @@
1
+ bash -c '
2
+ if [ ! -f /usr/bin/chef-client ]; then
3
+ pacman -Syy
4
+ pacman -S --noconfirm ruby ntp
5
+ ntpdate pool.ntp.org
6
+ gem install ohai chef --no-rdoc --no-ri --verbose <%= '--prerelease' if @config[:prerelease] %>
7
+ fi
8
+
9
+ mkdir -p /etc/chef
10
+ (
11
+ cat <<'EOP'
12
+ <%= IO.read(Chef::Config[:validation_key]) %>
13
+ EOP
14
+ ) > /tmp/validation.pem
15
+ awk NF /tmp/validation.pem > /etc/chef/validation.pem
16
+ rm /tmp/validation.pem
17
+
18
+ (
19
+ cat <<'EOP'
20
+ log_level :info
21
+ log_location STDOUT
22
+ chef_server_url "<%= Chef::Config[:chef_server_url] %>"
23
+ validation_client_name "<%= Chef::Config[:validation_client_name] %>"
24
+ <% if @config[:chef_node_name] == nil %>
25
+ # Using default node name (fqdn)
26
+ <% else %>
27
+ node_name "<%= @config[:chef_node_name] %>"
28
+ <% end %>
29
+ # ArchLinux follows the Filesystem Hierarchy Standard
30
+ file_cache_path "/var/cache/chef"
31
+ file_backup_path "/var/lib/chef/backup"
32
+ pid_file "/var/run/chef/client.pid"
33
+ cache_options({ :path => "/var/cache/chef/checksums", :skip_expires => true})
34
+ EOP
35
+ ) > /etc/chef/client.rb
36
+
37
+ (
38
+ cat <<'EOP'
39
+ <%= { "run_list" => @run_list }.to_json %>
40
+ EOP
41
+ ) > /etc/chef/first-boot.json
42
+
43
+ /usr/bin/chef-client -j /etc/chef/first-boot.json
44
+ '
@@ -0,0 +1,80 @@
1
+ '
2
+ ' Author:: Doug MacEachern <dougm@vmware.com>
3
+ ' Copyright:: Copyright (c) 2010 VMware, Inc.
4
+ ' License:: Apache License, Version 2.0
5
+ '
6
+ ' Licensed under the Apache License, Version 2.0 (the "License");
7
+ ' you may not use this file except in compliance with the License.
8
+ ' You may obtain a copy of the License at
9
+ '
10
+ ' http://www.apache.org/licenses/LICENSE-2.0
11
+ '
12
+ ' Unless required by applicable law or agreed to in writing, software
13
+ ' distributed under the License is distributed on an "AS IS" BASIS,
14
+ ' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ ' See the License for the specific language governing permissions and
16
+ ' limitations under the License.
17
+ '
18
+ ' download & install ruby && install chef client gems
19
+
20
+ Exe = "rubyinstaller-1.8.7-p249-rc2.exe"
21
+ Url = "http://rubyforge.org/frs/download.php/69034/" & Exe
22
+ Dst = "C:\Ruby"
23
+ Proxy = ""
24
+ If WScript.Arguments.Count = 1 Then
25
+ Proxy = WScript.Arguments.Item(0)
26
+ WScript.Echo "Using HTTP proxy=" & Proxy
27
+ End If
28
+
29
+ Set Shell = CreateObject("WScript.Shell")
30
+ Set Fs = CreateObject("Scripting.FileSystemObject")
31
+ If Fs.FileExists(Exe) Then
32
+ WScript.Echo "Using existing " & Exe
33
+ Else
34
+ WScript.Echo "Downloading " & Url
35
+ Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
36
+ If Proxy <> "" Then
37
+ Http.setProxy 2, Proxy, ""
38
+ End If
39
+ Http.Open "GET", Url, False
40
+ Http.Send
41
+ Set BinaryStream = CreateObject("ADODB.Stream")
42
+ BinaryStream.Type = 1
43
+ BinaryStream.Open
44
+ BinaryStream.Write Http.ResponseBody
45
+ BinaryStream.SaveToFile Exe, 2
46
+ BinaryStream.Close
47
+ End If
48
+
49
+ Ruby = Dst & "\bin\ruby.exe"
50
+
51
+ If Fs.FileExists(Ruby) Then
52
+ WScript.Echo Dst & " exists"
53
+ Else
54
+ WScript.Echo "Installing " & Exe & " to " & Dst
55
+ Cmd = Exe & " /dir=" & Dst & " /verysilent /tasks=assocfiles,modpath"
56
+ WScript.Echo Cmd
57
+ Set Exec = Shell.Exec(Cmd)
58
+ Do Until Exec.StdOut.AtEndOfStream
59
+ Line = Exec.StdOut.ReadLine()
60
+ Wscript.Echo Line
61
+ Loop
62
+ End If
63
+
64
+ GemProxy = ""
65
+ If Proxy <> "" Then
66
+ GemProxy = " --http-proxy=http://" & Proxy
67
+ End If
68
+
69
+ Cmd = Ruby & " " & Dst & "\bin\gem install" & GemProxy & " --no-ri --no-rdoc chef ruby-wmi windows-pr win32-open3 rubyzip"
70
+ WScript.Echo Cmd
71
+ Set Exec = Shell.Exec(Cmd)
72
+ Do Until Exec.StdOut.AtEndOfStream
73
+ Line = Exec.StdOut.ReadLine()
74
+ Wscript.Echo Line
75
+ Loop
76
+ Do Until Exec.StdErr.AtEndOfStream
77
+ Line = Exec.StdErr.ReadLine()
78
+ Wscript.Echo Line
79
+ Loop
80
+
@@ -3,9 +3,9 @@ if [ ! -f /usr/bin/chef-client ]; then
3
3
  echo "chef chef/chef_server_url string <%= Chef::Config[:chef_server_url] %>" | debconf-set-selections
4
4
  [ -f /etc/apt/sources.list.d/opscode.list ] || echo "deb http://apt.opscode.com lucid main" > /etc/apt/sources.list.d/opscode.list
5
5
  wget -O- http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
6
- apt-get update
7
- apt-get install -y chef
8
6
  fi
7
+ apt-get update
8
+ apt-get install -y chef
9
9
 
10
10
  <% unless Chef::Config[:validation_client_name] == "chef-validator" -%>
11
11
  [ `grep -qx "validation_client_name \"<%= Chef::Config[:validation_client_name] %>\"" /etc/chef/client.rb` ] || echo "validation_client_name \"<%= Chef::Config[:validation_client_name] %>\"" >> /etc/chef/client.rb
@@ -3,13 +3,12 @@ if [ ! -f /usr/bin/chef-client ]; then
3
3
  apt-get update
4
4
  apt-get install -y ruby ruby1.8-dev build-essential wget libruby-extras libruby1.8-extras
5
5
  cd /tmp
6
- wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
7
- tar xvf rubygems-1.3.6.tgz
8
- cd rubygems-1.3.6
9
- ruby setup.rb
10
- cp /usr/bin/gem1.8 /usr/bin/gem
11
- gem install ohai chef --no-rdoc --no-ri --verbose <%= '--prerelease' if @config[:prerelease] %>
6
+ wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
7
+ tar zxf rubygems-1.3.7.tgz
8
+ cd rubygems-1.3.7
9
+ ruby setup.rb --no-format-executable
12
10
  fi
11
+ gem install ohai chef --no-rdoc --no-ri --verbose <%= '--prerelease' if @config[:prerelease] %>
13
12
 
14
13
  mkdir -p /etc/chef
15
14
 
@@ -41,4 +40,4 @@ cat <<'EOP'
41
40
  EOP
42
41
  ) > /etc/chef/first-boot.json
43
42
 
44
- /usr/bin/chef-client -j /etc/chef/first-boot.json'
43
+ /usr/bin/chef-client -j /etc/chef/first-boot.json'
@@ -0,0 +1,34 @@
1
+ cscript /nologo client-install.vbs <%= @config[:proxy] %>
2
+
3
+ > c:/chef/etc/client.rb (
4
+ @echo.log_level :info
5
+ @echo.log_location STDOUT
6
+ @echo.chef_server_url "<%= Chef::Config[:chef_server_url] %>"
7
+ @echo.validation_client_name "<%= Chef::Config[:validation_client_name] %>"
8
+ @echo.client_key "c:/chef/etc/client.pem"
9
+ @echo.validation_key "c:/chef/etc/validation.pem"
10
+ @echo.checksum_path "c:/chef/var/checksums"
11
+ @echo.file_cache_path "c:/chef/var/cache"
12
+ @echo.file_backup_path "c:/chef/var/backup"
13
+ @echo.cache_options ^( {:path, "c:/chef/var/cache/checksums", :skip_expires, true} ^)
14
+ <% if Chef::Config[:http_proxy] != nil %>
15
+ @echo.http_proxy "<%= Chef::Config[:http_proxy] %>"
16
+ <% end %>
17
+ <% if Chef::Config[:https_proxy] != nil %>
18
+ @echo.https_proxy "<%= Chef::Config[:https_proxy] %>"
19
+ <% end %>
20
+ <% if Chef::Config[:no_proxy] != nil %>
21
+ @echo.no_proxy "<%= Chef::Config[:no_proxy] %>"
22
+ <% end %>
23
+ <% if @config[:chef_node_name] == nil %>
24
+ @echo.# Using default node name
25
+ <% else %>
26
+ @echo.node_name "<%= @config[:chef_node_name] %>"
27
+ <% end %>
28
+ )
29
+
30
+ > c:/chef/etc/first-boot.json (
31
+ @echo.<%= { "run_list" => @run_list }.to_json %>
32
+ )
33
+
34
+ c:/ruby/bin/ruby c:/ruby/bin/chef-client -c c:/chef/etc/client.rb -j c:/chef/etc/first-boot.json -l <%= Chef::Config[:log_level] %>"
@@ -31,7 +31,7 @@ class Chef
31
31
  end
32
32
 
33
33
  Chef::Log.info("Creating client configuration")
34
- system("mkdir -p #{@config_dir}")
34
+ FileUtils.mkdir_p(@config_dir)
35
35
  Chef::Log.info("Writing client.rb")
36
36
  File.open(File.join(@config_dir, "client.rb"), "w") do |file|
37
37
  file.puts('log_level :info')
@@ -40,7 +40,9 @@ class Chef
40
40
  file.puts("validation_client_name '#{Chef::Config[:validation_client_name]}'")
41
41
  end
42
42
  Chef::Log.info("Writing validation.pem")
43
- system("cp #{Chef::Config[:validation_key]} #{File.join(@config_dir, 'validation.pem')}")
43
+ File.open(File.join(@config_dir, 'validation.pem'), "w") do |validation|
44
+ validation.puts(IO.read(Chef::Config[:validation_key]))
45
+ end
44
46
  end
45
47
 
46
48
  end
@@ -55,7 +55,7 @@ class Chef
55
55
 
56
56
  def generate_metadata(cookbook)
57
57
  Chef::Log.info("Generating Metadata")
58
- config[:cookbook_path].reverse.each do |path|
58
+ Array(config[:cookbook_path]).reverse.each do |path|
59
59
  file = File.expand_path(File.join(path, cookbook, 'metadata.rb'))
60
60
  generate_metadata_from_file(cookbook, file)
61
61
  end
@@ -46,8 +46,9 @@ class Chef
46
46
  if cl.cookbook_exists?(cookbook_name)
47
47
  cookbook = cl[cookbook_name]
48
48
  Chef::CookbookUploader.validate_cookbook(cookbook)
49
- tmp_cookbook_dir = Chef::CookbookUploader.create_build_dir(cookbook)
49
+ tmp_cookbook_dir = Chef::CookbookSiteStreamingUploader.create_build_dir(cookbook)
50
50
  begin
51
+ Chef::Log.debug("temp cookbook directory is #{tmp_cookbook_dir.inspect}")
51
52
  Chef::Log.info("Making tarball #{cookbook_name}.tgz")
52
53
  Chef::Mixin::Command.run_command(:command => "tar -czf #{cookbook_name}.tgz #{cookbook_name}", :cwd => tmp_cookbook_dir)
53
54
  rescue => e
@@ -45,6 +45,12 @@ class Chef
45
45
  config[:cookbook_path] = Chef::Config[:cookbook_path]
46
46
  end
47
47
 
48
+ # Check to ensure we have a valid source of cookbooks before continuing
49
+ unless File.directory?(config[:cookbook_path].first)
50
+ Chef::Log.error( File.join(config[:cookbook_path].first, " doesn't exist!. Make sure you have cookbook_path configured correctly"))
51
+ exit 1
52
+ end
53
+
48
54
  vendor_path = File.expand_path(File.join(config[:cookbook_path].first))
49
55
  cookbook_path = File.join(vendor_path, name_args[0])
50
56
  upstream_file = File.join(vendor_path, "#{name_args[0]}.tar.gz")
@@ -19,7 +19,7 @@
19
19
  # limitations under the License.
20
20
  #
21
21
  require 'chef/knife'
22
- require 'chef/cache/checksum'
22
+ require 'chef/checksum_cache'
23
23
 
24
24
  class Chef
25
25
  class Knife
@@ -16,6 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require 'socket'
19
20
  require 'chef/knife'
20
21
  require 'json'
21
22
 
@@ -25,6 +26,8 @@ class Chef
25
26
 
26
27
  banner "knife ec2 server create [RUN LIST...] (options)"
27
28
 
29
+ attr_accessor :initial_sleep_delay
30
+
28
31
  option :flavor,
29
32
  :short => "-f FLAVOR",
30
33
  :long => "--flavor FLAVOR",
@@ -49,10 +52,15 @@ class Chef
49
52
  :description => "The Availability Zone",
50
53
  :default => "us-east-1b"
51
54
 
55
+ option :chef_node_name,
56
+ :short => "-N NAME",
57
+ :long => "--node-name NAME",
58
+ :description => "The Chef node name for your new node"
59
+
52
60
  option :ssh_key_name,
53
61
  :short => "-S KEY",
54
62
  :long => "--ssh-key KEY",
55
- :description => "The SSH root key",
63
+ :description => "The AWS SSH key id",
56
64
  :proc => Proc.new { |key| Chef::Config[:knife][:aws_ssh_key_id] = key }
57
65
 
58
66
  option :ssh_user,
@@ -107,6 +115,25 @@ class Chef
107
115
  @highline ||= HighLine.new
108
116
  end
109
117
 
118
+ def tcp_test_ssh(hostname)
119
+ tcp_socket = TCPSocket.new(hostname, 22)
120
+ readable = IO.select([tcp_socket], nil, nil, 5)
121
+ if readable
122
+ Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
123
+ yield
124
+ true
125
+ else
126
+ false
127
+ end
128
+ rescue Errno::ETIMEDOUT
129
+ false
130
+ rescue Errno::ECONNREFUSED
131
+ sleep 2
132
+ false
133
+ ensure
134
+ tcp_socket && tcp_socket.close
135
+ end
136
+
110
137
  def run
111
138
  require 'fog'
112
139
  require 'highline'
@@ -140,37 +167,21 @@ class Chef
140
167
 
141
168
  # wait for it to be ready to do stuff
142
169
  server.wait_for { print "."; ready? }
143
- puts "#{h.color("\nWaiting 10 seconds for SSH Host Key generation on", :magenta)}: #{server.dns_name}"
144
- sleep 10
145
170
 
146
- print "\n"
171
+ puts("\n")
172
+
147
173
 
148
174
  puts "#{h.color("Public DNS Name", :cyan)}: #{server.dns_name}"
149
175
  puts "#{h.color("Public IP Address", :cyan)}: #{server.ip_address}"
150
176
  puts "#{h.color("Private DNS Name", :cyan)}: #{server.private_dns_name}"
151
177
  puts "#{h.color("Private IP Address", :cyan)}: #{server.private_ip_address}"
152
178
 
153
- begin
154
- bootstrap = Chef::Knife::Bootstrap.new
155
- bootstrap.name_args = server.dns_name
156
- bootstrap.config[:run_list] = @name_args
157
- bootstrap.config[:ssh_user] = config[:ssh_user]
158
- bootstrap.config[:identity_file] = config[:identity_file]
159
- bootstrap.config[:chef_node_name] = server.id
160
- bootstrap.config[:prerelease] = config[:prerelease]
161
- bootstrap.config[:distro] = config[:distro]
162
- bootstrap.config[:use_sudo] = true
163
- bootstrap.config[:template_file] = config[:template_file]
164
- bootstrap.run
165
- rescue Errno::ECONNREFUSED
166
- puts h.color("Connection refused on SSH, retrying - CTRL-C to abort")
167
- sleep 1
168
- retry
169
- rescue Errno::ETIMEDOUT
170
- puts h.color("Connection timed out on SSH, retrying - CTRL-C to abort")
171
- sleep 1
172
- retry
173
- end
179
+ print "\n#{h.color("Waiting for sshd", :magenta)}"
180
+
181
+ print(".") until tcp_test_ssh(server.dns_name) { sleep @initial_sleep_delay ||= 10; puts("done") }
182
+
183
+
184
+ bootstrap_for_node(server).run
174
185
 
175
186
  puts "\n"
176
187
  puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
@@ -185,7 +196,21 @@ class Chef
185
196
  puts "#{h.color("Private IP Address", :cyan)}: #{server.private_ip_address}"
186
197
  puts "#{h.color("Run List", :cyan)}: #{@name_args.join(', ')}"
187
198
  end
199
+
200
+ def bootstrap_for_node(server)
201
+ bootstrap = Chef::Knife::Bootstrap.new
202
+ bootstrap.name_args = [server.dns_name]
203
+ bootstrap.config[:run_list] = @name_args
204
+ bootstrap.config[:ssh_user] = config[:ssh_user]
205
+ bootstrap.config[:identity_file] = config[:identity_file]
206
+ bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.id
207
+ bootstrap.config[:prerelease] = config[:prerelease]
208
+ bootstrap.config[:distro] = config[:distro]
209
+ bootstrap.config[:use_sudo] = true
210
+ bootstrap.config[:template_file] = config[:template_file]
211
+ bootstrap
212
+ end
213
+
188
214
  end
189
215
  end
190
216
  end
191
-
@@ -0,0 +1,52 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/knife'
20
+
21
+ class Chef::Knife::Exec < Chef::Knife
22
+
23
+ banner "knife exec [SCRIPT] (options)"
24
+
25
+ option :exec,
26
+ :short => "-E CODE",
27
+ :long => "--exec CODE",
28
+ :description => "a string of Chef code to execute"
29
+
30
+ def late_load_deps
31
+ require 'chef/shef/ext'
32
+ end
33
+
34
+ def run
35
+ late_load_deps
36
+ scripts = Array(name_args)
37
+ context = Object.new
38
+ Shef::Extensions.extend_context_object(context)
39
+ if config[:exec]
40
+ context.instance_eval(config[:exec], "-E Argument", 0)
41
+ elsif !scripts.empty?
42
+ scripts.each do |script|
43
+ file = File.expand_path(script)
44
+ context.instance_eval(IO.read(file), file, 0)
45
+ end
46
+ else
47
+ script = STDIN.read
48
+ context.instance_eval(script, "STDIN", 0)
49
+ end
50
+ end
51
+
52
+ end