cluster_chef-knife 3.0.12 → 3.0.14
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/CHANGELOG.md +24 -0
- data/Gemfile +3 -2
- data/README.md +5 -1
- data/Rakefile +11 -4
- data/VERSION +1 -1
- data/cluster_chef-knife.gemspec +8 -6
- data/config/ubuntu10.04-cluster_chef.erb +157 -0
- data/config/ubuntu11.10-cluster_chef.erb +145 -0
- data/ironfan.gemspec +123 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-cluster_chef.erb +40 -22
- data/lib/chef/knife/bootstrap/ubuntu11.10-cluster_chef.erb +26 -14
- data/lib/chef/knife/cluster_kick.rb +8 -0
- data/lib/chef/knife/cluster_kill.rb +2 -2
- data/lib/chef/knife/cluster_proxy.rb +16 -10
- data/lib/chef/knife/cluster_show.rb +5 -0
- data/lib/chef/knife/cluster_ssh.rb +49 -2
- data/lib/chef/knife/cluster_start.rb +8 -0
- data/lib/chef/knife/cluster_stop.rb +7 -1
- data/lib/chef/knife/cluster_sync.rb +2 -2
- data/lib/chef/knife/knife_common.rb +3 -6
- metadata +83 -82
- data/clusters/website_demo.rb +0 -65
- data/lib/chef/knife/bootstrap/ubuntu10.04-basic.erb +0 -78
@@ -53,7 +53,7 @@ class Chef
|
|
53
53
|
|
54
54
|
@action_nodes = target.chef_nodes
|
55
55
|
addresses = target.servers.map do |svr|
|
56
|
-
if (svr.cloud.public_ip)
|
56
|
+
if (svr.cloud.public_ip) then address = svr.cloud.public_ip ; end
|
57
57
|
if (not address) && (svr.fog_server) then address = svr.fog_server.public_ip_address ; end
|
58
58
|
if (not address) && (svr.chef_node) then address = format_for_display( svr.chef_node )[config[:attribute]] ; end
|
59
59
|
address
|
@@ -64,8 +64,55 @@ class Chef
|
|
64
64
|
session_from_list(addresses)
|
65
65
|
end
|
66
66
|
|
67
|
+
#
|
68
|
+
# Override the one in Chef::Knife::Ssh to allow an err flag (prints in red
|
69
|
+
# if non-null)
|
70
|
+
#
|
71
|
+
def print_data(host, data, err=nil)
|
72
|
+
if data =~ /\n/
|
73
|
+
data.split(/\n/).each { |d| print_data(host, d, err) }
|
74
|
+
else
|
75
|
+
padding = @longest - host.length
|
76
|
+
str = ui.color(host, :cyan) + (" " * (padding + 1)) + (err ? ui.color(data, :red) : data)
|
77
|
+
ui.msg(str)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Override the one in Chef::Knife::Ssh to give a big red warning if the
|
83
|
+
# process executes with badness
|
84
|
+
#
|
85
|
+
def ssh_command(command, subsession=nil)
|
86
|
+
subsession ||= session
|
87
|
+
command = fixup_sudo(command)
|
88
|
+
notifications = []
|
89
|
+
subsession.open_channel do |ch|
|
90
|
+
ch.request_pty
|
91
|
+
ch.exec command do |ch, success|
|
92
|
+
raise ArgumentError, "Cannot execute #{command}" unless success
|
93
|
+
# note: you can't do the stderr calback because requesting a pty
|
94
|
+
# squashes stderr and stdout together
|
95
|
+
ch.on_data do |ichannel, data|
|
96
|
+
print_data(ichannel[:host], data)
|
97
|
+
if data =~ /^knife sudo password: /
|
98
|
+
ichannel.send_data("#{get_password}\n")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
ch.on_request "exit-status" do |ichannel, data|
|
102
|
+
exit_status = data.read_long
|
103
|
+
if exit_status != 0
|
104
|
+
command_snippet = (command.length < 70) ? command : (command[0..45] + ' ... ' + command[-19..-1])
|
105
|
+
notifications << [ichannel[:host], "'#{command_snippet.gsub(/[\r\n]+/, "; ")}' terminated with error status #{exit_status}", :err]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
session.loop
|
111
|
+
notifications.each{|args| print_data(*args) }
|
112
|
+
end
|
113
|
+
|
67
114
|
def cssh
|
68
|
-
exec "cssh "+session.servers_for.map
|
115
|
+
exec "cssh "+session.servers_for.map{|server| server.user ? "#{server.user}@#{server.host}" : server.host}.join(" ")
|
69
116
|
end
|
70
117
|
|
71
118
|
def run
|
@@ -27,6 +27,14 @@ class Chef
|
|
27
27
|
def relevant?(server)
|
28
28
|
server.startable?
|
29
29
|
end
|
30
|
+
|
31
|
+
def perform_execution(target)
|
32
|
+
section("Starting machines")
|
33
|
+
super(target)
|
34
|
+
section("Announcing Chef nodes as started")
|
35
|
+
target.send(:delegate_to_servers, :announce_as_started)
|
36
|
+
end
|
37
|
+
|
30
38
|
end
|
31
39
|
end
|
32
40
|
end
|
@@ -15,7 +15,6 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
-
|
19
18
|
require File.expand_path(File.dirname(__FILE__)+"/generic_command.rb")
|
20
19
|
|
21
20
|
class Chef
|
@@ -27,6 +26,13 @@ class Chef
|
|
27
26
|
server.running?
|
28
27
|
end
|
29
28
|
|
29
|
+
def perform_execution(target)
|
30
|
+
section("Stopping machines")
|
31
|
+
super(target)
|
32
|
+
section("Announcing Chef nodes as stopped")
|
33
|
+
target.send(:delegate_to_servers, :announce_as_stopped)
|
34
|
+
end
|
35
|
+
|
30
36
|
def confirm_execution(target)
|
31
37
|
ui.info " Unless these nodes are backed by EBS volumes, this will result in loss of all data"
|
32
38
|
ui.info " not saved elsewhere. Even if they are EBS backed, there may still be some data loss."
|
@@ -25,12 +25,12 @@ class Chef
|
|
25
25
|
|
26
26
|
option :cloud,
|
27
27
|
:long => "--[no-]cloud",
|
28
|
-
:description => "Sync to the cloud (default
|
28
|
+
:description => "Sync to the cloud (default is yes, sync cloud; use --no-cloud to skip)",
|
29
29
|
:default => true,
|
30
30
|
:boolean => true
|
31
31
|
option :chef,
|
32
32
|
:long => "--[no-]chef",
|
33
|
-
:description => "Sync to the chef server (default
|
33
|
+
:description => "Sync to the chef server (default is yes, sync chef; use --no-chef to skip)",
|
34
34
|
:default => true,
|
35
35
|
:boolean => true
|
36
36
|
option :sync_all,
|
@@ -173,20 +173,17 @@ module ClusterChef
|
|
173
173
|
|
174
174
|
module ClassMethods
|
175
175
|
def sub_command
|
176
|
-
self.to_s.gsub(/^.*::/, '').gsub
|
176
|
+
self.to_s.gsub(/^.*::/, '').gsub(/^Cluster/, '').downcase
|
177
177
|
end
|
178
178
|
|
179
179
|
def import_banner_and_options(klass, options={})
|
180
180
|
options[:except] ||= []
|
181
|
-
klass.
|
181
|
+
deps{ klass.load_deps }
|
182
|
+
klass.options.sort.each do |name, info|
|
182
183
|
next if options.include?(name) || options[:except].include?(name)
|
183
184
|
option name, info
|
184
185
|
end
|
185
186
|
banner "knife cluster #{sub_command} CLUSTER_NAME [FACET_NAME [INDEXES]] (options)"
|
186
|
-
|
187
|
-
deps do
|
188
|
-
klass.load_deps
|
189
|
-
end
|
190
187
|
end
|
191
188
|
end
|
192
189
|
def self.included(base)
|
metadata
CHANGED
@@ -1,126 +1,125 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cluster_chef-knife
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.14
|
4
5
|
prerelease:
|
5
|
-
version: 3.0.12
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Infochimps
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: chef
|
17
|
-
requirement: &
|
16
|
+
requirement: &70259604124020 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
|
-
requirements:
|
18
|
+
requirements:
|
20
19
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
22
21
|
version: 0.10.4
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70259604124020
|
25
|
+
- !ruby/object:Gem::Dependency
|
27
26
|
name: fog
|
28
|
-
requirement: &
|
27
|
+
requirement: &70259604122180 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
|
-
requirements:
|
29
|
+
requirements:
|
31
30
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
31
|
+
- !ruby/object:Gem::Version
|
33
32
|
version: 1.1.1
|
34
33
|
type: :runtime
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *70259604122180
|
36
|
+
- !ruby/object:Gem::Dependency
|
38
37
|
name: formatador
|
39
|
-
requirement: &
|
38
|
+
requirement: &70259604119900 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
|
-
requirements:
|
40
|
+
requirements:
|
42
41
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
42
|
+
- !ruby/object:Gem::Version
|
44
43
|
version: 0.2.1
|
45
44
|
type: :runtime
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
version_requirements: *70259604119900
|
47
|
+
- !ruby/object:Gem::Dependency
|
49
48
|
name: gorillib
|
50
|
-
requirement: &
|
49
|
+
requirement: &70259604119160 !ruby/object:Gem::Requirement
|
51
50
|
none: false
|
52
|
-
requirements:
|
51
|
+
requirements:
|
53
52
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
53
|
+
- !ruby/object:Gem::Version
|
55
54
|
version: 0.1.7
|
56
55
|
type: :runtime
|
57
56
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
- !ruby/object:Gem::Dependency
|
57
|
+
version_requirements: *70259604119160
|
58
|
+
- !ruby/object:Gem::Dependency
|
60
59
|
name: bundler
|
61
|
-
requirement: &
|
60
|
+
requirement: &70259604118180 !ruby/object:Gem::Requirement
|
62
61
|
none: false
|
63
|
-
requirements:
|
62
|
+
requirements:
|
64
63
|
- - ~>
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version:
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '1'
|
67
66
|
type: :development
|
68
67
|
prerelease: false
|
69
|
-
version_requirements: *
|
70
|
-
- !ruby/object:Gem::Dependency
|
68
|
+
version_requirements: *70259604118180
|
69
|
+
- !ruby/object:Gem::Dependency
|
71
70
|
name: jeweler
|
72
|
-
requirement: &
|
71
|
+
requirement: &70259604133600 !ruby/object:Gem::Requirement
|
73
72
|
none: false
|
74
|
-
requirements:
|
73
|
+
requirements:
|
75
74
|
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '1.6'
|
78
77
|
type: :development
|
79
78
|
prerelease: false
|
80
|
-
version_requirements: *
|
81
|
-
- !ruby/object:Gem::Dependency
|
79
|
+
version_requirements: *70259604133600
|
80
|
+
- !ruby/object:Gem::Dependency
|
82
81
|
name: rspec
|
83
|
-
requirement: &
|
82
|
+
requirement: &70259604133000 !ruby/object:Gem::Requirement
|
84
83
|
none: false
|
85
|
-
requirements:
|
84
|
+
requirements:
|
86
85
|
- - ~>
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version:
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '2.5'
|
89
88
|
type: :development
|
90
89
|
prerelease: false
|
91
|
-
version_requirements: *
|
92
|
-
- !ruby/object:Gem::Dependency
|
90
|
+
version_requirements: *70259604133000
|
91
|
+
- !ruby/object:Gem::Dependency
|
93
92
|
name: yard
|
94
|
-
requirement: &
|
93
|
+
requirement: &70259604132480 !ruby/object:Gem::Requirement
|
95
94
|
none: false
|
96
|
-
requirements:
|
95
|
+
requirements:
|
97
96
|
- - ~>
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
version:
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0.6'
|
100
99
|
type: :development
|
101
100
|
prerelease: false
|
102
|
-
version_requirements: *
|
103
|
-
- !ruby/object:Gem::Dependency
|
101
|
+
version_requirements: *70259604132480
|
102
|
+
- !ruby/object:Gem::Dependency
|
104
103
|
name: configliere
|
105
|
-
requirement: &
|
104
|
+
requirement: &70259604131700 !ruby/object:Gem::Requirement
|
106
105
|
none: false
|
107
|
-
requirements:
|
106
|
+
requirements:
|
108
107
|
- - ~>
|
109
|
-
- !ruby/object:Gem::Version
|
108
|
+
- !ruby/object:Gem::Version
|
110
109
|
version: 0.4.8
|
111
110
|
type: :development
|
112
111
|
prerelease: false
|
113
|
-
version_requirements: *
|
114
|
-
description: cluster_chef allows you to orchestrate not just systems but clusters
|
112
|
+
version_requirements: *70259604131700
|
113
|
+
description: cluster_chef-knife allows you to orchestrate not just systems but clusters
|
114
|
+
of machines. It includes a powerful layer on top of knife and a collection of cloud
|
115
|
+
cookbooks.
|
115
116
|
email: coders@infochimps.com
|
116
117
|
executables: []
|
117
|
-
|
118
118
|
extensions: []
|
119
|
-
|
120
|
-
extra_rdoc_files:
|
119
|
+
extra_rdoc_files:
|
121
120
|
- LICENSE
|
122
121
|
- README.md
|
123
|
-
files:
|
122
|
+
files:
|
124
123
|
- .gitignore
|
125
124
|
- .rspec
|
126
125
|
- CHANGELOG.md
|
@@ -132,10 +131,11 @@ files:
|
|
132
131
|
- VERSION
|
133
132
|
- chefignore
|
134
133
|
- cluster_chef-knife.gemspec
|
135
|
-
- clusters/website_demo.rb
|
136
134
|
- config/client.rb
|
137
135
|
- config/proxy.pac
|
138
|
-
-
|
136
|
+
- config/ubuntu10.04-cluster_chef.erb
|
137
|
+
- config/ubuntu11.10-cluster_chef.erb
|
138
|
+
- ironfan.gemspec
|
139
139
|
- lib/chef/knife/bootstrap/ubuntu10.04-cluster_chef.erb
|
140
140
|
- lib/chef/knife/bootstrap/ubuntu11.10-cluster_chef.erb
|
141
141
|
- lib/chef/knife/cluster_bootstrap.rb
|
@@ -164,36 +164,37 @@ files:
|
|
164
164
|
- tasks/chef_config.rake
|
165
165
|
- tasks/jeweler_use_alt_branch.rake
|
166
166
|
homepage: http://infochimps.com/labs
|
167
|
-
licenses:
|
167
|
+
licenses:
|
168
168
|
- apachev2
|
169
|
-
post_install_message:
|
169
|
+
post_install_message: ! "!! This gem has been renamed 'ironfan' (from cluster_chef).
|
170
|
+
\n It will not be updated after Feb. 2012. \n Sorry for the inconvenience."
|
170
171
|
rdoc_options: []
|
171
|
-
|
172
|
-
require_paths:
|
172
|
+
require_paths:
|
173
173
|
- lib
|
174
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
175
175
|
none: false
|
176
|
-
requirements:
|
177
|
-
- -
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
|
180
|
-
segments:
|
176
|
+
requirements:
|
177
|
+
- - ! '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
segments:
|
181
181
|
- 0
|
182
|
-
|
183
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
|
+
hash: 115206257048957134
|
183
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
184
|
none: false
|
185
|
-
requirements:
|
186
|
-
- -
|
187
|
-
- !ruby/object:Gem::Version
|
188
|
-
version:
|
185
|
+
requirements:
|
186
|
+
- - ! '>='
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
189
|
requirements: []
|
190
|
-
|
191
190
|
rubyforge_project:
|
192
191
|
rubygems_version: 1.8.15
|
193
192
|
signing_key:
|
194
193
|
specification_version: 3
|
195
|
-
summary: cluster_chef allows you to orchestrate not just systems but clusters
|
196
|
-
|
194
|
+
summary: cluster_chef-knife allows you to orchestrate not just systems but clusters
|
195
|
+
of machines. It includes a powerful layer on top of knife and a collection of cloud
|
196
|
+
cookbooks.
|
197
|
+
test_files:
|
197
198
|
- spec/cluster_chef/cluster_spec.rb
|
198
199
|
- spec/cluster_chef/facet_spec.rb
|
199
200
|
- spec/cluster_chef/server_slice_spec.rb
|
data/clusters/website_demo.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
ClusterChef.cluster 'webserver_demo' do
|
2
|
-
cloud :ec2 do
|
3
|
-
defaults
|
4
|
-
availability_zones ['us-east-1d']
|
5
|
-
flavor 't1.micro' # change to something larger for serious use
|
6
|
-
backing 'ebs'
|
7
|
-
image_name 'natty'
|
8
|
-
bootstrap_distro 'ubuntu10.04-cluster_chef'
|
9
|
-
chef_client_script 'client.rb'
|
10
|
-
mount_ephemerals(:tags => { :scratch_dirs => true })
|
11
|
-
end
|
12
|
-
|
13
|
-
role "nfs_client"
|
14
|
-
recipe "package_set"
|
15
|
-
|
16
|
-
facet :webnode do
|
17
|
-
instances 6
|
18
|
-
role "nginx"
|
19
|
-
role "redis_client"
|
20
|
-
role "mysql_client"
|
21
|
-
role "elasticsearch_client"
|
22
|
-
role "awesome_website"
|
23
|
-
role "web_server" # this triggers opening appropriate ports
|
24
|
-
# Rotate nodes among availability zones
|
25
|
-
azs = ['us-east-1d', 'us-east-1b', 'us-east-1c']
|
26
|
-
(0...instances).each do |idx|
|
27
|
-
server(idx).cloud.availability_zones [azs[ idx % azs.length ]]
|
28
|
-
end
|
29
|
-
# Rote nodes among A/B testing groups
|
30
|
-
(0..instances).each do |idx|
|
31
|
-
server(idx).chef_node.normal[:split_testing] = ( (idx % 2 == 0) ? 'A' : 'B' )
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
facet :dbnode do
|
36
|
-
instances 2
|
37
|
-
role "mysql_server"
|
38
|
-
role "redis_client"
|
39
|
-
# burly master, wussier slaves
|
40
|
-
cloud.flavor "m1.large"
|
41
|
-
server(0) do
|
42
|
-
cloud.flavor "c1.xlarge"
|
43
|
-
end
|
44
|
-
|
45
|
-
volume(:data) do
|
46
|
-
size 50
|
47
|
-
keep true
|
48
|
-
device '/dev/sdi'
|
49
|
-
mount_point '/data/db'
|
50
|
-
mount_options 'defaults,nouuid,noatime'
|
51
|
-
fstype 'xfs'
|
52
|
-
snapshot_id 'snap-d9c1edb1'
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
facet :esnode do
|
57
|
-
instances 1
|
58
|
-
role "nginx"
|
59
|
-
role "redis_server"
|
60
|
-
role "elasticsearch_data_esnode"
|
61
|
-
role "elasticsearch_http_esnode"
|
62
|
-
#
|
63
|
-
cloud.flavor "m1.large"
|
64
|
-
end
|
65
|
-
end
|