chef 0.9.18 → 0.10.0.beta.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.
- data/README.rdoc +0 -3
- data/distro/arch/etc/rc.d/chef-server +0 -4
- data/distro/arch/etc/rc.d/chef-server-webui +0 -4
- data/distro/arch/etc/rc.d/chef-solr +0 -4
- data/distro/arch/etc/rc.d/chef-solr-indexer +0 -4
- data/lib/chef.rb +3 -3
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application.rb +11 -1
- data/lib/chef/application/client.rb +18 -22
- data/lib/chef/application/knife.rb +28 -29
- data/lib/chef/application/solo.rb +14 -12
- data/lib/chef/client.rb +112 -54
- data/lib/chef/config.rb +4 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +6 -5
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +10 -8
- data/lib/chef/cookbook/metadata.rb +200 -108
- data/lib/chef/cookbook_loader.rb +39 -163
- data/lib/chef/cookbook_uploader.rb +100 -78
- data/lib/chef/cookbook_version.rb +92 -47
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +9 -1
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +82 -1
- data/lib/chef/index_queue/amqp_client.rb +15 -12
- data/lib/chef/index_queue/indexable.rb +38 -4
- data/lib/chef/json_compat.rb +3 -3
- data/lib/chef/knife.rb +97 -202
- data/lib/chef/knife/bootstrap.rb +27 -61
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +4 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +6 -15
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -4
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -5
- data/lib/chef/knife/client_bulk_delete.rb +6 -3
- data/lib/chef/knife/client_create.rb +13 -10
- data/lib/chef/knife/client_delete.rb +10 -7
- data/lib/chef/knife/client_edit.rb +9 -6
- data/lib/chef/knife/client_list.rb +8 -5
- data/lib/chef/knife/client_reregister.rb +9 -6
- data/lib/chef/knife/client_show.rb +9 -6
- data/lib/chef/knife/configure.rb +15 -19
- data/lib/chef/knife/configure_client.rb +4 -4
- data/lib/chef/knife/cookbook_bulk_delete.rb +11 -8
- data/lib/chef/knife/cookbook_create.rb +120 -55
- data/lib/chef/knife/cookbook_delete.rb +18 -12
- data/lib/chef/knife/cookbook_download.rb +10 -6
- data/lib/chef/knife/cookbook_list.rb +15 -6
- data/lib/chef/knife/cookbook_metadata.rb +41 -21
- data/lib/chef/knife/cookbook_metadata_from_file.rb +4 -0
- data/lib/chef/knife/cookbook_show.rb +16 -5
- data/lib/chef/knife/cookbook_site_download.rb +2 -2
- data/lib/chef/knife/cookbook_site_share.rb +18 -13
- data/lib/chef/knife/cookbook_site_unshare.rb +7 -4
- data/lib/chef/knife/cookbook_site_vendor.rb +21 -18
- data/lib/chef/knife/cookbook_test.rb +14 -14
- data/lib/chef/knife/cookbook_upload.rb +91 -40
- data/lib/chef/knife/data_bag_create.rb +41 -6
- data/lib/chef/knife/data_bag_delete.rb +5 -3
- data/lib/chef/knife/data_bag_edit.rb +55 -11
- data/lib/chef/knife/data_bag_from_file.rb +47 -7
- data/lib/chef/knife/data_bag_list.rb +4 -1
- data/lib/chef/knife/data_bag_show.rb +44 -4
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +8 -9
- data/lib/chef/knife/node_bulk_delete.rb +9 -6
- data/lib/chef/knife/node_create.rb +9 -6
- data/lib/chef/knife/node_delete.rb +10 -7
- data/lib/chef/knife/node_edit.rb +129 -10
- data/lib/chef/knife/node_from_file.rb +10 -7
- data/lib/chef/knife/node_list.rb +11 -6
- data/lib/chef/knife/node_run_list_add.rb +10 -7
- data/lib/chef/knife/node_run_list_remove.rb +9 -6
- data/lib/chef/knife/node_show.rb +15 -7
- data/lib/chef/knife/recipe_list.rb +4 -3
- data/lib/chef/knife/role_bulk_delete.rb +9 -6
- data/lib/chef/knife/role_create.rb +9 -6
- data/lib/chef/knife/role_delete.rb +10 -7
- data/lib/chef/knife/role_edit.rb +11 -8
- data/lib/chef/knife/role_from_file.rb +10 -7
- data/lib/chef/knife/role_list.rb +8 -5
- data/lib/chef/knife/role_show.rb +11 -8
- data/lib/chef/knife/search.rb +33 -10
- data/lib/chef/knife/ssh.rb +33 -61
- data/lib/chef/knife/status.rb +7 -4
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +229 -0
- data/lib/chef/knife/windows_bootstrap.rb +8 -5
- data/lib/chef/log.rb +5 -59
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixins.rb +1 -2
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +96 -34
- data/lib/chef/platform.rb +27 -0
- data/lib/chef/provider/cookbook_file.rb +21 -20
- data/lib/chef/provider/deploy/revision.rb +3 -0
- data/lib/chef/provider/file.rb +20 -11
- data/lib/chef/provider/git.rb +26 -26
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/groupadd.rb +7 -4
- data/lib/chef/provider/group/usermod.rb +1 -1
- data/lib/chef/provider/package.rb +28 -28
- data/lib/chef/provider/package/dpkg.rb +1 -1
- data/lib/chef/provider/package/portage.rb +50 -39
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/zypper.rb +3 -20
- data/lib/chef/provider/remote_directory.rb +0 -2
- data/lib/chef/provider/remote_file.rb +2 -3
- data/lib/chef/provider/service/arch.rb +28 -35
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/subversion.rb +22 -22
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +10 -12
- data/lib/chef/resource.rb +49 -42
- data/lib/chef/resource/gem_package.rb +7 -3
- data/lib/chef/resource/git.rb +5 -5
- data/lib/chef/resource/package.rb +7 -7
- data/lib/chef/resource/scm.rb +2 -1
- data/lib/chef/resource/solaris_package.rb +0 -1
- data/lib/chef/resource/yum_package.rb +0 -1
- data/lib/chef/rest.rb +7 -16
- data/lib/chef/rest/rest_request.rb +0 -16
- data/lib/chef/role.rb +67 -13
- data/lib/chef/run_context.rb +37 -21
- data/lib/chef/run_list.rb +30 -15
- data/lib/chef/run_list/run_list_expansion.rb +41 -20
- data/lib/chef/run_list/run_list_item.rb +20 -6
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/runner.rb +7 -15
- data/lib/chef/search/query.rb +12 -7
- data/lib/chef/shef.rb +6 -7
- data/lib/chef/shef/shef_session.rb +40 -35
- data/lib/chef/shell_out.rb +22 -201
- data/lib/chef/shell_out/unix.rb +224 -0
- data/lib/chef/shell_out/windows.rb +95 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +145 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/version.rb +4 -2
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- metadata +68 -37
- data/lib/chef/cookbook/metadata/version.rb +0 -87
- data/lib/chef/knife/bluebox_images_list.rb +0 -54
- data/lib/chef/knife/bluebox_server_create.rb +0 -157
- data/lib/chef/knife/bluebox_server_delete.rb +0 -63
- data/lib/chef/knife/bluebox_server_list.rb +0 -59
- data/lib/chef/knife/ec2_instance_data.rb +0 -46
- data/lib/chef/knife/ec2_server_create.rb +0 -218
- data/lib/chef/knife/ec2_server_delete.rb +0 -87
- data/lib/chef/knife/ec2_server_list.rb +0 -89
- data/lib/chef/knife/rackspace_server_create.rb +0 -184
- data/lib/chef/knife/rackspace_server_delete.rb +0 -57
- data/lib/chef/knife/rackspace_server_list.rb +0 -59
- data/lib/chef/knife/slicehost_images_list.rb +0 -53
- data/lib/chef/knife/slicehost_server_create.rb +0 -103
- data/lib/chef/knife/slicehost_server_delete.rb +0 -61
- data/lib/chef/knife/slicehost_server_list.rb +0 -64
- data/lib/chef/knife/terremark_server_create.rb +0 -152
- data/lib/chef/knife/terremark_server_delete.rb +0 -87
- data/lib/chef/knife/terremark_server_list.rb +0 -77
- data/lib/chef/mixin/find_preferred_file.rb +0 -92
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Author:: Adam Jacob (<adam@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 'socket'
|
|
20
|
-
require 'chef/knife'
|
|
21
|
-
require 'chef/json_compat'
|
|
22
|
-
|
|
23
|
-
class Chef
|
|
24
|
-
class Knife
|
|
25
|
-
class Ec2ServerCreate < Knife
|
|
26
|
-
|
|
27
|
-
banner "knife ec2 server create [RUN LIST...] (options)"
|
|
28
|
-
|
|
29
|
-
attr_accessor :initial_sleep_delay
|
|
30
|
-
|
|
31
|
-
option :flavor,
|
|
32
|
-
:short => "-f FLAVOR",
|
|
33
|
-
:long => "--flavor FLAVOR",
|
|
34
|
-
:description => "The flavor of server (m1.small, m1.medium, etc)",
|
|
35
|
-
:default => "m1.small"
|
|
36
|
-
|
|
37
|
-
option :image,
|
|
38
|
-
:short => "-i IMAGE",
|
|
39
|
-
:long => "--image IMAGE",
|
|
40
|
-
:description => "The AMI for the server"
|
|
41
|
-
|
|
42
|
-
option :security_groups,
|
|
43
|
-
:short => "-G X,Y,Z",
|
|
44
|
-
:long => "--groups X,Y,Z",
|
|
45
|
-
:description => "The security groups for this server",
|
|
46
|
-
:default => ["default"],
|
|
47
|
-
:proc => Proc.new { |groups| groups.split(',') }
|
|
48
|
-
|
|
49
|
-
option :availability_zone,
|
|
50
|
-
:short => "-Z ZONE",
|
|
51
|
-
:long => "--availability-zone ZONE",
|
|
52
|
-
:description => "The Availability Zone",
|
|
53
|
-
:default => "us-east-1b",
|
|
54
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:availability_zone] = key }
|
|
55
|
-
|
|
56
|
-
option :chef_node_name,
|
|
57
|
-
:short => "-N NAME",
|
|
58
|
-
:long => "--node-name NAME",
|
|
59
|
-
:description => "The Chef node name for your new node"
|
|
60
|
-
|
|
61
|
-
option :ssh_key_name,
|
|
62
|
-
:short => "-S KEY",
|
|
63
|
-
:long => "--ssh-key KEY",
|
|
64
|
-
:description => "The AWS SSH key id",
|
|
65
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_ssh_key_id] = key }
|
|
66
|
-
|
|
67
|
-
option :ssh_user,
|
|
68
|
-
:short => "-x USERNAME",
|
|
69
|
-
:long => "--ssh-user USERNAME",
|
|
70
|
-
:description => "The ssh username",
|
|
71
|
-
:default => "root"
|
|
72
|
-
|
|
73
|
-
option :ssh_password,
|
|
74
|
-
:short => "-P PASSWORD",
|
|
75
|
-
:long => "--ssh-password PASSWORD",
|
|
76
|
-
:description => "The ssh password"
|
|
77
|
-
|
|
78
|
-
option :identity_file,
|
|
79
|
-
:short => "-I IDENTITY_FILE",
|
|
80
|
-
:long => "--identity-file IDENTITY_FILE",
|
|
81
|
-
:description => "The SSH identity file used for authentication"
|
|
82
|
-
|
|
83
|
-
option :aws_access_key_id,
|
|
84
|
-
:short => "-A ID",
|
|
85
|
-
:long => "--aws-access-key-id KEY",
|
|
86
|
-
:description => "Your AWS Access Key ID",
|
|
87
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_access_key_id] = key }
|
|
88
|
-
|
|
89
|
-
option :aws_secret_access_key,
|
|
90
|
-
:short => "-K SECRET",
|
|
91
|
-
:long => "--aws-secret-access-key SECRET",
|
|
92
|
-
:description => "Your AWS API Secret Access Key",
|
|
93
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_secret_access_key] = key }
|
|
94
|
-
|
|
95
|
-
option :prerelease,
|
|
96
|
-
:long => "--prerelease",
|
|
97
|
-
:description => "Install the pre-release chef gems"
|
|
98
|
-
|
|
99
|
-
option :region,
|
|
100
|
-
:long => "--region REGION",
|
|
101
|
-
:description => "Your AWS region",
|
|
102
|
-
:default => "us-east-1",
|
|
103
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:region] = key }
|
|
104
|
-
|
|
105
|
-
option :distro,
|
|
106
|
-
:short => "-d DISTRO",
|
|
107
|
-
:long => "--distro DISTRO",
|
|
108
|
-
:description => "Bootstrap a distro using a template",
|
|
109
|
-
:default => "ubuntu10.04-gems"
|
|
110
|
-
|
|
111
|
-
option :template_file,
|
|
112
|
-
:long => "--template-file TEMPLATE",
|
|
113
|
-
:description => "Full path to location of template to use",
|
|
114
|
-
:default => false
|
|
115
|
-
|
|
116
|
-
def h
|
|
117
|
-
@highline ||= HighLine.new
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def tcp_test_ssh(hostname)
|
|
121
|
-
tcp_socket = TCPSocket.new(hostname, 22)
|
|
122
|
-
readable = IO.select([tcp_socket], nil, nil, 5)
|
|
123
|
-
if readable
|
|
124
|
-
Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
|
|
125
|
-
yield
|
|
126
|
-
true
|
|
127
|
-
else
|
|
128
|
-
false
|
|
129
|
-
end
|
|
130
|
-
rescue Errno::ETIMEDOUT
|
|
131
|
-
false
|
|
132
|
-
rescue Errno::ECONNREFUSED
|
|
133
|
-
sleep 2
|
|
134
|
-
false
|
|
135
|
-
ensure
|
|
136
|
-
tcp_socket && tcp_socket.close
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def run
|
|
140
|
-
require 'fog'
|
|
141
|
-
require 'highline'
|
|
142
|
-
require 'net/ssh/multi'
|
|
143
|
-
require 'readline'
|
|
144
|
-
|
|
145
|
-
$stdout.sync = true
|
|
146
|
-
|
|
147
|
-
connection = Fog::AWS::Compute.new(
|
|
148
|
-
:aws_access_key_id => Chef::Config[:knife][:aws_access_key_id],
|
|
149
|
-
:aws_secret_access_key => Chef::Config[:knife][:aws_secret_access_key],
|
|
150
|
-
:region => Chef::Config[:knife][:region]
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
server = connection.servers.create(
|
|
154
|
-
:image_id => config[:image],
|
|
155
|
-
:groups => config[:security_groups],
|
|
156
|
-
:flavor_id => config[:flavor],
|
|
157
|
-
:key_name => Chef::Config[:knife][:aws_ssh_key_id],
|
|
158
|
-
:availability_zone => Chef::Config[:knife][:availability_zone]
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
|
|
162
|
-
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
|
|
163
|
-
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
|
|
164
|
-
puts "#{h.color("Availability Zone", :cyan)}: #{server.availability_zone}"
|
|
165
|
-
puts "#{h.color("Security Groups", :cyan)}: #{server.groups.join(", ")}"
|
|
166
|
-
puts "#{h.color("SSH Key", :cyan)}: #{server.key_name}"
|
|
167
|
-
|
|
168
|
-
print "\n#{h.color("Waiting for server", :magenta)}"
|
|
169
|
-
|
|
170
|
-
# wait for it to be ready to do stuff
|
|
171
|
-
server.wait_for { print "."; ready? }
|
|
172
|
-
|
|
173
|
-
puts("\n")
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
puts "#{h.color("Public DNS Name", :cyan)}: #{server.dns_name}"
|
|
177
|
-
puts "#{h.color("Public IP Address", :cyan)}: #{server.ip_address}"
|
|
178
|
-
puts "#{h.color("Private DNS Name", :cyan)}: #{server.private_dns_name}"
|
|
179
|
-
puts "#{h.color("Private IP Address", :cyan)}: #{server.private_ip_address}"
|
|
180
|
-
|
|
181
|
-
print "\n#{h.color("Waiting for sshd", :magenta)}"
|
|
182
|
-
|
|
183
|
-
print(".") until tcp_test_ssh(server.dns_name) { sleep @initial_sleep_delay ||= 10; puts("done") }
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
bootstrap_for_node(server).run
|
|
187
|
-
|
|
188
|
-
puts "\n"
|
|
189
|
-
puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
|
|
190
|
-
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
|
|
191
|
-
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
|
|
192
|
-
puts "#{h.color("Availability Zone", :cyan)}: #{server.availability_zone}"
|
|
193
|
-
puts "#{h.color("Security Groups", :cyan)}: #{server.groups.join(", ")}"
|
|
194
|
-
puts "#{h.color("SSH Key", :cyan)}: #{server.key_name}"
|
|
195
|
-
puts "#{h.color("Public DNS Name", :cyan)}: #{server.dns_name}"
|
|
196
|
-
puts "#{h.color("Public IP Address", :cyan)}: #{server.ip_address}"
|
|
197
|
-
puts "#{h.color("Private DNS Name", :cyan)}: #{server.private_dns_name}"
|
|
198
|
-
puts "#{h.color("Private IP Address", :cyan)}: #{server.private_ip_address}"
|
|
199
|
-
puts "#{h.color("Run List", :cyan)}: #{@name_args.join(', ')}"
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def bootstrap_for_node(server)
|
|
203
|
-
bootstrap = Chef::Knife::Bootstrap.new
|
|
204
|
-
bootstrap.name_args = [server.dns_name]
|
|
205
|
-
bootstrap.config[:run_list] = @name_args
|
|
206
|
-
bootstrap.config[:ssh_user] = config[:ssh_user]
|
|
207
|
-
bootstrap.config[:identity_file] = config[:identity_file]
|
|
208
|
-
bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.id
|
|
209
|
-
bootstrap.config[:prerelease] = config[:prerelease]
|
|
210
|
-
bootstrap.config[:distro] = config[:distro]
|
|
211
|
-
bootstrap.config[:use_sudo] = true
|
|
212
|
-
bootstrap.config[:template_file] = config[:template_file]
|
|
213
|
-
bootstrap
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
end
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
-
# Copyright:: Copyright (c) 2009 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
|
-
require 'chef/json_compat'
|
|
21
|
-
|
|
22
|
-
class Chef
|
|
23
|
-
class Knife
|
|
24
|
-
class Ec2ServerDelete < Knife
|
|
25
|
-
|
|
26
|
-
banner "knife ec2 server delete SERVER [SERVER] (options)"
|
|
27
|
-
|
|
28
|
-
option :aws_access_key_id,
|
|
29
|
-
:short => "-A ID",
|
|
30
|
-
:long => "--aws-access-key-id KEY",
|
|
31
|
-
:description => "Your AWS Access Key ID",
|
|
32
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_access_key_id] = key }
|
|
33
|
-
|
|
34
|
-
option :aws_secret_access_key,
|
|
35
|
-
:short => "-K SECRET",
|
|
36
|
-
:long => "--aws-secret-access-key SECRET",
|
|
37
|
-
:description => "Your AWS API Secret Access Key",
|
|
38
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_secret_access_key] = key }
|
|
39
|
-
|
|
40
|
-
option :region,
|
|
41
|
-
:long => "--region REGION",
|
|
42
|
-
:description => "Your AWS region",
|
|
43
|
-
:default => "us-east-1",
|
|
44
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:region] = key }
|
|
45
|
-
|
|
46
|
-
def h
|
|
47
|
-
@highline ||= HighLine.new
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def run
|
|
51
|
-
require 'fog'
|
|
52
|
-
require 'highline'
|
|
53
|
-
require 'net/ssh/multi'
|
|
54
|
-
require 'readline'
|
|
55
|
-
|
|
56
|
-
connection = Fog::AWS::Compute.new(
|
|
57
|
-
:aws_access_key_id => Chef::Config[:knife][:aws_access_key_id],
|
|
58
|
-
:aws_secret_access_key => Chef::Config[:knife][:aws_secret_access_key],
|
|
59
|
-
:region => Chef::Config[:knife][:region]
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
@name_args.each do |instance_id|
|
|
63
|
-
server = connection.servers.get(instance_id)
|
|
64
|
-
|
|
65
|
-
puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
|
|
66
|
-
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
|
|
67
|
-
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
|
|
68
|
-
puts "#{h.color("Availability Zone", :cyan)}: #{server.availability_zone}"
|
|
69
|
-
puts "#{h.color("Security Groups", :cyan)}: #{server.groups.join(", ")}"
|
|
70
|
-
puts "#{h.color("SSH Key", :cyan)}: #{server.key_name}"
|
|
71
|
-
puts "#{h.color("Public DNS Name", :cyan)}: #{server.dns_name}"
|
|
72
|
-
puts "#{h.color("Public IP Address", :cyan)}: #{server.ip_address}"
|
|
73
|
-
puts "#{h.color("Private DNS Name", :cyan)}: #{server.private_dns_name}"
|
|
74
|
-
puts "#{h.color("Private IP Address", :cyan)}: #{server.private_ip_address}"
|
|
75
|
-
|
|
76
|
-
puts "\n"
|
|
77
|
-
confirm("Do you really want to delete this server")
|
|
78
|
-
|
|
79
|
-
server.destroy
|
|
80
|
-
|
|
81
|
-
Chef::Log.warn("Deleted server #{server.id}")
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Author:: Adam Jacob (<adam@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
|
-
require 'chef/json_compat'
|
|
21
|
-
|
|
22
|
-
class Chef
|
|
23
|
-
class Knife
|
|
24
|
-
class Ec2ServerList < Knife
|
|
25
|
-
|
|
26
|
-
banner "knife ec2 server list [RUN LIST...] (options)"
|
|
27
|
-
|
|
28
|
-
option :aws_access_key_id,
|
|
29
|
-
:short => "-A ID",
|
|
30
|
-
:long => "--aws-access-key-id KEY",
|
|
31
|
-
:description => "Your AWS Access Key ID",
|
|
32
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_access_key_id] = key }
|
|
33
|
-
|
|
34
|
-
option :aws_secret_access_key,
|
|
35
|
-
:short => "-K SECRET",
|
|
36
|
-
:long => "--aws-secret-access-key SECRET",
|
|
37
|
-
:description => "Your AWS API Secret Access Key",
|
|
38
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:aws_secret_access_key] = key }
|
|
39
|
-
|
|
40
|
-
option :region,
|
|
41
|
-
:long => "--region REGION",
|
|
42
|
-
:description => "Your AWS region",
|
|
43
|
-
:default => "us-east-1",
|
|
44
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:region] = key }
|
|
45
|
-
|
|
46
|
-
def h
|
|
47
|
-
@highline ||= HighLine.new
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def run
|
|
51
|
-
require 'fog'
|
|
52
|
-
require 'highline'
|
|
53
|
-
require 'net/ssh/multi'
|
|
54
|
-
require 'readline'
|
|
55
|
-
|
|
56
|
-
$stdout.sync = true
|
|
57
|
-
|
|
58
|
-
connection = Fog::AWS::Compute.new(
|
|
59
|
-
:aws_access_key_id => Chef::Config[:knife][:aws_access_key_id],
|
|
60
|
-
:aws_secret_access_key => Chef::Config[:knife][:aws_secret_access_key],
|
|
61
|
-
:region => Chef::Config[:knife][:region]
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
server_list = [
|
|
65
|
-
h.color('Instance ID', :bold),
|
|
66
|
-
h.color('Public IP', :bold),
|
|
67
|
-
h.color('Private IP', :bold),
|
|
68
|
-
h.color('Flavor', :bold),
|
|
69
|
-
h.color('Image', :bold),
|
|
70
|
-
h.color('Security Groups', :bold),
|
|
71
|
-
h.color('State', :bold)
|
|
72
|
-
]
|
|
73
|
-
connection.servers.all.each do |server|
|
|
74
|
-
server_list << server.id.to_s
|
|
75
|
-
server_list << (server.ip_address == nil ? "" : server.ip_address)
|
|
76
|
-
server_list << (server.private_ip_address == nil ? "" : server.private_ip_address)
|
|
77
|
-
server_list << (server.flavor_id == nil ? "" : server.flavor_id)
|
|
78
|
-
server_list << (server.image_id == nil ? "" : server.image_id)
|
|
79
|
-
server_list << server.groups.join(", ")
|
|
80
|
-
server_list << server.state
|
|
81
|
-
end
|
|
82
|
-
puts h.list(server_list, :columns_across, 7)
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Author:: Adam Jacob (<adam@opscode.com>)
|
|
3
|
-
# Copyright:: Copyright (c) 2009 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
|
-
require 'chef/json_compat'
|
|
21
|
-
require 'uuidtools'
|
|
22
|
-
|
|
23
|
-
class Chef
|
|
24
|
-
class Knife
|
|
25
|
-
class RackspaceServerCreate < Knife
|
|
26
|
-
|
|
27
|
-
banner "knife rackspace server create [RUN LIST...] (options)"
|
|
28
|
-
|
|
29
|
-
option :flavor,
|
|
30
|
-
:short => "-f FLAVOR",
|
|
31
|
-
:long => "--flavor FLAVOR",
|
|
32
|
-
:description => "The flavor of server",
|
|
33
|
-
:proc => Proc.new { |f| f.to_i },
|
|
34
|
-
:default => 1
|
|
35
|
-
|
|
36
|
-
option :image,
|
|
37
|
-
:short => "-i IMAGE",
|
|
38
|
-
:long => "--image IMAGE",
|
|
39
|
-
:description => "The image of the server",
|
|
40
|
-
:proc => Proc.new { |i| i.to_i }
|
|
41
|
-
|
|
42
|
-
option :server_name,
|
|
43
|
-
:short => "-S NAME",
|
|
44
|
-
:long => "--server-name NAME",
|
|
45
|
-
:description => "The server name. Defaults to a random UUID.",
|
|
46
|
-
:default => UUIDTools::UUID.random_create.to_s
|
|
47
|
-
|
|
48
|
-
option :chef_node_name,
|
|
49
|
-
:short => "-N NAME",
|
|
50
|
-
:long => "--node-name NAME",
|
|
51
|
-
:description => "The Chef node name for your new node"
|
|
52
|
-
|
|
53
|
-
option :ssh_user,
|
|
54
|
-
:short => "-x USERNAME",
|
|
55
|
-
:long => "--ssh-user USERNAME",
|
|
56
|
-
:description => "The ssh username",
|
|
57
|
-
:default => "root"
|
|
58
|
-
|
|
59
|
-
option :ssh_password,
|
|
60
|
-
:short => "-P PASSWORD",
|
|
61
|
-
:long => "--ssh-password PASSWORD",
|
|
62
|
-
:description => "The ssh password"
|
|
63
|
-
|
|
64
|
-
option :api_key,
|
|
65
|
-
:short => "-K KEY",
|
|
66
|
-
:long => "--rackspace-api-key KEY",
|
|
67
|
-
:description => "Your rackspace API key",
|
|
68
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:rackspace_api_key] = key }
|
|
69
|
-
|
|
70
|
-
option :api_username,
|
|
71
|
-
:short => "-A USERNAME",
|
|
72
|
-
:long => "--rackspace-api-username USERNAME",
|
|
73
|
-
:description => "Your rackspace API username",
|
|
74
|
-
:proc => Proc.new { |username| Chef::Config[:knife][:rackspace_api_username] = username }
|
|
75
|
-
|
|
76
|
-
option :prerelease,
|
|
77
|
-
:long => "--prerelease",
|
|
78
|
-
:description => "Install the pre-release chef gems"
|
|
79
|
-
|
|
80
|
-
option :distro,
|
|
81
|
-
:short => "-d DISTRO",
|
|
82
|
-
:long => "--distro DISTRO",
|
|
83
|
-
:description => "Bootstrap a distro using a template",
|
|
84
|
-
:default => "ubuntu10.04-gems"
|
|
85
|
-
|
|
86
|
-
option :template_file,
|
|
87
|
-
:long => "--template-file TEMPLATE",
|
|
88
|
-
:description => "Full path to location of template to use",
|
|
89
|
-
:default => false
|
|
90
|
-
|
|
91
|
-
def h
|
|
92
|
-
@highline ||= HighLine.new
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def tcp_test_ssh(hostname)
|
|
96
|
-
tcp_socket = TCPSocket.new(hostname, 22)
|
|
97
|
-
readable = IO.select([tcp_socket], nil, nil, 5)
|
|
98
|
-
if readable
|
|
99
|
-
Chef::Log.debug("sshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}")
|
|
100
|
-
yield
|
|
101
|
-
true
|
|
102
|
-
else
|
|
103
|
-
false
|
|
104
|
-
end
|
|
105
|
-
rescue Errno::ETIMEDOUT
|
|
106
|
-
false
|
|
107
|
-
rescue Errno::ECONNREFUSED
|
|
108
|
-
sleep 2
|
|
109
|
-
false
|
|
110
|
-
ensure
|
|
111
|
-
tcp_socket && tcp_socket.close
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def run
|
|
115
|
-
require 'fog'
|
|
116
|
-
require 'highline'
|
|
117
|
-
require 'net/ssh/multi'
|
|
118
|
-
require 'readline'
|
|
119
|
-
|
|
120
|
-
$stdout.sync = true
|
|
121
|
-
|
|
122
|
-
connection = Fog::Rackspace::Compute.new(
|
|
123
|
-
:rackspace_api_key => Chef::Config[:knife][:rackspace_api_key],
|
|
124
|
-
:rackspace_username => Chef::Config[:knife][:rackspace_api_username]
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
server = connection.servers.create(
|
|
128
|
-
:name => config[:server_name],
|
|
129
|
-
:image_id => config[:image],
|
|
130
|
-
:flavor_id => config[:flavor]
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
|
|
134
|
-
puts "#{h.color("Name", :cyan)}: #{server.name}"
|
|
135
|
-
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
|
|
136
|
-
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
|
|
137
|
-
puts "#{h.color("Public IP Address", :cyan)}: #{server.addresses["public"][0]}"
|
|
138
|
-
puts "#{h.color("Private IP Address", :cyan)}: #{server.addresses["private"][0]}"
|
|
139
|
-
puts "#{h.color("Password", :cyan)}: #{server.password}"
|
|
140
|
-
|
|
141
|
-
print "\n#{h.color("Requesting server", :magenta)}"
|
|
142
|
-
|
|
143
|
-
# wait for it to be ready to do stuff
|
|
144
|
-
server.wait_for { print "."; ready? }
|
|
145
|
-
|
|
146
|
-
puts("\n")
|
|
147
|
-
|
|
148
|
-
print "\n#{h.color("Waiting for sshd", :magenta)}"
|
|
149
|
-
|
|
150
|
-
print(".") until tcp_test_ssh(server.addresses["public"][0]) { sleep @initial_sleep_delay ||= 10; puts("done") }
|
|
151
|
-
|
|
152
|
-
bootstrap_for_node(server).run
|
|
153
|
-
|
|
154
|
-
puts "\n"
|
|
155
|
-
puts "#{h.color("Instance ID", :cyan)}: #{server.id}"
|
|
156
|
-
puts "#{h.color("Name", :cyan)}: #{server.name}"
|
|
157
|
-
puts "#{h.color("Flavor", :cyan)}: #{server.flavor_id}"
|
|
158
|
-
puts "#{h.color("Image", :cyan)}: #{server.image_id}"
|
|
159
|
-
puts "#{h.color("Public IP Address", :cyan)}: #{server.addresses["public"][0]}"
|
|
160
|
-
puts "#{h.color("Private IP Address", :cyan)}: #{server.addresses["private"][0]}"
|
|
161
|
-
puts "#{h.color("Password", :cyan)}: #{server.password}"
|
|
162
|
-
puts "#{h.color("Run List", :cyan)}: #{@name_args.join(', ')}"
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def bootstrap_for_node(server)
|
|
166
|
-
bootstrap = Chef::Knife::Bootstrap.new
|
|
167
|
-
bootstrap.name_args = [server.addresses["public"][0]]
|
|
168
|
-
bootstrap.config[:run_list] = @name_args
|
|
169
|
-
bootstrap.config[:ssh_user] = config[:ssh_user] || "root"
|
|
170
|
-
bootstrap.config[:ssh_password] = server.password
|
|
171
|
-
bootstrap.config[:identity_file] = config[:identity_file]
|
|
172
|
-
bootstrap.config[:chef_node_name] = config[:chef_node_name] || server.id
|
|
173
|
-
bootstrap.config[:prerelease] = config[:prerelease]
|
|
174
|
-
bootstrap.config[:distro] = config[:distro]
|
|
175
|
-
bootstrap.config[:use_sudo] = true
|
|
176
|
-
bootstrap.config[:template_file] = config[:template_file]
|
|
177
|
-
bootstrap.config[:environment] = config[:environment]
|
|
178
|
-
bootstrap
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
|