rubber 2.0.5 → 2.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -2
- data/CHANGELOG +50 -0
- data/lib/rubber/commands/cron.rb +9 -11
- data/lib/rubber/commands/util.rb +1 -0
- data/lib/rubber/dns.rb +29 -4
- data/lib/rubber/dns/aws.rb +181 -0
- data/lib/rubber/dns/nettica.rb +74 -36
- data/lib/rubber/dns/zerigo.rb +110 -4
- data/lib/rubber/instance.rb +1 -1
- data/lib/rubber/recipes/rubber/instances.rb +13 -5
- data/lib/rubber/recipes/rubber/security_groups.rb +1 -1
- data/lib/rubber/recipes/rubber/setup.rb +80 -64
- data/lib/rubber/util.rb +7 -0
- data/lib/rubber/version.rb +1 -1
- data/templates/base/config/rubber/deploy-setup.rb +12 -0
- data/templates/base/config/rubber/rubber-dns.yml +17 -21
- data/templates/base/config/rubber/rubber.yml +2 -2
- data/templates/collectd/config/rubber/role/passenger/passenger-status-sudoers.conf +1 -1
- data/templates/elasticsearch/config/rubber/rubber-elasticsearch.yml +1 -1
- data/templates/graphite/config/rubber/role/graphite_web/dashboard.html +5 -3
- data/templates/jenkins/config/environments/jenkins.rb +1 -1
- data/templates/jenkins/config/rubber/rubber-jenkins.yml +1 -1
- data/templates/passenger/config/rubber/deploy-passenger.rb +0 -8
- data/templates/postgresql/config/rubber/rubber-postgresql.yml +2 -2
- data/templates/resque/config/initializers/resque.rb +2 -2
- data/templates/resque/config/resque.yml +4 -0
- data/templates/resque/config/rubber/common/resque.yml +1 -1
- data/templates/resque_scheduler/config/rubber/common/resque_schedule.yml +9 -0
- data/templates/resque_scheduler/config/rubber/deploy-resque_scheduler.rb +38 -0
- data/templates/resque_scheduler/config/rubber/role/resque_scheduler/resque-scheduler-upstart.conf +20 -0
- data/templates/resque_scheduler/config/rubber/rubber-resque_scheduler.yml +7 -0
- data/templates/resque_scheduler/lib/tasks/resque-scheduler.rake +28 -0
- data/templates/resque_scheduler/templates.rb +1 -0
- data/templates/resque_scheduler/templates.yml +3 -0
- data/templates/torquebox/config/rubber/rubber-torquebox.yml +1 -1
- data/templates/zookeeper/config/rubber/role/zookeeper/myid.conf +5 -4
- data/templates/zookeeper/config/rubber/role/zookeeper/zoo.cfg +6 -1
- data/test/command_test.rb +0 -55
- data/test/commands/cron_test.rb +83 -0
- data/test/dns/aws_test.rb +192 -0
- data/test/dns/zerigo_test.rb +180 -0
- data/test/instance_test.rb +17 -2
- data/test/test_helper.rb +37 -2
- metadata +20 -8
- data/lib/rubber/dns/fog.rb +0 -219
- data/test/dns/fog_test.rb +0 -169
data/lib/rubber/dns/zerigo.rb
CHANGED
@@ -1,16 +1,122 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'fog'
|
3
|
-
require 'rubber/dns/fog'
|
4
3
|
|
5
4
|
module Rubber
|
6
5
|
module Dns
|
7
6
|
|
8
|
-
class Zerigo <
|
7
|
+
class Zerigo < Base
|
9
8
|
|
9
|
+
attr_accessor :client
|
10
|
+
|
10
11
|
def initialize(env)
|
11
|
-
super(env
|
12
|
+
super(env)
|
13
|
+
creds = { :provider => 'zerigo', :zerigo_email => env.email, :zerigo_token => env.token }
|
14
|
+
@client = ::Fog::DNS.new(creds)
|
12
15
|
end
|
13
|
-
|
16
|
+
|
17
|
+
# multiple hosts with same name/type convert to a single rubber-dns.yml opts format
|
18
|
+
def hosts_to_opts(hosts)
|
19
|
+
opts = {}
|
20
|
+
|
21
|
+
hosts.each do |host|
|
22
|
+
opts[:host] ||= host.name || ''
|
23
|
+
opts[:domain] ||= host.zone.domain
|
24
|
+
opts[:type] ||= host.type
|
25
|
+
opts[:ttl] ||= host.ttl.to_i if host.ttl
|
26
|
+
|
27
|
+
opts[:data] ||= []
|
28
|
+
if host.type =~ /MX/i
|
29
|
+
opts[:data] << {:priority => host.priority, :value => host.value}
|
30
|
+
else
|
31
|
+
opts[:data] << host.value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
return opts
|
36
|
+
end
|
37
|
+
|
38
|
+
# a single rubber-dns.yml opts format converts to multiple hosts with same name/type
|
39
|
+
def opts_to_hosts(opts)
|
40
|
+
hosts = []
|
41
|
+
|
42
|
+
opts[:data].each do |o|
|
43
|
+
host = {}
|
44
|
+
host[:name] = opts[:host]
|
45
|
+
host[:type] = opts[:type]
|
46
|
+
host[:ttl] = opts[:ttl] if opts[:ttl]
|
47
|
+
if o.kind_of?(Hash) && o[:priority]
|
48
|
+
host[:priority] = o[:priority]
|
49
|
+
host[:value] = o[:value]
|
50
|
+
else
|
51
|
+
host[:value] = o
|
52
|
+
end
|
53
|
+
hosts << host
|
54
|
+
end
|
55
|
+
|
56
|
+
return hosts
|
57
|
+
end
|
58
|
+
|
59
|
+
def find_or_create_zone(domain)
|
60
|
+
zone = @client.zones.all.find {|z| z.domain =~ /^#{domain}\.?/}
|
61
|
+
if ! zone
|
62
|
+
zone = @client.zones.create(:domain => domain)
|
63
|
+
end
|
64
|
+
return zone
|
65
|
+
end
|
66
|
+
|
67
|
+
def find_hosts(opts = {})
|
68
|
+
opts = setup_opts(opts, [:host, :domain])
|
69
|
+
result = []
|
70
|
+
zone = find_or_create_zone(opts[:domain])
|
71
|
+
|
72
|
+
# TODO: revert this when zerigo fog gets fixed to allow parameters
|
73
|
+
# hosts = fqdn ? (zone.records.all(:name => fqdn) rescue []) : zone.records.all
|
74
|
+
hosts = zone.records.all
|
75
|
+
hosts = hosts.select {|h| name = h.name || ''; name == opts[:host] } if opts.has_key?(:host) && opts[:host] != '*'
|
76
|
+
hosts = hosts.select {|h| h.type == opts[:type] } if opts.has_key?(:type) && opts[:type] != '*'
|
77
|
+
|
78
|
+
return hosts
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_host_records(opts = {})
|
82
|
+
hosts = find_hosts(opts)
|
83
|
+
group = {}
|
84
|
+
hosts.each do |h|
|
85
|
+
key = "#{h.name}.#{h.domain} #{h.type}"
|
86
|
+
group[key] ||= []
|
87
|
+
group[key] << h
|
88
|
+
end
|
89
|
+
result = group.values.collect {|h| hosts_to_opts(h).merge(:domain => opts[:domain])}
|
90
|
+
return result
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_host_record(opts = {})
|
94
|
+
opts = setup_opts(opts, [:host, :data, :domain, :type, :ttl])
|
95
|
+
zone = find_or_create_zone(opts[:domain])
|
96
|
+
opts_to_hosts(opts).each do |host|
|
97
|
+
zone.records.create(host)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def destroy_host_record(opts = {})
|
102
|
+
opts = setup_opts(opts, [:host, :domain])
|
103
|
+
|
104
|
+
find_hosts(opts).each do |h|
|
105
|
+
h.destroy || raise("Failed to destroy #{h.hostname}")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def update_host_record(old_opts={}, new_opts={})
|
110
|
+
old_opts = setup_opts(old_opts, [:host, :domain, :type])
|
111
|
+
new_opts = setup_opts(new_opts, [:host, :domain, :type, :data])
|
112
|
+
|
113
|
+
# Tricky to update existing hosts since zerigo needs a separate host
|
114
|
+
# entry for multiple records of same type (MX, etc), so take the easy
|
115
|
+
# way out and destroy/create instead of update
|
116
|
+
destroy_host_record(old_opts)
|
117
|
+
create_host_record(new_opts)
|
118
|
+
end
|
119
|
+
|
14
120
|
end
|
15
121
|
|
16
122
|
end
|
data/lib/rubber/instance.rb
CHANGED
@@ -41,7 +41,7 @@ module Rubber
|
|
41
41
|
bucket = location.split("/")[0]
|
42
42
|
key = location.split("/")[1..-1].join("/")
|
43
43
|
data = Rubber.cloud.storage(bucket).fetch(key)
|
44
|
-
StringIO.open(data, 'r') {|f| load_from_file(f) }
|
44
|
+
StringIO.open(data, 'r') {|f| load_from_file(f) } if data
|
45
45
|
when /table:(.*)/
|
46
46
|
location = $1
|
47
47
|
load_from_table(location)
|
@@ -68,9 +68,11 @@ namespace :rubber do
|
|
68
68
|
Reboot the EC2 instance for the give ALIAS
|
69
69
|
DESC
|
70
70
|
required_task :reboot do
|
71
|
-
|
71
|
+
instance_aliases = get_env('ALIAS', "Instance alias (e.g. web01 or web01~web05,web09)", true)
|
72
|
+
|
73
|
+
aliases = Rubber::Util::parse_aliases(instance_aliases)
|
72
74
|
ENV.delete('ROLES') # so we don't get an error if people leave ROLES in env from :create CLI
|
73
|
-
|
75
|
+
reboot_instances(aliases, ENV['FORCE'] =~ /^(t|y)/)
|
74
76
|
end
|
75
77
|
|
76
78
|
desc <<-DESC
|
@@ -443,15 +445,21 @@ namespace :rubber do
|
|
443
445
|
setup_aliases
|
444
446
|
end
|
445
447
|
|
448
|
+
def reboot_instances(instance_aliases, force=false)
|
449
|
+
instance_aliases.each do |instance_alias|
|
450
|
+
reboot_instance(instance_alias, force)
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
446
454
|
# Reboots the given ec2 instance
|
447
|
-
def reboot_instance(instance_alias)
|
455
|
+
def reboot_instance(instance_alias, force=false)
|
448
456
|
instance_item = rubber_instances[instance_alias]
|
449
457
|
fatal "Instance does not exist: #{instance_alias}" if ! instance_item
|
450
458
|
|
451
459
|
env = rubber_cfg.environment.bind(instance_item.role_names, instance_item.name)
|
452
460
|
|
453
|
-
value = Capistrano::CLI.ui.ask("About to REBOOT #{instance_alias} (#{instance_item.instance_id}) in mode #{Rubber.env}. Are you SURE [yes/NO]?: ")
|
454
|
-
fatal("Exiting", 0) if value != "yes"
|
461
|
+
value = Capistrano::CLI.ui.ask("About to REBOOT #{instance_alias} (#{instance_item.instance_id}) in mode #{Rubber.env}. Are you SURE [yes/NO]?: ") unless force
|
462
|
+
fatal("Exiting", 0) if value != "yes" && ! force
|
455
463
|
|
456
464
|
logger.info "Rebooting instance alias=#{instance_alias}, instance_id=#{instance_item.instance_id}"
|
457
465
|
|
@@ -43,7 +43,7 @@ namespace :rubber do
|
|
43
43
|
|
44
44
|
def setup_security_groups(host=nil, roles=[])
|
45
45
|
env = rubber_cfg.environment.bind(roles, host)
|
46
|
-
security_group_defns = env.security_groups
|
46
|
+
security_group_defns = Hash[env.security_groups.to_a]
|
47
47
|
if env.auto_security_groups
|
48
48
|
sghosts = (rubber_instances.collect{|ic| ic.name } + [host]).uniq.compact
|
49
49
|
sgroles = (rubber_instances.all_roles + roles).uniq.compact
|
@@ -161,80 +161,96 @@ namespace :rubber do
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
+
def record_key(record)
|
165
|
+
"#{record[:host]}.#{record[:domain]} #{record[:type]}"
|
166
|
+
end
|
167
|
+
|
168
|
+
def convert_to_new_dns_format(records)
|
169
|
+
record = {}
|
170
|
+
records.each do |r|
|
171
|
+
record[:host] ||= r[:host]
|
172
|
+
record[:domain] ||= r[:domain]
|
173
|
+
record[:type] ||= r[:type]
|
174
|
+
record[:ttl] ||= r[:ttl] if r[:ttl]
|
175
|
+
record[:data] ||= []
|
176
|
+
record[:data].concat(Array(r[:data]))
|
177
|
+
end
|
178
|
+
return record
|
179
|
+
end
|
180
|
+
|
164
181
|
desc <<-DESC
|
165
182
|
Sets up the additional dns records supplied in the dns_records config in rubber.yml
|
166
183
|
DESC
|
167
184
|
required_task :setup_dns_records do
|
168
185
|
records = rubber_env.dns_records
|
169
186
|
if records && rubber_env.dns_provider
|
170
|
-
provider = Rubber::Dns::get_provider(rubber_env.dns_provider, rubber_env)
|
171
|
-
|
172
|
-
# collect the round robin records (those with the same host/domain/type)
|
173
|
-
rr_records = []
|
174
|
-
records.each_with_index do |record, i|
|
175
|
-
m = records.find_all {|r| record['host'] == r['host'] && record['domain'] == r['domain'] && record['type'] == r['type']}
|
176
|
-
m = m.sort {|a,b| a.object_id <=> b.object_id}
|
177
|
-
rr_records << m if m.size > 1 && ! rr_records.include?(m)
|
178
|
-
end
|
179
|
-
|
180
|
-
# simple records are those that aren't round robin ones
|
181
|
-
simple_records = records - rr_records.flatten
|
182
187
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
provider.create_host_record(record)
|
206
|
-
end
|
188
|
+
provider_name = rubber_env.dns_provider
|
189
|
+
provider = Rubber::Dns::get_provider(provider_name, rubber_env)
|
190
|
+
|
191
|
+
# records in rubber_env.dns_records can either have a value which
|
192
|
+
# is an array, or multiple equivalent (same host+type)items with
|
193
|
+
# value being a string, so try and normalize them
|
194
|
+
rubber_records = {}
|
195
|
+
records.each do |record|
|
196
|
+
record = Rubber::Util.symbolize_keys(record)
|
197
|
+
key = record_key(record)
|
198
|
+
rubber_records[key] ||= []
|
199
|
+
rubber_records[key] << record
|
200
|
+
end
|
201
|
+
rubber_records = Hash[rubber_records.collect {|key, records| [key, convert_to_new_dns_format(records)] }]
|
202
|
+
|
203
|
+
provider_records = {}
|
204
|
+
domains = rubber_records.values.collect {|r| r[:domain] }.uniq
|
205
|
+
precords = domains.collect {|d| provider.find_host_records(:host => '*', :type => '*', :domain => d) }.flatten
|
206
|
+
precords.each do |record|
|
207
|
+
key = record_key(record)
|
208
|
+
raise "unmerged provider records" if provider_records[key]
|
209
|
+
provider_records[key] = record
|
207
210
|
end
|
208
211
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
logger.info "
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
logger.info "Removing round robin dns record: #{r[:host]}.#{r[:domain]}:#{r[:type]} => #{r[:data]}"
|
235
|
-
provider.destroy_host_record(r)
|
212
|
+
changes = Hash[(rubber_records.to_a - provider_records.to_a) | (provider_records.to_a - rubber_records.to_a)]
|
213
|
+
|
214
|
+
logger.info "Applying #{changes.size} changes"
|
215
|
+
changes.each do |key, record|
|
216
|
+
old_record = provider_records[key]
|
217
|
+
new_record = rubber_records[key]
|
218
|
+
if old_record && new_record
|
219
|
+
# already exists in provider, so modify it
|
220
|
+
diff = Hash[(old_record.to_a - new_record.to_a) | (new_record.to_a - old_record.to_a)]
|
221
|
+
logger.info "Updating dns record: #{old_record.inspect} changes: #{diff.inspect}"
|
222
|
+
#provider.update_host_record(old_record, new_record)
|
223
|
+
elsif !old_record && new_record
|
224
|
+
# doesn't yet exist in provider, so create it
|
225
|
+
logger.info "Creating dns record: #{new_record.inspect}"
|
226
|
+
#provider.create_host_record(new_record)
|
227
|
+
elsif old_record && ! new_record
|
228
|
+
# ignore these since it shows all the instances created by rubber
|
229
|
+
#
|
230
|
+
#logger.info "Provider record doesn't exist locally: #{old_record.inspect}"
|
231
|
+
#if ENV['FORCE']
|
232
|
+
# destroy_dns_record = ENV['FORCE'] =~ /^(t|y)/
|
233
|
+
#else
|
234
|
+
# destroy_dns_record = get_env('DESTROY_DNS', "Destroy DNS record in provider [y/N]?", true)
|
235
|
+
#end
|
236
|
+
#provider.destroy_host_record(old_record) if destroy_dns_record
|
236
237
|
end
|
237
238
|
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
desc <<-DESC
|
244
|
+
Exports dns records from your provider into the format readable by rubber in rubber-dns.yml
|
245
|
+
DESC
|
246
|
+
required_task :export_dns_records do
|
247
|
+
if rubber_env.dns_provider
|
248
|
+
|
249
|
+
provider_name = rubber_env.dns_provider
|
250
|
+
provider = Rubber::Dns::get_provider(provider_name, rubber_env)
|
251
|
+
|
252
|
+
provider_records = provider.find_host_records(:host => '*', :type => '*', :domain => rubber_env.domain)
|
253
|
+
puts({'dns_records' => provider_records.collect {|r| Rubber::Util.stringify_keys(r)}}.to_yaml)
|
238
254
|
end
|
239
255
|
end
|
240
256
|
|
@@ -371,7 +387,7 @@ namespace :rubber do
|
|
371
387
|
task :set_timezone do
|
372
388
|
opts = get_host_options('timezone')
|
373
389
|
rsudo "echo $CAPISTRANO:VAR$ > /etc/timezone", opts
|
374
|
-
rsudo "
|
390
|
+
rsudo "ln -sf /usr/share/zoneinfo/$CAPISTRANO:VAR$ /etc/localtime", opts
|
375
391
|
# restart syslog so that times match timezone
|
376
392
|
sudo_script 'restart_syslog', <<-ENDSCRIPT
|
377
393
|
if [[ -x /etc/init.d/sysklogd ]]; then
|
data/lib/rubber/util.rb
CHANGED
data/lib/rubber/version.rb
CHANGED
@@ -103,5 +103,17 @@ namespace :rubber do
|
|
103
103
|
ENDSCRIPT
|
104
104
|
end
|
105
105
|
|
106
|
+
# Update /etc/sudoers so that SSH-related environment variables so capistrano/rubber tasks can take advantage of ssh-agent forwarding
|
107
|
+
before "rubber:bootstrap", "rubber:base:update_sudoers"
|
108
|
+
task :update_sudoers do
|
109
|
+
rubber.sudo_script "update_sudoers", <<-ENDSCRIPT
|
110
|
+
if [[ ! `grep 'SSH_CLIENT SSH_TTY SSH_CONNECTION SSH_AUTH_SOCK' /etc/sudoers` =~ "SSH_CLIENT SSH_TTY SSH_CONNECTION SSH_AUTH_SOCK" ]]; then
|
111
|
+
echo '' >> /etc/sudoers
|
112
|
+
echo '# whitelist SSH-related environment variables so capistrano tasks can take advantage of ssh-agent forwarding' >> /etc/sudoers
|
113
|
+
echo 'Defaults env_keep += "SSH_CLIENT SSH_TTY SSH_CONNECTION SSH_AUTH_SOCK"' >> /etc/sudoers
|
114
|
+
fi
|
115
|
+
ENDSCRIPT
|
116
|
+
end
|
117
|
+
|
106
118
|
end
|
107
119
|
end
|
@@ -5,11 +5,9 @@
|
|
5
5
|
# This lets rubber update a dynamic dns service with the instance alias and ip
|
6
6
|
#
|
7
7
|
dns_providers:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
aws_access_key_id: "#{cloud_providers.aws.access_key}"
|
12
|
-
aws_secret_access_key: "#{cloud_providers.aws.secret_access_key}"
|
8
|
+
aws:
|
9
|
+
access_key: "#{cloud_providers.aws.access_key}"
|
10
|
+
access_secret: "#{cloud_providers.aws.secret_access_key}"
|
13
11
|
type: A
|
14
12
|
ttl: 300
|
15
13
|
nettica:
|
@@ -35,18 +33,18 @@ dns_providers:
|
|
35
33
|
# dns_records:
|
36
34
|
# # simple A record
|
37
35
|
# - host: bar
|
38
|
-
# data: 1.1.1.1
|
36
|
+
# data: [1.1.1.1]
|
39
37
|
#
|
40
38
|
# # more detailed A record
|
41
39
|
# - host: bar
|
42
40
|
# domain: otherdomain.com
|
43
|
-
# data: 1.1.1.1
|
41
|
+
# data: [1.1.1.1]
|
44
42
|
# type: A
|
45
43
|
# ttl: 300
|
46
44
|
#
|
47
45
|
# # tld A record
|
48
46
|
# - host: ''
|
49
|
-
# data: 1.1.1.1
|
47
|
+
# data: [1.1.1.1]
|
50
48
|
# type: A
|
51
49
|
#
|
52
50
|
# # tld ALIAS record -- Route53 extension to point tld at an Elastic Load Balancer group
|
@@ -54,40 +52,38 @@ dns_providers:
|
|
54
52
|
# domain: example.com
|
55
53
|
# type: A
|
56
54
|
# data:
|
57
|
-
# hosted_zone_id: XXYYZZ
|
58
|
-
#
|
55
|
+
# - hosted_zone_id: XXYYZZ
|
56
|
+
# dns_name: my-app-elb-group.us-east-1.elb.amazonaws.com
|
59
57
|
#
|
60
58
|
# # simple CNAME record
|
61
59
|
# - host: otherbar
|
62
60
|
# domain: foo.com
|
63
|
-
# data: bar.foo.com
|
61
|
+
# data: [bar.foo.com]
|
64
62
|
# type: CNAME
|
65
63
|
# ttl: 300
|
66
64
|
#
|
67
|
-
# #
|
65
|
+
# # Round robin dns record
|
68
66
|
# - host: rr
|
69
67
|
# domain: foo.com
|
70
|
-
# data: 1.1.1.1
|
71
|
-
# type: A
|
72
|
-
# ttl: 300
|
73
|
-
# - host: rr
|
74
|
-
# domain: foo.com
|
75
|
-
# data: 1.1.1.2
|
68
|
+
# data: [1.1.1.1, 1.1.1.2]
|
76
69
|
# type: A
|
77
70
|
# ttl: 300
|
78
71
|
#
|
79
72
|
# # A record, grabbing ip from instance config
|
80
73
|
# - host: baz
|
81
74
|
# domain: foo.com
|
82
|
-
# data: "#{rubber_instances.for_role('web').first.external_ip}"
|
75
|
+
# data: ["#{rubber_instances.for_role('web').first.external_ip}"]
|
83
76
|
# type: A
|
84
77
|
# ttl: 300
|
85
78
|
#
|
86
79
|
# # MX record
|
87
80
|
# - host: ''
|
88
81
|
# domain: foo.com
|
89
|
-
# data:
|
82
|
+
# data:
|
83
|
+
# - priority: 5
|
84
|
+
# value: mail1.foo.com
|
85
|
+
# - priority: 10
|
86
|
+
# value: mail2.foo.com
|
90
87
|
# type: MX
|
91
88
|
# ttl: 300
|
92
|
-
# priority: 10
|
93
89
|
|