rubber 2.1.0 → 2.1.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.
Files changed (43) hide show
  1. data/.travis.yml +2 -2
  2. data/CHANGELOG +33 -0
  3. data/lib/rubber/cloud/fog.rb +12 -14
  4. data/lib/rubber/configuration.rb +1 -1
  5. data/lib/rubber/environment.rb +12 -3
  6. data/lib/rubber/recipes/rubber/setup.rb +7 -1
  7. data/lib/rubber/recipes/rubber/utils.rb +4 -1
  8. data/lib/rubber/version.rb +1 -2
  9. data/rubber.gemspec +1 -1
  10. data/templates/apache/config/rubber/deploy-apache.rb +13 -2
  11. data/templates/base/config/rubber/rubber.yml +9 -2
  12. data/templates/complete_passenger/config/rubber/role/haproxy/haproxy-passenger.conf +8 -1
  13. data/templates/couchbase/config/rubber/deploy-couchbase.rb +105 -0
  14. data/templates/couchbase/config/rubber/role/couchbase/crontab +8 -0
  15. data/templates/couchbase/config/rubber/rubber-couchbase.yml +25 -0
  16. data/templates/couchbase/templates.rb +3 -0
  17. data/templates/couchbase/templates.yml +1 -0
  18. data/templates/graylog/config/rubber/deploy-graylog.rb +5 -1
  19. data/templates/graylog/config/rubber/role/graylog_web/graylog_web-upstart.conf +1 -1
  20. data/templates/graylog/config/rubber/rubber-graylog.yml +3 -3
  21. data/templates/jenkins/config/rubber/deploy-jenkins.rb +37 -24
  22. data/templates/jenkins/config/rubber/role/jenkins/crontab +7 -0
  23. data/templates/jenkins/config/rubber/role/jenkins/github-deploy-key.pem +2 -0
  24. data/templates/jenkins/config/rubber/role/jenkins/github-deploy-key.pem.pub +2 -0
  25. data/templates/jenkins/config/rubber/role/jenkins/jenkins-apache-vhost.conf +1 -1
  26. data/templates/jenkins/config/rubber/rubber-jenkins.yml +1 -1
  27. data/templates/monit/config/rubber/role/couchbase/monit-couchbase.conf +7 -0
  28. data/templates/monit/config/rubber/role/resque_scheduler/monit-resque_scheduler.conf +10 -0
  29. data/templates/mysql/config/rubber/deploy-mysql.rb +1 -0
  30. data/templates/passenger/config/rubber/deploy-passenger.rb +43 -4
  31. data/templates/passenger/config/rubber/rubber-passenger.yml +4 -1
  32. data/templates/passenger_nginx/config/rubber/role/passenger_nginx/application.conf +13 -0
  33. data/templates/torquebox/config/rubber/role/torquebox/standalone-ha.xml +60 -54
  34. data/templates/torquebox/config/rubber/role/torquebox/standalone.conf +1 -0
  35. data/templates/torquebox/config/rubber/rubber-torquebox.yml +6 -4
  36. data/test/cloud/aws_test.rb +1 -1
  37. data/test/cloud/fog_test.rb +1 -1
  38. data/test/dns/aws_test.rb +28 -4
  39. data/test/dns/zerigo_test.rb +2 -2
  40. data/test/environment_test.rb +28 -8
  41. data/test/fixtures/basic/rubber.yml +5 -0
  42. data/test/instance_test.rb +1 -1
  43. metadata +14 -6
@@ -3,9 +3,9 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- - jruby-18mode
6
+ # - jruby-18mode
7
7
  - jruby-19mode
8
- - jruby-head
8
+ # - jruby-head
9
9
  # - rbx-18mode
10
10
  # - rbx-19mode
11
11
  # script: bundle exec rspec spec
