rubber 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []