rubber 2.14.0 → 2.15.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG +21 -0
- data/lib/rubber/cloud/aws.rb +5 -1
- data/lib/rubber/cloud/digital_ocean.rb +8 -6
- data/lib/rubber/cloud/fog.rb +5 -3
- data/lib/rubber/cloud/generic.rb +2 -2
- data/lib/rubber/cloud/vsphere.rb +3 -2
- data/lib/rubber/recipes/rubber/instances.rb +3 -2
- data/lib/rubber/version.rb +1 -1
- data/templates/base/config/rubber/rubber.yml +41 -12
- data/templates/discourse/config/rubber/role/nginx/nginx.conf +1 -0
- data/templates/postgresql/config/rubber/deploy-postgresql.rb +18 -18
- data/test/cloud/aws_test.rb +5 -1
- data/test/cloud/fog_test.rb +3 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4a86ae39c4c054ff5a2ee091be683d011eca4b9
|
4
|
+
data.tar.gz: 2eb0ad4e985ed83c0937a682955e4498d99140c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddf6ae11d0479fb544f4e9c093839503ab3ddd1d3f75057e207ab4612cfbe1002c33d354961b6fcddb32689f9c5a3dc2c327cc1ec10e9f85cfa04ddf28f4beb1
|
7
|
+
data.tar.gz: 671bda85dea0936d593772f405ec5536fc841a2cb9fa217f85553ce3221ae3448dd0eb382f96ec66890b7281b14c74e85af30278f90254266ce4e29931464455
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
2.15.0 (10/24/2014)
|
2
|
+
|
3
|
+
New Features:
|
4
|
+
============
|
5
|
+
|
6
|
+
[core] Add the ability to pass custom fog specific options during instance and volume creation. <a2e1c67>
|
7
|
+
|
8
|
+
Improvements:
|
9
|
+
============
|
10
|
+
|
11
|
+
[base] Document private networking support for new Digital Ocean regions: New York 3 and Amsterdam 3. <e85360f>
|
12
|
+
[base] Switch from ext3 to ext4 as the example filesystem in volume creation. <a21b95d>
|
13
|
+
|
14
|
+
Bug Fixes:
|
15
|
+
=========
|
16
|
+
|
17
|
+
[nginx] Add Nginx parameter required by DigitalOcean droplets. <24ac1aa>
|
18
|
+
[postgresql] Surround postgresql database name with quotes to avoid syntax error when using dash. <4017979>
|
19
|
+
|
20
|
+
|
21
|
+
|
1
22
|
2.14.0 (10/13/2014)
|
2
23
|
|
3
24
|
Improvements:
|
data/lib/rubber/cloud/aws.rb
CHANGED
@@ -320,7 +320,11 @@ module Rubber
|
|
320
320
|
end
|
321
321
|
|
322
322
|
def create_volume(instance, volume_spec)
|
323
|
-
|
323
|
+
fog_options = Rubber::Util.symbolize_keys(volume_spec['fog_options'] || {})
|
324
|
+
volume_data = {
|
325
|
+
:size => volume_spec['size'], :availability_zone => volume_spec['zone']
|
326
|
+
}.merge(fog_options)
|
327
|
+
volume = compute_provider.volumes.create(volume_data)
|
324
328
|
volume.id
|
325
329
|
end
|
326
330
|
|
@@ -29,11 +29,11 @@ module Rubber
|
|
29
29
|
super(env, capistrano)
|
30
30
|
end
|
31
31
|
|
32
|
-
# As of
|
33
|
-
# New York 2 (id 4), Amsterdam 2 (id 5), Singapore 1 (id 6) and London 1 (id 7)
|
34
|
-
REGIONS_WITH_PRIVATE_NETWORKING = [4, 5, 6, 7]
|
32
|
+
# As of October 2014 Digital Ocean supports private networking in
|
33
|
+
# New York 2 (id 4), New York 3 (id 8), Amsterdam 2 (id 5), Amsterdam 3 (id 9), Singapore 1 (id 6) and London 1 (id 7)
|
34
|
+
REGIONS_WITH_PRIVATE_NETWORKING = [4, 5, 6, 7, 8, 9]
|
35
35
|
|
36
|
-
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, region)
|
36
|
+
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, region, fog_options={})
|
37
37
|
do_region = compute_provider.regions.find { |r| r.name == region }
|
38
38
|
if do_region.nil?
|
39
39
|
raise "Invalid region for DigitalOcean: #{region}"
|
@@ -64,12 +64,14 @@ module Rubber
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
response = compute_provider.servers.create(:name => "#{Rubber.env}-#{instance_alias}",
|
67
|
+
response = compute_provider.servers.create({:name => "#{Rubber.env}-#{instance_alias}",
|
68
68
|
:image_id => image.id,
|
69
69
|
:flavor_id => flavor.id,
|
70
70
|
:region_id => do_region.id,
|
71
71
|
:ssh_key_ids => [ssh_key['id']],
|
72
|
-
:private_networking => (env.private_networking.to_s.downcase == 'true')
|
72
|
+
:private_networking => (env.private_networking.to_s.downcase == 'true')}.
|
73
|
+
merge(Rubber::Util.symbolize_keys(fog_options))
|
74
|
+
)
|
73
75
|
|
74
76
|
response.id
|
75
77
|
end
|
data/lib/rubber/cloud/fog.rb
CHANGED
@@ -29,13 +29,15 @@ module Rubber
|
|
29
29
|
raise NotImplementedError, "No table store available for generic fog adapter"
|
30
30
|
end
|
31
31
|
|
32
|
-
def create_instance(instance_alias, ami, ami_type, security_groups, availability_zone, region)
|
33
|
-
|
32
|
+
def create_instance(instance_alias, ami, ami_type, security_groups, availability_zone, region, fog_options={})
|
33
|
+
|
34
|
+
response = compute_provider.servers.create({:image_id => ami,
|
34
35
|
:flavor_id => ami_type,
|
35
36
|
:groups => security_groups,
|
36
37
|
:availability_zone => availability_zone,
|
37
38
|
:key_name => env.key_name,
|
38
|
-
:name => instance_alias
|
39
|
+
:name => instance_alias}.merge(
|
40
|
+
Rubber::Util.symbolize_keys(fog_options)))
|
39
41
|
|
40
42
|
response.id
|
41
43
|
end
|
data/lib/rubber/cloud/generic.rb
CHANGED
@@ -26,7 +26,7 @@ module Rubber
|
|
26
26
|
'active'
|
27
27
|
end
|
28
28
|
|
29
|
-
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, region)
|
29
|
+
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, region, fog_options={})
|
30
30
|
instance = {}
|
31
31
|
instance[:id] = instance_alias
|
32
32
|
instance[:state] = active_state
|
@@ -35,7 +35,7 @@ module Rubber
|
|
35
35
|
instance[:provider] = 'generic'
|
36
36
|
instance[:platform] = Rubber::Platforms::LINUX
|
37
37
|
|
38
|
-
Generic.add_instance(instance)
|
38
|
+
Generic.add_instance(instance.merge(Rubber::Util.symbolize_keys(fog_options)))
|
39
39
|
|
40
40
|
instance_alias
|
41
41
|
end
|
data/lib/rubber/cloud/vsphere.rb
CHANGED
@@ -29,7 +29,7 @@ module Rubber
|
|
29
29
|
super(env, capistrano)
|
30
30
|
end
|
31
31
|
|
32
|
-
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, datacenter)
|
32
|
+
def create_instance(instance_alias, image_name, image_type, security_groups, availability_zone, datacenter, fog_options={})
|
33
33
|
if env.domain.nil?
|
34
34
|
raise "'domain' value must be configured"
|
35
35
|
end
|
@@ -199,7 +199,8 @@ module Rubber
|
|
199
199
|
config[:eager_zero] = eager_zero
|
200
200
|
end
|
201
201
|
|
202
|
-
|
202
|
+
fog_options = Rubber::Util.symbolize_keys(volume_spec['fog_options'] || {})
|
203
|
+
volume = server.volumes.create(config.merge(fog_options))
|
203
204
|
|
204
205
|
volume.id
|
205
206
|
end
|
@@ -274,6 +274,7 @@ namespace :rubber do
|
|
274
274
|
ami_type = cloud_env.image_type
|
275
275
|
availability_zone = cloud_env.availability_zone
|
276
276
|
region = cloud_env.region
|
277
|
+
fog_options = cloud_env.fog_options || {}
|
277
278
|
|
278
279
|
create_spot_instance ||= cloud_env.spot_instance
|
279
280
|
|
@@ -281,7 +282,7 @@ namespace :rubber do
|
|
281
282
|
spot_price = cloud_env.spot_price.to_s
|
282
283
|
|
283
284
|
logger.info "Creating spot instance request for instance #{ami}/#{ami_type}/#{security_groups.join(',') rescue 'Default'}/#{availability_zone || 'Default'}"
|
284
|
-
request_id = cloud.create_spot_instance_request(spot_price, ami, ami_type, security_groups, availability_zone)
|
285
|
+
request_id = cloud.create_spot_instance_request(spot_price, ami, ami_type, security_groups, availability_zone, fog_options)
|
285
286
|
|
286
287
|
print "Waiting for spot instance request to be fulfilled"
|
287
288
|
max_wait_time = cloud_env.spot_instance_request_timeout || (1.0 / 0) # Use the specified timeout value or default to infinite.
|
@@ -308,7 +309,7 @@ namespace :rubber do
|
|
308
309
|
|
309
310
|
if !create_spot_instance || (create_spot_instance && max_wait_time < 0)
|
310
311
|
logger.info "Creating instance #{ami}/#{ami_type}/#{security_groups.join(',') rescue 'Default'}/#{availability_zone || region || 'Default'}"
|
311
|
-
instance_id = cloud.create_instance(instance_alias, ami, ami_type, security_groups, availability_zone, region)
|
312
|
+
instance_id = cloud.create_instance(instance_alias, ami, ami_type, security_groups, availability_zone, region, fog_options)
|
312
313
|
end
|
313
314
|
|
314
315
|
logger.info "Instance #{instance_alias} created: #{instance_id}"
|
data/lib/rubber/version.rb
CHANGED
@@ -89,6 +89,17 @@ cloud_providers:
|
|
89
89
|
image_type: c1.medium
|
90
90
|
image_id: ami-90c574f8
|
91
91
|
|
92
|
+
# OPTIONAL: Provide fog-specific options directly. This should only be used if you need a special setting that
|
93
|
+
# Rubber does not directly expose. Since these settings will be passed directly through to fog, we can't make any
|
94
|
+
# guarantee about how they work (if fog renames an attribute, e.g., your config will break). Please see the fog
|
95
|
+
# source code for the option names.
|
96
|
+
# fog_options:
|
97
|
+
# EBS I/O optimized instance
|
98
|
+
# EBS-optimized instances deliver dedicated throughput between Amazon EC2 and Amazon EBS, with options
|
99
|
+
# between 500 Mbps and 1000 Mbps depending on the instance type used.
|
100
|
+
# Read more and make sure that your image_type supports ebs_optimized function at: http://aws.amazon.com/ec2/instance-types/
|
101
|
+
# ebs_optimized: false
|
102
|
+
|
92
103
|
# OPTIONAL: EC2 spot instance request support.
|
93
104
|
#
|
94
105
|
# Enables the creation of spot instance requests. Rubber will wait synchronously until the request is fulfilled,
|
@@ -324,21 +335,39 @@ staging_roles: "#{known_roles.reject {|r| r =~ /slave/ || r =~ /^db$/ }.join(','
|
|
324
335
|
# zone: us-east-1a # zone to create volume in, needs to match host's zone
|
325
336
|
# device: /dev/sdh # OS device to attach volume to
|
326
337
|
# mount: /mnt/mysql # The directory to mount this volume to
|
327
|
-
# filesystem:
|
328
|
-
#
|
329
|
-
#
|
330
|
-
#
|
331
|
-
#
|
332
|
-
#
|
338
|
+
# filesystem: ext4 # the filesystem to create on volume
|
339
|
+
#
|
340
|
+
# # OPTIONAL: Provide fog-specific options directly. This should only be used if you need a special setting that
|
341
|
+
# # Rubber does not directly expose. Since these settings will be passed directly through to fog, we can't make any
|
342
|
+
# # guarantee about how they work (if fog renames an attribute, e.g., your config will break). Please see the fog
|
343
|
+
# # source code for the option names.
|
344
|
+
# fog_options:
|
345
|
+
# type: standard # type of volume, standard or io1
|
346
|
+
# iops: 500 # The number of I/O operations per second (IOPS) that the volume supports.
|
347
|
+
# # Required when the volume type is io1; not used with standard volumes.
|
348
|
+
# - size: 10
|
349
|
+
# zone: us-east-1a
|
350
|
+
# device: /dev/sdi
|
351
|
+
# mount: /mnt/logs
|
352
|
+
# filesystem: ext4
|
353
|
+
# fog_options:
|
354
|
+
# type: standard
|
355
|
+
# iops: 500
|
333
356
|
#
|
334
357
|
# # volumes without mount/filesystem can be used in raid arrays
|
335
358
|
#
|
336
|
-
# - size: 50
|
337
|
-
# zone: us-east-1a
|
338
|
-
# device: /dev/sdx
|
339
|
-
#
|
340
|
-
#
|
341
|
-
#
|
359
|
+
# - size: 50
|
360
|
+
# zone: us-east-1a
|
361
|
+
# device: /dev/sdx
|
362
|
+
# fog_options:
|
363
|
+
# type: gp2
|
364
|
+
# iops: 500
|
365
|
+
# - size: 50
|
366
|
+
# zone: us-east-1a
|
367
|
+
# device: /dev/sdy
|
368
|
+
# fog_options:
|
369
|
+
# type: gp2
|
370
|
+
# iops: 500
|
342
371
|
#
|
343
372
|
# # Use some ephemeral volumes for raid array
|
344
373
|
# local_volumes:
|
@@ -1,7 +1,7 @@
|
|
1
1
|
namespace :rubber do
|
2
|
-
|
2
|
+
|
3
3
|
namespace :postgresql do
|
4
|
-
|
4
|
+
|
5
5
|
rubber.allow_optional_tasks(self)
|
6
6
|
|
7
7
|
before "rubber:install_packages", "rubber:postgresql:setup_apt_sources"
|
@@ -12,7 +12,7 @@ namespace :rubber do
|
|
12
12
|
wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -
|
13
13
|
ENDSCRIPT
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
after "rubber:create", "rubber:postgresql:validate_db_roles"
|
17
17
|
|
18
18
|
task :validate_db_roles do
|
@@ -25,16 +25,16 @@ namespace :rubber do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
after "rubber:bootstrap", "rubber:postgresql:bootstrap"
|
28
|
-
|
28
|
+
|
29
29
|
# Bootstrap the production database config. Db bootstrap is special - the
|
30
30
|
# user could be requiring the rails env inside some of their config
|
31
31
|
# templates, which creates a catch 22 situation with the db, so we try and
|
32
32
|
# bootstrap the db separate from the rest of the config
|
33
33
|
task :bootstrap, :roles => [:postgresql_master, :postgresql_slave] do
|
34
|
-
|
34
|
+
|
35
35
|
# Conditionally bootstrap for each node/role only if that node has not
|
36
36
|
# been bootstrapped for that role before
|
37
|
-
master_instances = rubber_instances.for_role("postgresql_master") & rubber_instances.filtered
|
37
|
+
master_instances = rubber_instances.for_role("postgresql_master") & rubber_instances.filtered
|
38
38
|
master_instances.each do |ic|
|
39
39
|
task_name = "_bootstrap_postgresql_master_#{ic.full_name}".to_sym
|
40
40
|
task task_name, :hosts => ic.full_name do
|
@@ -55,7 +55,7 @@ namespace :rubber do
|
|
55
55
|
rubber.sudo_script "create_master_db", <<-ENDSCRIPT
|
56
56
|
sudo -i -u postgres psql -c "#{create_user_cmd}"
|
57
57
|
sudo -i -u postgres psql -c "#{create_replication_user_cmd}"
|
58
|
-
sudo -i -u postgres psql -c "CREATE DATABASE #{env.db_name} WITH OWNER #{env.db_user}"
|
58
|
+
sudo -i -u postgres psql -c "CREATE DATABASE \"#{env.db_name}\" WITH OWNER #{env.db_user}"
|
59
59
|
ENDSCRIPT
|
60
60
|
end
|
61
61
|
end
|
@@ -91,7 +91,7 @@ namespace :rubber do
|
|
91
91
|
def common_bootstrap
|
92
92
|
# postgresql package install starts postgresql, so stop it
|
93
93
|
rsudo "#{rubber_env.postgresql_ctl} stop" rescue nil
|
94
|
-
|
94
|
+
|
95
95
|
# After everything installed on machines, we need the source tree
|
96
96
|
# on hosts in order to run rubber:config for bootstrapping the db
|
97
97
|
rubber.update_code_for_bootstrap
|
@@ -114,15 +114,15 @@ namespace :rubber do
|
|
114
114
|
task :promote_slave do
|
115
115
|
master_alias = get_env('MASTER', "Master alias (e.g. db01)", true)
|
116
116
|
slave_alias = get_env('SLAVE', "Slave alias (e.g. db02)", true)
|
117
|
-
|
117
|
+
|
118
118
|
# remove the master instance so rubber doesn't try to deploy to it
|
119
119
|
# Stays running so needs to be manually deleted
|
120
120
|
master_instance = rubber_instances.remove(master_alias)
|
121
121
|
fatal "Master Instance does not exist: #{master_alias}" unless master_instance
|
122
|
-
|
122
|
+
|
123
123
|
slave_instance = rubber_instances[slave_alias]
|
124
124
|
fatal "Slave Instance does not exist: #{slave_alias}" unless slave_instance
|
125
|
-
|
125
|
+
|
126
126
|
# remove all db roles from slave
|
127
127
|
slave_instance.roles.delete_if {|ir| ir.name =~ /db|postgresql/ }
|
128
128
|
|
@@ -130,9 +130,9 @@ namespace :rubber do
|
|
130
130
|
new_roles = [Rubber::Configuration::RoleItem.parse("postgresql_master")]
|
131
131
|
new_roles = Rubber::Configuration::RoleItem.expand_role_dependencies(new_roles, get_role_dependencies)
|
132
132
|
slave_instance.roles = (slave_instance.roles + new_roles).uniq
|
133
|
-
|
133
|
+
|
134
134
|
rubber_instances.save()
|
135
|
-
|
135
|
+
|
136
136
|
begin
|
137
137
|
Timeout::timeout(10) do
|
138
138
|
logger.info "Stopping server on original master #{master_alias}"
|
@@ -142,10 +142,10 @@ namespace :rubber do
|
|
142
142
|
rescue StandardError
|
143
143
|
logger.info "Failed to connect to original master, promoting slave anyway"
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
logger.info "Triggering slave promotion on new master #{slave_alias}"
|
147
147
|
rsudo "touch #{rubber_env.postgresql_data_dir}/trigger_file", :hosts => slave_instance.full_name
|
148
|
-
|
148
|
+
|
149
149
|
logger.info "The master instance has been removed from instances, but remains running:"
|
150
150
|
logger.info "#{master_alias}, #{master_instance.instance_id}, #{master_instance.external_ip}"
|
151
151
|
logger.info ''
|
@@ -161,14 +161,14 @@ namespace :rubber do
|
|
161
161
|
task :start, :roles => [:postgresql_master, :postgresql_slave] do
|
162
162
|
rsudo "#{rubber_env.postgresql_ctl} start"
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
desc <<-DESC
|
166
166
|
Stops the postgresql daemons
|
167
167
|
DESC
|
168
168
|
task :stop, :roles => [:postgresql_master, :postgresql_slave] do
|
169
169
|
rsudo "#{rubber_env.postgresql_ctl} stop || true"
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
desc <<-DESC
|
173
173
|
Restarts the postgresql daemons
|
174
174
|
DESC
|
@@ -179,4 +179,4 @@ namespace :rubber do
|
|
179
179
|
|
180
180
|
end
|
181
181
|
|
182
|
-
end
|
182
|
+
end
|
data/test/cloud/aws_test.rb
CHANGED
@@ -28,10 +28,14 @@ class AwsTest < Test::Unit::TestCase
|
|
28
28
|
should "create instance" do
|
29
29
|
assert @cloud.create_instance('', '', '', '', '', '')
|
30
30
|
end
|
31
|
+
|
32
|
+
should "create instance with opts" do
|
33
|
+
assert @cloud.create_instance('', '', '', '', '', '', :ebs_optimized => true)
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
context "aws with alternative region" do
|
34
|
-
|
38
|
+
|
35
39
|
setup do
|
36
40
|
@region = "ap-southeast-2"
|
37
41
|
env = {'access_key' => "XXX", 'secret_access_key' => "YYY", 'region' => @region}
|
data/test/cloud/fog_test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Conway
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|