data/CHANGELOG CHANGED
@@ -1,3 +1,36 @@
1
+ 2.1.1 (10/02/2012)
2
+ ------------------
3
+
4
+ New Features:
5
+ ============
6
+ [base] add ability to override by environment in rubber*.yml <f4c4af3>
7
+ [couchbase, monit] add couchbase template <550dff4>
8
+
9
+ Improvements:
10
+ ============
11
+ [core] Updated sudo_script to sudo to any user. <288ef5d>
12
+ [apache, jenkins] create an apache bootstrap so jenkins template doesn't have to duplicate logic <5862791>
13
+ [complete_passenger, passenger] do a rolling passenger restart by tieing into apache rolling restart <065d757>
14
+ [complete_passenger] dont do health check over ssl by default (Fails with self signed cert) <a5a8da7>
15
+ [graylog] Updated graylog from 0.9.6 to 0.9.6p1. <864795c>
16
+ [graylog] Use puma instead of passenger for graylog-web, since it works much better with JRuby. <7419705>
17
+ [jenkins] Added support for backing up Jenkins. <a44162d>
18
+ [jenkins] Fixed Jenkins config. <bbaa6f4>
19
+ [jenkins] Make sure we have the header module enabled for the config to work. <93d03d8>
20
+ [jenkins] The module is "headers", not "header". <4057334>
21
+ [passenger] Bumped rubber from 3.0.12 to 3.0.15. <bc408f1>
22
+ [passenger_nginx] Updated Nginx config to improve performance of asset pipeline. <7184327>
23
+ [torquebox] Updated TorqueBox config from 2.0.3 to 2.1.0. <13a0268>
24
+
25
+ Bug Fixes:
26
+ =========
27
+ [core] fix merging of alias records <d314857>
28
+ [core] Refactor to avoid fog deprecation, fixes #222 <43ea42f>
29
+ [core] assign defaults for partial records in rubber-dns.yml when running setup_dns_records <a72a701>
30
+ [monit] monit check for resque scheduler - fixes #221 <34a4fde>
31
+ [mysql] Delete anonymous MySQL user when bootstrapping the db. Fixes #185 (pull request #212) <ce84ff2>
32
+ [torquebox] Always use the rubber system JRuby with Torquebox. <9c03a02>
33
+
1
34
  2.1.0 (08/20/2012)
2
35
  ------------------
3
36
 
@@ -171,30 +171,28 @@ module Rubber
171
171
 
172
172
  def add_security_group_rule(group_name, protocol, from_port, to_port, source)
173
173
  group = @compute_provider.security_groups.get(group_name)
174
+ opts = {:ip_protocol => protocol || 'tcp'}
175
+
174
176
  if source.instance_of? Hash
175
- if protocol
176
- groupstr = "#{source[:account]}:#{source[:name]}"
177
- group.authorize_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :group => groupstr)
178
- else
179
- group.authorize_group_and_owner(source[:name], source[:account])
180
- end
177
+ opts[:group] = {source[:account] => source[:name]}
181
178
  else
182
- group.authorize_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :cidr_ip => source)
179
+ opts[:cidr_ip] = source
183
180
  end
181
+
182
+ group.authorize_port_range(from_port.to_i..to_port.to_i, opts)
184
183
  end
185
184
 
186
185
  def remove_security_group_rule(group_name, protocol, from_port, to_port, source)
187
186
  group = @compute_provider.security_groups.get(group_name)
187
+ opts = {:ip_protocol => protocol || 'tcp'}
188
+
188
189
  if source.instance_of? Hash
189
- if protocol
190
- groupstr = "#{source[:account]}:#{source[:name]}"
191
- group.revoke_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :group => groupstr)
192
- else
193
- group.revoke_group_and_owner(source[:name], source[:account])
194
- end
190
+ opts[:group] = {source[:account] => source[:name]}
195
191
  else
196
- group.revoke_port_range(from_port.to_i..to_port.to_i, :ip_protocol => protocol, :cidr_ip => source)
192
+ opts[:cidr_ip] = source
197
193
  end
194
+
195
+ group.revoke_port_range(from_port.to_i..to_port.to_i, opts)
198
196
  end
199
197
 
