rubber 2.1.0 → 2.1.1

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