rubber 2.2.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +3 -2
- data/CHANGELOG +59 -76
- data/README.md +2 -2
- data/lib/rubber/commands/vulcanize.rb +11 -9
- data/lib/rubber/recipes/rubber.rb +4 -2
- data/lib/rubber/recipes/rubber/instances.rb +57 -45
- data/lib/rubber/recipes/rubber/tags.rb +1 -0
- data/lib/rubber/recipes/rubber/utils.rb +19 -24
- data/lib/rubber/util.rb +7 -3
- data/lib/rubber/version.rb +1 -1
- data/templates/base/config/rubber/rubber.yml +35 -2
- data/templates/complete_mongrel_mysql/config/rubber/rubber-complete.yml +0 -35
- data/templates/complete_passenger/config/rubber/rubber-complete.yml +0 -35
- data/templates/complete_passenger_nginx/config/rubber/rubber-complete.yml +0 -35
- data/templates/complete_unicorn_nginx/config/rubber/rubber-complete.yml +0 -35
- data/templates/minimal_passenger_nginx/config/rubber/rubber-complete.yml +0 -35
- data/test/test_helper.rb +1 -1
- metadata +6 -46
data/.travis.yml
CHANGED
@@ -3,11 +3,12 @@ rvm:
|
|
3
3
|
- 1.8.7
|
4
4
|
- 1.9.2
|
5
5
|
- 1.9.3
|
6
|
+
- ruby-head
|
6
7
|
- jruby-18mode
|
7
8
|
- jruby-19mode
|
8
9
|
- jruby-head
|
9
|
-
|
10
|
-
|
10
|
+
- rbx-18mode
|
11
|
+
- rbx-19mode
|
11
12
|
# script: bundle exec rspec spec
|
12
13
|
env:
|
13
14
|
- JAVA_OPTS="-server -Djruby.cext.enabled=false -Djruby.compile.invokedynamic=false"
|
data/CHANGELOG
CHANGED
@@ -1,100 +1,77 @@
|
|
1
|
+
|
2
|
+
2.2.1 (02/11/2013)
|
3
|
+
------------------
|
4
|
+
|
5
|
+
Improvements:
|
6
|
+
============
|
7
|
+
|
8
|
+
[core] Push alias changes in local instance.yml files to cloud tags <1adebd0>
|
9
|
+
[core] Namespaced capistrano role tasks <48fb78e>
|
10
|
+
[base] Moved security group configuration to rubber.yml <ccc9f3e>
|
11
|
+
|
12
|
+
Bug Fixes:
|
13
|
+
=========
|
14
|
+
[core] Added support for lambdas in role options for optional tasks <72ff4b9>
|
15
|
+
[core] Added support for lambdas in role options for serial tasks <35716a6>
|
16
|
+
|
17
|
+
|
1
18
|
2.2.0 (02/08/2013)
|
2
19
|
------------------
|
3
20
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
[core]
|
8
|
-
[
|
9
|
-
[
|
10
|
-
[
|
21
|
+
New Features:
|
22
|
+
============
|
23
|
+
|
24
|
+
[core] Switched license to Apache Software License version 2
|
25
|
+
[base] Replaced RVM with ruby-build.
|
26
|
+
[base] Add ability to obfuscate rubber secret file (MRI only) <c9d8aac>
|
27
|
+
[postgresql] basic slave promotion for postgresql <8b96f71>
|
28
|
+
[sidekiq] Added a sidekiq template. <bc31d00>
|
29
|
+
[solr] Added a Solr 4 template <8a5b041>
|
30
|
+
[torquebox] Added support for logging to Graylog2 from TorqueBox. <b2685d5>
|
31
|
+
|
32
|
+
Improvements:
|
33
|
+
============
|
34
|
+
|
35
|
+
[core] Upgraded to net-ssh 2.6, as it supposedly fixes all the connection problems we've been seeing with 2.5.x. <9b32ecb>
|
11
36
|
[core] Allow the rubber:start task to start multiple instances <432f95e>
|
12
|
-
[core] Fix syntax error in start_instances() <d23ad3c>
|
13
|
-
[core] Clean up broken method call <dd90c5f>
|
14
|
-
[core] Bugfix: net-ssh requires :keys to be an array, not string <74f10d3>
|
15
|
-
[core] Fix threading for start_instances() <a0c3930>
|
16
37
|
[core] Allow rubber:stop to manage multiple instances <7dd6ea2>
|
17
|
-
[core] Let's see if JRuby 1.8 mode is stable on Travis now. <d0de63a>
|
18
|
-
[core] Merge pull request #255 from zmillman/multiple_stop_start <42ac8e6>
|
19
|
-
[core] fix 1.8 issue <effd41e>
|
20
|
-
[core] Let's see if jruby-head is stable on Travis now. <4d32c6b>
|
21
38
|
[core] Improve logging and handling of instance validation <c3e5e9b>
|
22
|
-
[
|
23
|
-
[core] Moved validation to top of method. <39c3d4e>
|
24
|
-
[core] Marked encryption tests as pending in JRuby until we can figure out how to make that work reliably. <2134120>
|
25
|
-
[apache] Added missing packages to make SendFile work on Apache. <6c7f84e>
|
26
|
-
[base, collectd, mongrel, monit, munin, passenger, passenger_nginx] Replaced RVM with ruby-build. <d98c373>
|
27
|
-
[base] Add ability to obfuscate rubber secret file <c9d8aac>
|
28
|
-
[base] Bumped up to the latest Ruby 1.9.3 release. <140abd1>
|
29
|
-
[base] Fixed a typo. <6c42f11>
|
30
|
-
[base] Fixed ruby-build installation. <ddd4337>
|
31
|
-
[base] Fixed script name. <0a35524>
|
32
|
-
[base] I like punctuation. <c8d6c0f>
|
33
|
-
[base] Improved ruby-build stuff based on pull request review. <a07f73a>
|
34
|
-
[base] New ruby-build version to pull in a definition for JRuby 1.7.1. <730fc0e>
|
35
|
-
[base] Print out ruby compilation status to let the user know what's going on. <c281cf1>
|
36
|
-
[base] Removed old, unused RVM options. <bfaba8d>
|
37
|
-
[base] Updated ruby-build version and use Ruby 1.9.3-p385 as the default now. <75cb6f4>
|
38
|
-
[base] Updated ruby-build version. <00ea48c>
|
39
|
-
[base] Updated to the latest ruby-build. <cb38e6a>
|
40
|
-
[base] Upgraded ruby-build and use 1.9.3-p327 by default now. <d49d2d3>
|
41
|
-
[base] Use the latest ruby-build and bump to the latest MRI release. <430b113>
|
42
|
-
[base] bump ruby and ruby-build version <3a8176a>
|
43
|
-
[base] fix ruby version detection <ac7ae0b>
|
44
|
-
[base] fix ruby-build url <a4c8482>
|
45
|
-
[base] fix ruby-build ver <c85364c>
|
46
|
-
[base] quote account number to allow for leading 0s <b46b674>
|
47
|
-
[base] refactoring, fix jruby tests <0bec484>
|
48
|
-
[base] some fixes to ruby-build install <77e3e28>
|
39
|
+
[base] Bumped up to the latest Ruby 1.9.3-p385 release. <140abd1>
|
49
40
|
[base] update ubuntu ami to latest 12.04, make default instance size c1.medium to improve initial user experience <a270c7b>
|
50
|
-
[complete_passenger, complete_passenger_nginx, complete_unicorn_nginx] Merge pull request #233 from messick/remove_db <c5ff221>
|
51
41
|
[complete_passenger, complete_passenger_nginx, complete_unicorn_nginx] remove db template dependancy from complete_* templates <5be6300>
|
52
|
-
[complete_unicorn_nginx] Merge pull request #230 from messick/unicorn_template_fix <d8144bf>
|
53
42
|
[complete_unicorn_nginx] complete_unicorn_nginx template doesn't need haproxy <54faef3>
|
54
|
-
[complete_unicorn_nginx] unicorn_nginx template does not exist <52953fa>
|
55
43
|
[elasticsearch] Upgraded Elastic Search from 0.19.3 to 0.19.12. <96e5aa0>
|
56
|
-
[elasticsearch] new es download url <ed796b7>
|
57
44
|
[graphite] Added a monit file for graphite. <87eafab>
|
58
45
|
[graphite] Added more control to graphite config. <8a2b84e>
|
59
46
|
[graphite] Allow re-mounting the graphite storage directory elsewhere since it can fill the root store rather quickly. <80f5527>
|
60
|
-
[graphite] Bugfix: Graphite depends on collectd. <5f7de4a>
|
61
47
|
[graphite] Hook up ping data from collectd to graphite. <e8d466b>
|
62
|
-
[graphite] Merge pull request #225 from pushcx/master <977e800>
|
63
|
-
[graphite] Merge remote-tracking branch 'enthuseinc/feat/uwsgi_graphite' into test <6f6fa3f>
|
64
48
|
[graphite] Migrate graphite_web to uwsgi <aaebea8>
|
65
|
-
[graphite] Move graphite nginx config to nginx role <c92e8d3>
|
66
|
-
[graphite] Removed some obsoleted backport code for graphite setup. <afd7444>
|
67
49
|
[graphite] Upgraded graphite from 0.9.9 to 0.9.10. <733937f>
|
68
|
-
[graphite] forgot http plugin for uwsgi <a67587d>
|
69
|
-
[graphite] remove dependency on apache/nginx by using native http from uwsgi <abd0628>
|
70
|
-
[graphite] respawn conflicts with monit <9955657>
|
71
50
|
[passenger, torquebox] Be a bit safer about assets & CDNs by default. <197eb93>
|
72
|
-
[passenger, torquebox] Make sure the Sidekiq Web interface can load successfully on Apache. <b669c1e>
|
73
|
-
[passenger, torquebox] Updated the Sidekiq Web SendFile config to work with any Ruby. <86612de>
|
74
51
|
[passenger] bump passenger version <9fde4bf>
|
75
|
-
[passenger] passeneger needs to know where ruby is installed by ruby-build <dcb8934>
|
76
|
-
[passenger_nginx] fix for ruby-build <9f01743>
|
77
|
-
[postgresql] basic slave promotion for postgresql <8b96f71>
|
78
52
|
[redis] Upgrade redis from 2.4.16 to 2.4.18. <d1a9e06>
|
79
|
-
[resque] resque only has its own roles now, so fix to make sure resque_worker role gets vulcanized <7dbca27>
|
80
|
-
[sidekiq] Added a sidekiq template. <bc31d00>
|
81
|
-
[sidekiq] Cleanup Sidekiq monit configuration <deffcb7>
|
82
|
-
[sidekiq] Merge pull request #228 from enthuseinc/sidekiq <202fa4a>
|
83
|
-
[sidekiq] Update Sidekiq configuration <c14c4ee>
|
84
|
-
[solr] Merge pull request #246 from klclee/master <32369b0>
|
85
|
-
[solr] solr 4 template <8a5b041>
|
86
|
-
[sphinx] Merge pull request #235 from JMcG/master <e0663ef>
|
87
53
|
[sphinx] Updated sphinx custom_install task to use correct download url and changed version to latest stable release <b61df24>
|
88
|
-
[torquebox] Added some missing rubber config values. <31eac16>
|
89
|
-
[torquebox] Bootstrap Graylog JAR installation for TorqueBox. <a588cc0>
|
90
|
-
[torquebox] Fixed a2ensite command. <a3547c6>
|
91
|
-
[torquebox] Make it more evident that this is a junk username & password combo. <dc6067f>
|
92
|
-
[torquebox] TorqueBox should not reference Passenger at all. <9db2dff>
|
93
|
-
[torquebox] Upgraded from TorqueBox 2.2.0 to 2.3.0. <a95554c>
|
94
|
-
[torquebox] Upgraded to TorqueBox 2.2.0 and added support for logging to Graylog2. <b2685d5>
|
95
54
|
[torquebox] We no longer need to restart TorqueBox completely on deploy, since the memory leak & deploy race condition requiring it have been removed. <636c78f>
|
96
|
-
[
|
97
|
-
|
55
|
+
[torquebox] Upgraded from TorqueBox 2.2.0 to 2.3.0. <a95554c>
|
56
|
+
|
57
|
+
Bug Fixes:
|
58
|
+
=========
|
59
|
+
|
60
|
+
[core] Set up the elastic IP when it doesn't match the instance's current external IP <ea960c9>
|
61
|
+
[core] Fix reboot behavior so SSH connections are re-established upon reboot. <d77ce29>
|
62
|
+
[core] Fixed some Ruby 1.8.7 compatibility issues.
|
63
|
+
[core] Fix syntax error in start_instances() <d23ad3c>
|
64
|
+
[core] Clean up broken method call in stopping instances <dd90c5f>
|
65
|
+
[core] Bugfix: net-ssh requires :keys to be an array, not string <74f10d3>
|
66
|
+
[core] Fix threading for start_instances() <a0c3930>
|
67
|
+
[apache] Added missing packages to make SendFile work on Apache. <6c7f84e>
|
68
|
+
[base] quote account number to allow for leading 0s in rubber.yml<b46b674>
|
69
|
+
[complete_unicorn_nginx] unicorn_nginx template does not exist <52953fa>
|
70
|
+
[graphite] Bugfix: Graphite depends on collectd. <5f7de4a>
|
71
|
+
[graphite] Move graphite nginx config to nginx role <c92e8d3>
|
72
|
+
[resque] resque only has its own roles now, so fix to make sure resque_worker role gets vulcanized <7dbca27>
|
73
|
+
[torquebox] TorqueBox should not reference Passenger at all. <9db2dff>
|
74
|
+
|
98
75
|
|
99
76
|
2.1.2 (10/05/2012)
|
100
77
|
------------------
|
@@ -105,16 +82,19 @@ New Features:
|
|
105
82
|
[core] Allowing marking of a config variable as overriding the ones that come before it, so that non-scalar values (lists/maps) get overridden instead of combined <3d66fc8>
|
106
83
|
[core] Allow erb in rubber*.yml <60e6394>
|
107
84
|
|
85
|
+
|
108
86
|
2.1.1 (10/02/2012)
|
109
87
|
------------------
|
110
88
|
|
111
89
|
New Features:
|
112
90
|
============
|
91
|
+
|
113
92
|
[base] add ability to override by environment in rubber*.yml <f4c4af3>
|
114
93
|
[couchbase, monit] add couchbase template <550dff4>
|
115
94
|
|
116
95
|
Improvements:
|
117
96
|
============
|
97
|
+
|
118
98
|
[core] Updated sudo_script to sudo to any user. <288ef5d>
|
119
99
|
[apache, jenkins] create an apache bootstrap so jenkins template doesn't have to duplicate logic <5862791>
|
120
100
|
[complete_passenger, passenger] do a rolling passenger restart by tieing into apache rolling restart <065d757>
|
@@ -130,6 +110,7 @@ Improvements:
|
|
130
110
|
|
131
111
|
Bug Fixes:
|
132
112
|
=========
|
113
|
+
|
133
114
|
[core] fix merging of alias records <d314857>
|
134
115
|
[core] Refactor to avoid fog deprecation, fixes #222 <43ea42f>
|
135
116
|
[core] assign defaults for partial records in rubber-dns.yml when running setup_dns_records <a72a701>
|
@@ -137,6 +118,7 @@ Bug Fixes:
|
|
137
118
|
[mysql] Delete anonymous MySQL user when bootstrapping the db. Fixes #185 (pull request #212) <ce84ff2>
|
138
119
|
[torquebox] Always use the rubber system JRuby with Torquebox. <9c03a02>
|
139
120
|
|
121
|
+
|
140
122
|
2.1.0 (08/20/2012)
|
141
123
|
------------------
|
142
124
|
|
@@ -222,6 +204,7 @@ Bug Fixes:
|
|
222
204
|
|
223
205
|
New Features:
|
224
206
|
============
|
207
|
+
|
225
208
|
[torquebox] Initial work on a TorqueBox template. <160557b>
|
226
209
|
[torquebox] Merge pull request #154 from wr0ngway/add_torquebox <d750ecb>
|
227
210
|
[torquebox] [torquebox] Bumped to TorqueBox 2.0.3 from 2.0.2. <2851768>
|
data/README.md
CHANGED
@@ -2,6 +2,6 @@ The rubber plugin enables relatively complex multi-instance deployments of
|
|
2
2
|
RubyOnRails applications to Amazon's Elastic Compute Cloud (EC2).
|
3
3
|
|
4
4
|
See the documentation in the github wiki for more details:
|
5
|
-
http://github.com/
|
5
|
+
http://github.com/rubber/rubber/wiki
|
6
6
|
|
7
|
-
[![Build Status](https://secure.travis-ci.org/
|
7
|
+
[![Build Status](https://secure.travis-ci.org/rubber/rubber.png)](http://travis-ci.org/rubber/rubber)
|
@@ -17,17 +17,19 @@ module Rubber
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def self.description
|
20
|
-
|
21
|
-
|
22
|
-
VulcanizeThor.valid_templates.each do |
|
23
|
-
line
|
24
|
-
line
|
25
|
-
|
26
|
-
|
27
|
-
line
|
20
|
+
# Format templates into comma-separated paragraph with limt of 70 characters per line
|
21
|
+
lines = ['']
|
22
|
+
VulcanizeThor.valid_templates.each do |template_name|
|
23
|
+
line = lines.last
|
24
|
+
if line.size == 0
|
25
|
+
line << template_name
|
26
|
+
elsif line.size + template_name.size > 68
|
27
|
+
line << ','
|
28
|
+
lines << template_name # new line
|
29
|
+
else
|
30
|
+
line << ", " + template_name
|
28
31
|
end
|
29
32
|
end
|
30
|
-
lines << line if line.size >0
|
31
33
|
|
32
34
|
Rubber::Util.clean_indent(<<-EOS
|
33
35
|
Prepares the rails application for deploying with rubber by installing a
|
@@ -28,8 +28,10 @@ namespace :rubber do
|
|
28
28
|
# Disable connecting to any Windows instance.
|
29
29
|
required_task(name, options.merge(:except => { :platform => 'windows' })) do
|
30
30
|
# define empty roles for the case when a task has a role that we don't define anywhere
|
31
|
-
|
32
|
-
roles
|
31
|
+
unless options[:roles].respond_to?(:call)
|
32
|
+
[*options[:roles]].each do |r|
|
33
|
+
top.roles[r] ||= []
|
34
|
+
end
|
33
35
|
end
|
34
36
|
|
35
37
|
if find_servers_for_task(current_task).empty?
|
@@ -97,57 +97,66 @@ namespace :rubber do
|
|
97
97
|
start_instances(aliases)
|
98
98
|
end
|
99
99
|
|
100
|
+
namespace :roles do
|
101
|
+
rubber.allow_optional_tasks(self)
|
102
|
+
|
103
|
+
desc <<-DESC
|
104
|
+
Adds the given ROLES to the instance named ALIAS
|
105
|
+
DESC
|
106
|
+
required_task :add do
|
107
|
+
instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
|
108
|
+
roles_string = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
|
109
|
+
|
110
|
+
instance = rubber_instances[instance_alias]
|
111
|
+
fatal "Instance does not exist: #{instance_alias}" unless instance
|
112
|
+
|
113
|
+
# Parse roles_string into an Array of roles
|
114
|
+
ir = roles_string.split(/\s*,\s*/).collect{|r| Rubber::Configuration::RoleItem.parse(r)}
|
115
|
+
|
116
|
+
# Add in roles that the given set of roles depends on
|
117
|
+
ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
|
118
|
+
|
119
|
+
instance.roles = (instance.roles + ir).uniq
|
120
|
+
rubber_instances.save()
|
121
|
+
logger.info "Roles for #{instance_alias} are now:"
|
122
|
+
logger.info instance.roles.collect(&:to_s).sort.join("\n")
|
123
|
+
logger.info ''
|
124
|
+
logger.info "Run 'cap rubber:bootstrap' if done adding roles"
|
125
|
+
end
|
126
|
+
|
127
|
+
desc <<-DESC
|
128
|
+
Removes the given ROLES from the instance named ALIAS
|
129
|
+
DESC
|
130
|
+
required_task :remove do
|
131
|
+
instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
|
132
|
+
roles_string = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
|
133
|
+
|
134
|
+
instance = rubber_instances[instance_alias]
|
135
|
+
fatal "Instance does not exist: #{instance_alias}" unless instance
|
136
|
+
|
137
|
+
# Parse roles_string into an Array of roles
|
138
|
+
ir = roles_string.split(/\s*,\s*/).collect{|r| Rubber::Configuration::RoleItem.parse(r)}
|
139
|
+
|
140
|
+
instance.roles = (instance.roles - ir).uniq
|
141
|
+
rubber_instances.save()
|
142
|
+
logger.info "Roles for #{instance_alias} are now:"
|
143
|
+
logger.info instance.role_names.sort.join("\n")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# The :add_role and :remove_role tasks are for backwards-compatibility
|
100
148
|
desc <<-DESC
|
101
|
-
|
149
|
+
Alias for rubber:roles:add
|
102
150
|
DESC
|
103
151
|
required_task :add_role do
|
104
|
-
|
105
|
-
r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
|
106
|
-
|
107
|
-
instance_roles = r.split(/\s*,\s*/)
|
108
|
-
|
109
|
-
ir = []
|
110
|
-
instance_roles.each do |r|
|
111
|
-
role = Rubber::Configuration::RoleItem.parse(r)
|
112
|
-
ir << role
|
113
|
-
end
|
114
|
-
|
115
|
-
# Add in roles that the given set of roles depends on
|
116
|
-
ir = Rubber::Configuration::RoleItem.expand_role_dependencies(ir, get_role_dependencies)
|
117
|
-
|
118
|
-
instance = rubber_instances[instance_alias]
|
119
|
-
fatal "Instance does not exist: #{instance_alias}" unless instance
|
120
|
-
|
121
|
-
instance.roles = (instance.roles + ir).uniq
|
122
|
-
rubber_instances.save()
|
123
|
-
logger.info "Roles for #{instance_alias} are now:"
|
124
|
-
logger.info instance.role_names.sort.join("\n")
|
125
|
-
logger.info ''
|
126
|
-
logger.info "Run 'cap rubber:bootstrap' if done adding roles"
|
152
|
+
rubber.roles.add()
|
127
153
|
end
|
128
154
|
|
129
155
|
desc <<-DESC
|
130
|
-
|
156
|
+
Alias for rubber:roles:remove
|
131
157
|
DESC
|
132
158
|
required_task :remove_role do
|
133
|
-
|
134
|
-
r = get_env('ROLES', "Instance roles (e.g. web,app,db:primary=true)", true)
|
135
|
-
|
136
|
-
instance_roles = r.split(/\s*,\s*/)
|
137
|
-
|
138
|
-
ir = []
|
139
|
-
instance_roles.each do |r|
|
140
|
-
role = Rubber::Configuration::RoleItem.parse(r)
|
141
|
-
ir << role
|
142
|
-
end
|
143
|
-
|
144
|
-
instance = rubber_instances[instance_alias]
|
145
|
-
fatal "Instance does not exist: #{instance_alias}" unless instance
|
146
|
-
|
147
|
-
instance.roles = (instance.roles - ir).uniq
|
148
|
-
rubber_instances.save()
|
149
|
-
logger.info "Roles for #{instance_alias} are now:"
|
150
|
-
logger.info instance.role_names.sort.join("\n")
|
159
|
+
rubber.roles.remove()
|
151
160
|
end
|
152
161
|
|
153
162
|
desc <<-DESC
|
@@ -379,6 +388,9 @@ namespace :rubber do
|
|
379
388
|
def post_refresh
|
380
389
|
env = rubber_cfg.environment.bind(nil, nil)
|
381
390
|
|
391
|
+
# update the remote name/environment tags
|
392
|
+
update_tags
|
393
|
+
|
382
394
|
# setup amazon elastic ips if configured to do so
|
383
395
|
setup_static_ips
|
384
396
|
|
@@ -527,11 +539,11 @@ namespace :rubber do
|
|
527
539
|
|
528
540
|
instance_items = aliases.collect do |instance_alias|
|
529
541
|
instance_item = rubber_instances[instance_alias]
|
530
|
-
|
542
|
+
|
531
543
|
fatal "Instance does not exist: #{instance_alias}" if ! instance_item
|
532
544
|
fatal "Cannot start spot instances!" if ! instance_item.spot_instance_request_id.nil?
|
533
545
|
fatal "Cannot start instances with instance-store root device!" if (instance_item.root_device_type != 'ebs')
|
534
|
-
|
546
|
+
|
535
547
|
instance_item
|
536
548
|
end
|
537
549
|
|
@@ -81,48 +81,43 @@ namespace :rubber do
|
|
81
81
|
def serial_task(ns, name, options = {}, &block)
|
82
82
|
# first figure out server names for the passed in roles - when no roles
|
83
83
|
# are passed in, use all servers
|
84
|
-
|
84
|
+
|
85
|
+
serial_roles = Array(options[:roles].respond_to?(:call) ? options[:roles].call() : options[:roles])
|
85
86
|
servers = {}
|
86
87
|
if serial_roles.empty?
|
87
|
-
all_servers =
|
88
|
-
|
89
|
-
all_servers += serverdefs.collect {|server| server.host}
|
88
|
+
all_servers = top.roles.collect do |rolename, serverdefs|
|
89
|
+
serverdefs.collect(&:host)
|
90
90
|
end
|
91
|
-
servers[:_serial_all] = all_servers.uniq.sort
|
91
|
+
servers[:_serial_all] = all_servers.flatten.uniq.sort
|
92
92
|
else
|
93
|
-
#
|
94
|
-
|
93
|
+
# Get servers for each role
|
94
|
+
top.roles.each do |rolename, serverdefs|
|
95
95
|
if serial_roles.include?(rolename)
|
96
|
-
servers[rolename]
|
97
|
-
servers[rolename] += serverdefs.collect {|server| server.host}
|
96
|
+
servers[rolename] = serverdefs.collect(&:host)
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
101
100
|
# Remove duplication of servers - roles which come first in list
|
102
101
|
# have precedence, so the servers show up in that group
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
end
|
102
|
+
added_servers = []
|
103
|
+
serial_roles.each do |rolename|
|
104
|
+
servers[rolename] -= added_servers
|
105
|
+
added_servers << servers[rolename]
|
108
106
|
servers[rolename] = servers[rolename].uniq.sort
|
109
107
|
end
|
110
108
|
end
|
111
109
|
|
112
|
-
# group each role's servers into slices
|
110
|
+
# group each role's servers into slices and combine
|
113
111
|
slices = []
|
114
112
|
servers.each do |rolename, svrs|
|
115
|
-
next if svrs.size == 0
|
116
113
|
# figure out size of each slice by dividing server count by # of groups
|
117
|
-
slice_size = (
|
118
|
-
slice_size = 1 if slice_size
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
slices[slice_idx] += srv_slice
|
123
|
-
slice_idx += 1
|
124
|
-
end
|
114
|
+
slice_size = (svrs.size.to_f / (options.delete(:groups) || 2)).round
|
115
|
+
slice_size = 1 if slice_size < 1
|
116
|
+
|
117
|
+
# add servers to slices
|
118
|
+
slices += svrs.each_slice(slice_size).to_a
|
125
119
|
end
|
120
|
+
|
126
121
|
# for each slice, define a new task specific to the hosts in that slice
|
127
122
|
task_syms = []
|
128
123
|
slices.each do |server_group|
|
data/lib/rubber/util.rb
CHANGED
@@ -86,9 +86,13 @@ module Rubber
|
|
86
86
|
# remove leading whitespace from "here" strings so they look good in code
|
87
87
|
# skips empty lines
|
88
88
|
def clean_indent(str)
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
str.lines.collect do |line|
|
90
|
+
if line =~ /\S/ # line has at least one non-whitespace character
|
91
|
+
line.lstrip
|
92
|
+
else
|
93
|
+
line
|
94
|
+
end
|
95
|
+
end.join()
|
92
96
|
end
|
93
97
|
|
94
98
|
# execute the given block, retrying only when one of the given exceptions is raised
|
data/lib/rubber/version.rb
CHANGED
@@ -136,6 +136,12 @@ cloud_provider: aws
|
|
136
136
|
#
|
137
137
|
# instance_storage_backup: "storage:#{cloud_providers.aws.backup_bucket}/RubberInstances_#{app_name}/instance-#{Rubber.env}-#{Time.now.strftime('%Y%m%d-%H%M%S')}.yml"
|
138
138
|
|
139
|
+
# OPTIONAL: Default ports for security groups
|
140
|
+
web_port: 80
|
141
|
+
web_ssl_port: 443
|
142
|
+
web_tools_port: 8080
|
143
|
+
web_tools_ssl_port: 8443
|
144
|
+
|
139
145
|
# OPTIONAL: Define security groups
|
140
146
|
# Each security group is a name associated with a sequence of maps where the
|
141
147
|
# keys are the parameters to the ec2 AuthorizeSecurityGroupIngress API
|
@@ -166,9 +172,36 @@ security_groups:
|
|
166
172
|
from_port: 22
|
167
173
|
to_port: 22
|
168
174
|
source_ips: [0.0.0.0/0]
|
175
|
+
web:
|
176
|
+
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
177
|
+
rules:
|
178
|
+
- protocol: tcp
|
179
|
+
from_port: "#{web_port}"
|
180
|
+
to_port: "#{web_port}"
|
181
|
+
source_ips: [0.0.0.0/0]
|
182
|
+
- protocol: tcp
|
183
|
+
from_port: "#{web_ssl_port}"
|
184
|
+
to_port: "#{web_ssl_port}"
|
185
|
+
source_ips: [0.0.0.0/0]
|
186
|
+
web_tools:
|
187
|
+
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
188
|
+
rules:
|
189
|
+
- protocol: tcp
|
190
|
+
from_port: "#{web_tools_port}"
|
191
|
+
to_port: "#{web_tools_port}"
|
192
|
+
source_ips: [0.0.0.0/0]
|
193
|
+
- protocol: tcp
|
194
|
+
from_port: "#{web_tools_ssl_port}"
|
195
|
+
to_port: "#{web_tools_ssl_port}"
|
196
|
+
source_ips: [0.0.0.0/0]
|
169
197
|
|
170
198
|
# OPTIONAL: The default security groups to create instances with
|
171
199
|
assigned_security_groups: [default]
|
200
|
+
roles:
|
201
|
+
web:
|
202
|
+
assigned_security_groups: [web]
|
203
|
+
web_tools:
|
204
|
+
assigned_security_groups: [web_tools]
|
172
205
|
|
173
206
|
# OPTIONAL: Automatically create security groups for each host and role
|
174
207
|
# EC2 doesn't allow one to change what groups an instance belongs to after
|
@@ -229,10 +262,10 @@ stop_on_error_cmd: "function error_exit { exit 99; }; trap error_exit ERR"
|
|
229
262
|
# of zones
|
230
263
|
# availability_zone: us-east-1a
|
231
264
|
|
232
|
-
# OPTIONAL: If you want
|
265
|
+
# OPTIONAL: If you want to use Elastic Block Store (EBS) persistent
|
233
266
|
# volumes, add them to host specific overrides and they will get created
|
234
267
|
# and assigned to the instance. On initial creation, the volume will get
|
235
|
-
# attached _and_ formatted, but if your host
|
268
|
+
# attached _and_ formatted, but if your host disappears and you recreate
|
236
269
|
# it, the volume will only get remounted thereby preserving your data
|
237
270
|
#
|
238
271
|
# hosts:
|
@@ -1,41 +1,6 @@
|
|
1
|
-
|
2
1
|
role_dependencies:
|
3
2
|
web: [nginx, haproxy]
|
4
3
|
app: [mongrel]
|
5
4
|
web_tools: [nginx, graphite_server, graphite_web]
|
6
5
|
|
7
6
|
haproxy_listen_port: 9000
|
8
|
-
web_port: 80
|
9
|
-
web_ssl_port: 443
|
10
|
-
web_tools_port: 8080
|
11
|
-
web_tools_ssl_port: 8443
|
12
|
-
|
13
|
-
security_groups:
|
14
|
-
web:
|
15
|
-
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
16
|
-
rules:
|
17
|
-
- protocol: tcp
|
18
|
-
from_port: "#{web_port}"
|
19
|
-
to_port: "#{web_port}"
|
20
|
-
source_ips: [0.0.0.0/0]
|
21
|
-
- protocol: tcp
|
22
|
-
from_port: "#{web_ssl_port}"
|
23
|
-
to_port: "#{web_ssl_port}"
|
24
|
-
source_ips: [0.0.0.0/0]
|
25
|
-
web_tools:
|
26
|
-
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
27
|
-
rules:
|
28
|
-
- protocol: tcp
|
29
|
-
from_port: "#{web_tools_port}"
|
30
|
-
to_port: "#{web_tools_port}"
|
31
|
-
source_ips: [0.0.0.0/0]
|
32
|
-
- protocol: tcp
|
33
|
-
from_port: "#{web_tools_ssl_port}"
|
34
|
-
to_port: "#{web_tools_ssl_port}"
|
35
|
-
source_ips: [0.0.0.0/0]
|
36
|
-
|
37
|
-
roles:
|
38
|
-
web:
|
39
|
-
assigned_security_groups: [web]
|
40
|
-
web_tools:
|
41
|
-
assigned_security_groups: [web_tools]
|
@@ -1,40 +1,5 @@
|
|
1
|
-
|
2
1
|
role_dependencies:
|
3
2
|
web: [haproxy]
|
4
3
|
app: [passenger]
|
5
4
|
web_tools: [apache, graphite_server, graphite_web]
|
6
5
|
|
7
|
-
web_port: 80
|
8
|
-
web_ssl_port: 443
|
9
|
-
web_tools_port: 8080
|
10
|
-
web_tools_ssl_port: 8443
|
11
|
-
|
12
|
-
security_groups:
|
13
|
-
web:
|
14
|
-
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
15
|
-
rules:
|
16
|
-
- protocol: tcp
|
17
|
-
from_port: "#{web_port}"
|
18
|
-
to_port: "#{web_port}"
|
19
|
-
source_ips: [0.0.0.0/0]
|
20
|
-
- protocol: tcp
|
21
|
-
from_port: "#{web_ssl_port}"
|
22
|
-
to_port: "#{web_ssl_port}"
|
23
|
-
source_ips: [0.0.0.0/0]
|
24
|
-
web_tools:
|
25
|
-
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
26
|
-
rules:
|
27
|
-
- protocol: tcp
|
28
|
-
from_port: "#{web_tools_port}"
|
29
|
-
to_port: "#{web_tools_port}"
|
30
|
-
source_ips: [0.0.0.0/0]
|
31
|
-
- protocol: tcp
|
32
|
-
from_port: "#{web_tools_ssl_port}"
|
33
|
-
to_port: "#{web_tools_ssl_port}"
|
34
|
-
source_ips: [0.0.0.0/0]
|
35
|
-
|
36
|
-
roles:
|
37
|
-
web:
|
38
|
-
assigned_security_groups: [web]
|
39
|
-
web_tools:
|
40
|
-
assigned_security_groups: [web_tools]
|
@@ -2,38 +2,3 @@ role_dependencies:
|
|
2
2
|
web: [haproxy]
|
3
3
|
app: [passenger_nginx]
|
4
4
|
web_tools: [passenger_nginx]
|
5
|
-
|
6
|
-
web_port: 80
|
7
|
-
web_ssl_port: 443
|
8
|
-
web_tools_port: 8080
|
9
|
-
web_tools_ssl_port: 8443
|
10
|
-
|
11
|
-
security_groups:
|
12
|
-
web:
|
13
|
-
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
14
|
-
rules:
|
15
|
-
- protocol: tcp
|
16
|
-
from_port: "#{web_port}"
|
17
|
-
to_port: "#{web_port}"
|
18
|
-
source_ips: [0.0.0.0/0]
|
19
|
-
- protocol: tcp
|
20
|
-
from_port: "#{web_ssl_port}"
|
21
|
-
to_port: "#{web_ssl_port}"
|
22
|
-
source_ips: [0.0.0.0/0]
|
23
|
-
web_tools:
|
24
|
-
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
25
|
-
rules:
|
26
|
-
- protocol: tcp
|
27
|
-
from_port: "#{web_tools_port}"
|
28
|
-
to_port: "#{web_tools_port}"
|
29
|
-
source_ips: [0.0.0.0/0]
|
30
|
-
- protocol: tcp
|
31
|
-
from_port: "#{web_tools_ssl_port}"
|
32
|
-
to_port: "#{web_tools_ssl_port}"
|
33
|
-
source_ips: [0.0.0.0/0]
|
34
|
-
|
35
|
-
roles:
|
36
|
-
web:
|
37
|
-
assigned_security_groups: [web]
|
38
|
-
web_tools:
|
39
|
-
assigned_security_groups: [web_tools]
|
@@ -1,38 +1,3 @@
|
|
1
1
|
role_dependencies:
|
2
2
|
app: [unicorn]
|
3
3
|
web_tools: [nginx]
|
4
|
-
|
5
|
-
web_port: 80
|
6
|
-
web_ssl_port: 443
|
7
|
-
web_tools_port: 8080
|
8
|
-
web_tools_ssl_port: 8443
|
9
|
-
|
10
|
-
security_groups:
|
11
|
-
web:
|
12
|
-
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
13
|
-
rules:
|
14
|
-
- protocol: tcp
|
15
|
-
from_port: "#{web_port}"
|
16
|
-
to_port: "#{web_port}"
|
17
|
-
source_ips: [0.0.0.0/0]
|
18
|
-
- protocol: tcp
|
19
|
-
from_port: "#{web_ssl_port}"
|
20
|
-
to_port: "#{web_ssl_port}"
|
21
|
-
source_ips: [0.0.0.0/0]
|
22
|
-
web_tools:
|
23
|
-
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
24
|
-
rules:
|
25
|
-
- protocol: tcp
|
26
|
-
from_port: "#{web_tools_port}"
|
27
|
-
to_port: "#{web_tools_port}"
|
28
|
-
source_ips: [0.0.0.0/0]
|
29
|
-
- protocol: tcp
|
30
|
-
from_port: "#{web_tools_ssl_port}"
|
31
|
-
to_port: "#{web_tools_ssl_port}"
|
32
|
-
source_ips: [0.0.0.0/0]
|
33
|
-
|
34
|
-
roles:
|
35
|
-
web:
|
36
|
-
assigned_security_groups: [web]
|
37
|
-
web_tools:
|
38
|
-
assigned_security_groups: [web_tools]
|
@@ -1,37 +1,2 @@
|
|
1
1
|
role_dependencies:
|
2
2
|
app: [passenger_nginx]
|
3
|
-
|
4
|
-
web_port: 80
|
5
|
-
web_ssl_port: 443
|
6
|
-
web_tools_port: 8080
|
7
|
-
web_tools_ssl_port: 8443
|
8
|
-
|
9
|
-
security_groups:
|
10
|
-
web:
|
11
|
-
description: "To open up port #{web_port}/#{web_ssl_port} for http server on web role"
|
12
|
-
rules:
|
13
|
-
- protocol: tcp
|
14
|
-
from_port: "#{web_port}"
|
15
|
-
to_port: "#{web_port}"
|
16
|
-
source_ips: [0.0.0.0/0]
|
17
|
-
- protocol: tcp
|
18
|
-
from_port: "#{web_ssl_port}"
|
19
|
-
to_port: "#{web_ssl_port}"
|
20
|
-
source_ips: [0.0.0.0/0]
|
21
|
-
web_tools:
|
22
|
-
description: "To open up port #{web_tools_port}/#{web_tools_ssl_port} for internal/tools http server"
|
23
|
-
rules:
|
24
|
-
- protocol: tcp
|
25
|
-
from_port: "#{web_tools_port}"
|
26
|
-
to_port: "#{web_tools_port}"
|
27
|
-
source_ips: [0.0.0.0/0]
|
28
|
-
- protocol: tcp
|
29
|
-
from_port: "#{web_tools_ssl_port}"
|
30
|
-
to_port: "#{web_tools_ssl_port}"
|
31
|
-
source_ips: [0.0.0.0/0]
|
32
|
-
|
33
|
-
roles:
|
34
|
-
web:
|
35
|
-
assigned_security_groups: [web]
|
36
|
-
web_tools:
|
37
|
-
assigned_security_groups: [web_tools]
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-02-
|
13
|
+
date: 2013-02-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: capistrano
|
@@ -681,7 +681,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
681
681
|
version: '0'
|
682
682
|
segments:
|
683
683
|
- 0
|
684
|
-
hash: -
|
684
|
+
hash: -804077065696695776
|
685
685
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
686
686
|
none: false
|
687
687
|
requirements:
|
@@ -690,52 +690,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
690
690
|
version: '0'
|
691
691
|
segments:
|
692
692
|
- 0
|
693
|
-
hash: -
|
693
|
+
hash: -804077065696695776
|
694
694
|
requirements: []
|
695
695
|
rubyforge_project: rubber
|
696
|
-
rubygems_version: 1.8.
|
696
|
+
rubygems_version: 1.8.23
|
697
697
|
signing_key:
|
698
698
|
specification_version: 3
|
699
699
|
summary: A capistrano plugin for managing multi-instance deployments to the cloud
|
700
700
|
(ec2)
|
701
|
-
test_files:
|
702
|
-
- test/cloud/aws_table_store_test.rb
|
703
|
-
- test/cloud/aws_test.rb
|
704
|
-
- test/cloud/fog_storage_test.rb
|
705
|
-
- test/cloud/fog_test.rb
|
706
|
-
- test/command_test.rb
|
707
|
-
- test/commands/cron_test.rb
|
708
|
-
- test/commands/util_test.rb
|
709
|
-
- test/dns/aws_test.rb
|
710
|
-
- test/dns/zerigo_test.rb
|
711
|
-
- test/encryption_test.rb
|
712
|
-
- test/environment_test.rb
|
713
|
-
- test/fixtures/basic/common/bar.conf
|
714
|
-
- test/fixtures/basic/common/foo.conf
|
715
|
-
- test/fixtures/basic/host/host1/foo.conf
|
716
|
-
- test/fixtures/basic/host/host2/foo.conf
|
717
|
-
- test/fixtures/basic/role/role1/foo.conf
|
718
|
-
- test/fixtures/basic/role/role2/foo.conf
|
719
|
-
- test/fixtures/basic/rubber-extra.yml
|
720
|
-
- test/fixtures/basic/rubber.yml
|
721
|
-
- test/fixtures/expansion/rubber.yml
|
722
|
-
- test/fixtures/generator_order/common/a_first.conf
|
723
|
-
- test/fixtures/generator_order/common/z_last.conf
|
724
|
-
- test/fixtures/generator_order/host/host1/a_first.conf
|
725
|
-
- test/fixtures/generator_order/host/host1/z_last.conf
|
726
|
-
- test/fixtures/generator_order/role/role1/a_first.conf
|
727
|
-
- test/fixtures/generator_order/role/role1/z_last.conf
|
728
|
-
- test/fixtures/generator_order/role/role2/a_first.conf
|
729
|
-
- test/fixtures/generator_order/role/role2/z_last.conf
|
730
|
-
- test/fixtures/instance_expansion/instance-test.yml
|
731
|
-
- test/fixtures/instance_expansion/rubber.yml
|
732
|
-
- test/fixtures/nested/rubber.yml
|
733
|
-
- test/fixtures/obfuscated/rubber.yml
|
734
|
-
- test/fixtures/obfuscated/secret.yml
|
735
|
-
- test/fixtures/secret/rubber.yml
|
736
|
-
- test/fixtures/secret/secret.yml
|
737
|
-
- test/generator_test.rb
|
738
|
-
- test/instance_test.rb
|
739
|
-
- test/test-rails-template.rb
|
740
|
-
- test/test_helper.rb
|
741
|
-
- test/util_test.rb
|
701
|
+
test_files: []
|