200
198
  def destroy_security_group(group_name)
@@ -34,7 +34,7 @@ module Rubber
34
34
  def initialize(env=nil, root=nil)
35
35
  @env = env
36
36
  @root = root || "#{Rubber.root}/config/rubber"
37
- @environment = Environment.new("#{@root}")
37
+ @environment = Environment.new("#{@root}", @env)
38
38
  end
39
39
 
40
40
  def load
@@ -9,11 +9,14 @@ module Rubber
9
9
  # the host/role passed into bind
10
10
  class Environment
11
11
  attr_reader :config_root
12
+ attr_reader :config_env
12
13
  attr_reader :config_files
13
14
  attr_reader :config_secret
14
15
 
15
- def initialize(config_root)
16
+ def initialize(config_root, env)
16
17
  @config_root = config_root
18
+ @config_env = env
19
+
17
20
  @config_files = ["#{@config_root}/rubber.yml"]
18
21
  @config_files += Dir["#{@config_root}/rubber-*.yml"].sort
19
22
 
@@ -71,7 +74,7 @@ module Rubber
71
74
  end
72
75
 
73
76
  def bind(roles = nil, host = nil)
74
- BoundEnv.new(@items, roles, host)
77
+ BoundEnv.new(@items, roles, host, config_env)
75
78
  end
76
79
 
77
80
  # combine old and new into a single value:
@@ -160,10 +163,12 @@ module Rubber
160
163
  class BoundEnv < HashValueProxy
161
164
  attr_reader :roles
162
165
  attr_reader :host
166
+ attr_reader :env
163
167
 
164
- def initialize(global, roles, host)
168
+ def initialize(global, roles, host, env)
165
169
  @roles = roles
166
170
  @host = host
171
+ @env = env
167
172
  bound_global = bind_config(global)
168
173
  super(nil, bound_global)
169
174
  end
@@ -176,12 +181,16 @@ module Rubber
176
181
  def bind_config(global)
177
182
  global = global.clone()
178
183
  role_overrides = global.delete("roles") || {}
184
+ env_overrides = global.delete("environments") || {}
179
185
  host_overrides = global.delete("hosts") || {}
180
186
  Array(roles).each do |role|
181
187
  Array(role_overrides[role]).each do |k, v|
182
188
  global[k] = Environment.combine(global[k], v)
183
189
  end
184
190
  end
191
+ Array(env_overrides[env]).each do |k, v|
192
+ global[k] = Environment.combine(global[k], v)
193
+ end
185
194
  Array(host_overrides[host]).each do |k, v|
186
195
  global[k] = Environment.combine(global[k], v)
187
196
  end
@@ -173,7 +173,12 @@ namespace :rubber do
173
173
  record[:type] ||= r[:type]
174
174
  record[:ttl] ||= r[:ttl] if r[:ttl]
175
175
  record[:data] ||= []
176
- record[:data].concat(Array(r[:data]))
176
+ case r[:data]
177
+ when nil then ;
178
+ when Array then record[:data].concat(r[:data])
179
+ else
180
+ record[:data] << r[:data]
181
+ end
177
182
  end
178
183
  return record
179
184
  end
@@ -194,6 +199,7 @@ namespace :rubber do
194
199
  rubber_records = {}
195
200
  records.each do |record|
196
201
  record = Rubber::Util.symbolize_keys(record)
202
+ record = provider.setup_opts(record) # assign defaults
197
203
  key = record_key(record)
198
204
  rubber_records[key] ||= []
199
205
  rubber_records[key] << record
@@ -170,9 +170,12 @@ namespace :rubber do
170
170
  end
171
171
 
172
172
  def sudo_script(name, contents, opts = {})
173
+ user = opts.delete(:as)
173
174
  args = opts.delete(:script_args)
174
175
  script = prepare_script(name, contents)
175
- run "#{sudo} bash -l #{script} #{args}", opts
176
+
177
+ sudo_args = user ? "-H -u #{user}" : ""
178
+ run "#{sudo} #{sudo_args} bash -l #{script} #{args}", opts
176
179
  end
