rubber 2.2.0 → 2.2.1

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.
@@ -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
- # - rbx-18mode
10
- # - rbx-19mode
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
- [core] Use OpenJDK so encryption tests will pass. <e36ce01>
5
- [core] Set up the elastic IP when it doesn't match the instance's current external IP <ea960c9>
6
- [core] Merge pull request #229 from peterson/master <23c0c2b>
7
- [core] fix reboot behavior <d77ce29>
8
- [core] net-ssh 2.6 supposedly fixes all the connection problems we've been seeing with 2.5.x. <9b32ecb>
9
- [core] Merge pull request #247 from zmillman/master <0e26bdd>
10
- [core] ruby 1.8.7 compatibility <09e64d4>
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
- [core] change license to ASLv2 <9f3915d>
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
- [zookeeper] Merge pull request #234 from ScotterC/patch-5 <611b40b>
97
- [zookeeper] Update templates/zookeeper/config/rubber/rubber-zookeeper.yml <dbfd808>
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/wr0ngway/rubber/wiki
5
+ http://github.com/rubber/rubber/wiki
6
6
 
7
- [![Build Status](https://secure.travis-ci.org/wr0ngway/rubber.png)](http://travis-ci.org/wr0ngway/rubber)
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
- lines = []
21
- line = ""
22
- VulcanizeThor.valid_templates.each do |t|
23
- line << ", " if line.size > 0
24
- line << t
25
- if line.size > 55
26
- lines << line + ","
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
- [*options[:roles]].each do |r|
32
- roles[r] ||= []
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
- Adds the given ROLES to the instance named ALIAS
149
+ Alias for rubber:roles:add
102
150
  DESC
103
151
  required_task :add_role do
104
- instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
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
- Removes the given ROLES from the instance named ALIAS
156
+ Alias for rubber:roles:remove
131
157
  DESC
132
158
  required_task :remove_role do
133
- instance_alias = get_env('ALIAS', "Instance alias (e.g. web01)", true)
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
 
@@ -6,6 +6,7 @@ namespace :rubber do
6
6
  DESC
7
7
  required_task :update_tags do
8
8
  rubber_instances.each do |ic|
9
+ logger.info "Updating instance tags for #{ic.name}"
9
10
  Rubber::Tag::update_instance_tags(ic.name)
10
11
  end
11
12
  end
@@ -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
- serial_roles = Array(options[:roles])
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
- self.roles.each do |rolename, serverdefs|
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
- # get servers for each role
94
- self.roles.each do |rolename, serverdefs|
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
- serial_roles.each_with_index do |rolename, i|
104
- servers[rolename] ||= []
105
- serial_roles[i+1..-1].each do |r|
106
- servers[r] -= servers[rolename]
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, but combine slices across roles
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 = (Float(svrs.size) / (options.delete(:groups) || 2)).round
118
- slice_size = 1 if slice_size == 0
119
- slice_idx = 0
120
- svrs.each_slice(slice_size) do |srv_slice|
121
- slices[slice_idx] ||= []
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|
@@ -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
- counts = str.lines.collect {|l| l.scan(/^\s*/).first.size }
90
- m = counts.reject {|x| x <= 1 }.min
91
- str.lines.collect {|l| l.size < m ? l : l[m..-1] }.join("")
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
@@ -1,3 +1,3 @@
1
1
  module Rubber
2
- VERSION = "2.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
@@ -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 t use Elastic Block Store (EBS) persistent
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 disapears and you recreate
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]
@@ -4,7 +4,7 @@ require 'rubber'
4
4
  Rubber::initialize(File.dirname(__FILE__), 'test')
5
5
 
6
6
  require 'test/unit'
7
- require 'mocha'
7
+ require 'mocha/setup'
8
8
  require 'shoulda-context'
9
9
  require 'pp'
10
10
  require 'ap'
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.0
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-08 00:00:00.000000000 Z
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: -1895405216543771761
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: -1895405216543771761
693
+ hash: -804077065696695776
694
694
  requirements: []
695
695
  rubyforge_project: rubber
696
- rubygems_version: 1.8.24
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: []