177
180
 
178
181
  def top.rsudo(command, opts = {}, &block)
@@ -1,4 +1,3 @@
1
1
  module Rubber
2
- VERSION = "2.1.0"
2
+ VERSION = "2.1.1"
3
3
  end
4
-
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.add_dependency 'thor'
35
35
  s.add_dependency 'clamp'
36
36
  s.add_dependency 'open4'
37
- s.add_dependency 'fog', '~> 1.5'
37
+ s.add_dependency 'fog', '~> 1.6'
38
38
  s.add_dependency 'json'
39
39
 
40
40
  s.add_development_dependency('rake')
@@ -18,14 +18,25 @@ namespace :rubber do
18
18
  fi
19
19
  ENDSCRIPT
20
20
  end
21
+
22
+ after "rubber:bootstrap", "rubber:apache:bootstrap"
23
+
24
+ task :bootstrap, :roles => :apache do
25
+ exists = capture("grep 'empty ports file' /etc/apache2/ports.conf || true")
26
+ if exists.strip.size == 0
27
+ rubber.update_code_for_bootstrap
28
+ rubber.run_config(:file => "role/apache", :force => true, :deploy_path => release_path)
29
+ end
30
+ end
31
+
21
32
 
22
33
  # serial_task can only be called after roles defined - not normally a problem, but
23
34
  # rubber auto-roles don't get defined till after all tasks are defined
24
35
  on :load do
25
- rubber.serial_task self, :serial_restart, :roles => :apache do
36
+ rubber.serial_task self, :serial_restart, :roles => [:app, :apache] do
26
37
  rsudo "service apache2 stop; service apache2 start"
27
38
  end
28
- rubber.serial_task self, :serial_reload, :roles => :apache do
39
+ rubber.serial_task self, :serial_reload, :roles => [:app, :apache] do
29
40
  rsudo "if ! ps ax | grep -v grep | grep -c apache2 &> /dev/null; then service apache2 start; else service apache2 reload; fi"
30
41
  end
31
42
  end
@@ -302,8 +302,8 @@ stop_on_error_cmd: "function error_exit { exit 99; }; trap error_exit ERR"
302
302
  #
303
303
  # var_name: var_value
304
304
 
305
- # All variables can also be overridden on the role and/or host level by creating
306
- # a sub level to the config under roles and hosts
305
+ # All variables can also be overridden on the role, environment and/or host level by creating
306
+ # a sub level to the config under roles, environments and hosts. The precedence is host, environment, role
307
307
  # e.g. to install mysql only on db role, and awstats only on web01:
308
308
 
309
309
  # OPTIONAL: Role specific overrides
@@ -313,6 +313,13 @@ stop_on_error_cmd: "function error_exit { exit 99; }; trap error_exit ERR"
313
313
  # somerole2:
314
314
  # myconfig: someval
315
315
 
316
+ # OPTIONAL: Environment specific overrides
317
+ # environments:
318
+ # staging:
319
+ # myconfig: otherval
320
+ # production:
321
+ # myconfig: val
322
+
316
323
  # OPTIONAL: Host specific overrides
317
324
  # hosts:
318
325
  # somehost:
@@ -8,14 +8,21 @@
8
8
  %>
9
9
 
10
10
  listen passenger_proxy 0.0.0.0:<%= rubber_env.web_port %>
11
+ monitor-uri /haproxy_test
11
12
  option forwardfor
13
+ <% if Rubber.env == 'production' %>
14
+ option httpchk OPTIONS /httpchk.txt
15
+ <% end %>
12
16
  <% backend_hosts.each do |server| %>
13
17
  server <%= server %> <%= server %>:<%= rubber_env.passenger_listen_port %> maxconn <%= rubber_env.max_app_connections %> check
14
18
  <% end %>
15
19
 
16
20
  listen passenger_proxy_ssl 0.0.0.0:<%= rubber_env.web_ssl_port %>
17
21
  mode tcp
18
- option forwardfor
22
+ <% if Rubber.env == 'production' %>
23
+ # only uncomment if you have a valid ssl cert
24
+ # option httpchk OPTIONS /httpchk.txt
25
+ <% end %>
19
26
  <% backend_hosts.each do |server| %>
20
27
  server <%= server %> <%= server %>:<%= rubber_env.passenger_listen_ssl_port %> maxconn <%= rubber_env.max_app_connections %> check
21
28
  <% end %>
@@ -0,0 +1,105 @@
1
+ namespace :rubber do
2
+
3
+ namespace :couchbase do
4
+
5
+ rubber.allow_optional_tasks(self)
6
+
7
+ before "rubber:install_packages", "rubber:couchbase:setup_apt_sources"
8
+
9
+ # sources needed for couchbase ruby client, not server
10
+ task :setup_apt_sources do
11
+ sources = <<-SOURCES
12
+ # Ubuntu 11.10 Oneiric Ocelot (Debian unstable)
13
+ #
14
+ # preview version needed for ruby client that has rails cache/session
15
+ #
16
+ # deb http://packages.couchbase.com/ubuntu oneiric oneiric/main
17
+ deb http://packages.couchbase.com/preview/ubuntu oneiric oneiric/main
18
+ SOURCES
19
+ sources.gsub!(/^[ \t]*/, '')
20
+ put(sources, "/etc/apt/sources.list.d/couchbase.list")
21
+ rsudo "wget -O- http://packages.couchbase.com/ubuntu/couchbase.key | sudo apt-key add -"
22
+ end
23
+
24
+ after "rubber:install_packages", "rubber:couchbase:install"
25
+
26
+ task :install, :roles => :couchbase do
27
+ rubber.sudo_script 'install_couchbase', <<-ENDSCRIPT
28
+ if ! grep "^#{rubber_env.couchbase_version}" /opt/couchbase/VERSION.txt &> /dev/null; then
29
+ # Fetch and install the pkg
30
+ rm -rf /tmp/couchbase*
31
+ wget -qNP /tmp #{rubber_env.couchbase_pkg_url}
32
+ dpkg -i /tmp/couchbase*
33
+
34
+ # Clean up after ourselves.
35
+ rm -rf /tmp/couchbase*
36
+ fi
37
+ ENDSCRIPT
38
+ end
39
+
40
+ after "rubber:bootstrap", "rubber:couchbase:bootstrap"
41
+
42
+ task :bootstrap, :roles => :couchbase do
43
+ exists = capture("echo $(ls #{rubber_env.couchbase_db_dir} 2> /dev/null)")
44
+ if exists.strip.size == 0
45
+
46
+ cli = rubber_env.couchbase_cli
47
+ create_bucket_lines = []
48
+ ram_size = 0
49
+ rubber_env.couchbase_buckets.each do |bucket_spec|
50
+ create_bucket_lines << "#{cli} bucket-create $cluster --bucket=#{bucket_spec['name']} --bucket-type=#{bucket_spec['type']} --bucket-port=#{bucket_spec['port']} --bucket-ramsize=#{bucket_spec['size']} --bucket-replica=#{bucket_spec['replicas']}"
51
+ ram_size += bucket_spec['size'].to_i
52
+ end
53
+
54
+ rubber.sudo_script 'bootstrap_couchbase', <<-ENDSCRIPT
55
+ mkdir -p #{rubber_env.couchbase_db_dir}
56
+ chown -R couchbase:couchbase #{rubber_env.couchbase_db_dir}
57
+ local_ip=$(ifconfig eth0 | awk -F"[: ]+" 'NR==2 {print $4}')
58
+ cluster="-c $local_ip:8091 -u #{rubber_env.couchbase_admin_username} -p #{rubber_env.couchbase_admin_password}"
59
+
60
+ # Setup cluster
61
+ #{cli} cluster-init $cluster --cluster-init-ramsize=#{ram_size}
62
+
63
+ # initialize the node
64
+ #{cli} node-init $cluster --node-init-data-path=#{rubber_env.couchbase_db_dir}
65
+
66
+ # create the buckets
67
+ #{create_bucket_lines.join("\n")}
68
+
69
+ ENDSCRIPT
70
+
71
+ # After everything installed on machines, we need the source tree
72
+ # on hosts in order to run rubber:config for bootstrapping the db
73
+ rubber.update_code_for_bootstrap
74
+
75
+ # Gen just the conf for couchbase
76
+ rubber.run_config(:file => "role/couchbase/", :force => true, :deploy_path => release_path)
77
+
78
+ restart
79
+ end
80
+ end
81
+
82
+ desc "Stops the couchbase server"
83
+ task :stop, :roles => :couchbase, :on_error => :continue do
84
+ rsudo "service couchbase-server stop || true"
85
+ end
86
+
87
+ desc "Starts the couchbase server"
88
+ task :start, :roles => :couchbase do
89
+ rsudo "service couchbase-server start"
90
+ end
91
+
92
+ desc "Restarts the couchbase server"
93
+ task :restart, :roles => :couchbase do
94
+ stop
95
+ start
96
+ end
97
+
98
+ desc "Reloads the couchbase server"
99
+ task :reload, :roles => :couchbase do
100
+ restart
101
+ end
102
+
103
+ end
104
+
105
+ end
@@ -0,0 +1,8 @@
1
+ <%
2
+ @read_cmd = 'crontab -l'
3
+ @write_cmd = 'crontab -'
4
+ @additive = ['# start-couchbase-crontab', '# end-couchbase-crontab']
5
+ %>
6
+
7
+ # Backup couchbase DBs every 3 hours.
8
+ # 0 */3 * * * <%= Rubber.root %>/script/rubber cron --task util:backup --directory=/mnt/couchbase_backups --name=couchbase --command="nice cbbackup <%= rubber_env.couchbase_db_dir %> \%dir\%/\%name\%_<%= rubber_env.host %>_\%time_stamp\%"
@@ -0,0 +1,25 @@
1
+ couchbase_version: 1.8.1
2
+ couchbase_pkg_url: "http://packages.couchbase.com/releases/#{couchbase_version}/couchbase-server-community_x86_64_#{couchbase_version}.deb"
3
+
4
+ couchbase_pid_file: /opt/couchbase/var/lib/couchbase/couchbase-server.pid
5
+ couchbase_cli: /opt/couchbase/bin/couchbase-cli
6
+ couchbase_db_dir: /mnt/couchbase/data
7
+
8
+ couchbase_admin_username: Administrator
9
+ couchbase_admin_password: password
10
+
11
+ couchbase_buckets:
12
+ - name: "default"
13
+ type: couchbase
14
+ size: 200
15
+ replicas: 1
16
+ port: 11211
17
+ - name: "#{app_name}"
18
+ type: couchbase
19
+ size: 200
20
+ replicas: 1
21
+ port: 11222
22
+
23
+ gems: [couchbase]
24
+
25
+ packages: [libcouchbase-dev]
@@ -0,0 +1,3 @@
1
+ if Rubber::Util::is_bundler?
2
+ append_to_file "Gemfile", "gem 'couchbase'\n"
3
+ end
@@ -0,0 +1 @@
1
+ description: The couchbase module
@@ -81,9 +81,13 @@ namespace :rubber do
81
81
  rubber.update_code_for_bootstrap
82
82
 
83
83
  rubber.run_config(:file => "role/graylog_web/", :force => true, :deploy_path => release_path)
84
-
84
+
85
85
  rubber.sudo_script 'bootstrap_graylog_web', <<-ENDSCRIPT
86
86
  cd #{rubber_env.graylog_web_dir}
87
+
88
+ # Add puma to the Gemfile so we can run the server.
89
+ echo "gem 'puma'" >> Gemfile
90
+
87
91
  export RAILS_ENV=production
88
92
  bundle install
89
93