engineyard-dns 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +4 -0
- data/engineyard-dns.gemspec +3 -3
- data/features/assign_dns_to_environment.feature +14 -14
- data/features/missing_credentials.feature +17 -0
- data/features/step_definitions/common_steps.rb +1 -1
- data/features/step_definitions/fog_steps.rb +4 -0
- data/features/support/fog_helpers.rb +10 -4
- data/lib/engineyard-dns.rb +0 -1
- data/lib/engineyard-dns/cli.rb +98 -70
- data/lib/engineyard-dns/version.rb +1 -1
- data/posts/engineyard-2011-05-24.md +55 -10
- metadata +97 -35
- data/features/step_definitions/dnsimple_steps.rb +0 -9
data/.travis.yml
CHANGED
data/engineyard-dns.gemspec
CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_dependency("
|
23
|
-
s.add_dependency("
|
24
|
-
s.add_dependency("
|
22
|
+
s.add_dependency("engineyard", "1.3.20")
|
23
|
+
s.add_dependency("fog", "~> 0.8.2")
|
24
|
+
s.add_dependency("ipaddress", "~> 0.8")
|
25
25
|
|
26
26
|
s.add_development_dependency("rake", ["~> 0.9.0"])
|
27
27
|
s.add_development_dependency("cucumber", ["~> 0.10"])
|
@@ -12,63 +12,63 @@ Feature: Assign DNS to environment IP address via DNSimple
|
|
12
12
|
Then I should see exactly
|
13
13
|
"""
|
14
14
|
Fetching AppCloud environment information...
|
15
|
-
|
15
|
+
AppCloud environment main/giblets has IP 127.0.0.0
|
16
16
|
|
17
17
|
Searching for myapp.com amongst your DNS providers...
|
18
18
|
Found myapp.com in DNSimple account
|
19
19
|
|
20
|
-
Assigning myapp.com -->
|
20
|
+
Assigning myapp.com --> 127.0.0.0 (main/giblets)
|
21
21
|
Created A record for myapp.com
|
22
|
-
Assigning www.myapp.com -->
|
22
|
+
Assigning www.myapp.com --> 127.0.0.0 (main/giblets)
|
23
23
|
Created A record for www.myapp.com
|
24
24
|
Complete!
|
25
25
|
|
26
26
|
"""
|
27
27
|
# Found 2 records for myapp.com
|
28
|
-
# .myapp.com (A)->
|
29
|
-
# www.myapp.com (A)->
|
28
|
+
# .myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
|
29
|
+
# www.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
|
30
30
|
|
31
31
|
Scenario: Resssign DNS A Record to an environment
|
32
32
|
When I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets"
|
33
|
-
And I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets --
|
33
|
+
And I run local executable "ey-dns" with arguments "assign myapp.com --account main --environment giblets --force"
|
34
34
|
Then I should see matching
|
35
35
|
"""
|
36
36
|
Fetching AppCloud environment information...
|
37
|
-
|
37
|
+
AppCloud environment main/giblets has IP 127.0.0.0
|
38
38
|
|
39
39
|
Searching for myapp.com amongst your DNS providers...
|
40
40
|
Found myapp.com in DNSimple account
|
41
41
|
|
42
42
|
Deleted myapp.com
|
43
|
-
Assigning myapp.com -->
|
43
|
+
Assigning myapp.com --> 127.0.0.0 (main/giblets)
|
44
44
|
Created A record for myapp.com
|
45
45
|
Deleted www.myapp.com
|
46
|
-
Assigning www.myapp.com -->
|
46
|
+
Assigning www.myapp.com --> 127.0.0.0 (main/giblets)
|
47
47
|
Created A record for www.myapp.com
|
48
48
|
Complete!
|
49
49
|
|
50
50
|
"""
|
51
51
|
# Found 2 records for myapp.com
|
52
|
-
# .myapp.com (A)->
|
53
|
-
# www.myapp.com (A)->
|
52
|
+
# .myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
|
53
|
+
# www.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
|
54
54
|
|
55
55
|
Scenario: Assign subdomain A Record to an environment
|
56
56
|
When I run local executable "ey-dns" with arguments "assign myapp.com staging --account main --environment giblets"
|
57
57
|
Then I should see exactly
|
58
58
|
"""
|
59
59
|
Fetching AppCloud environment information...
|
60
|
-
|
60
|
+
AppCloud environment main/giblets has IP 127.0.0.0
|
61
61
|
|
62
62
|
Searching for myapp.com amongst your DNS providers...
|
63
63
|
Found myapp.com in DNSimple account
|
64
64
|
|
65
|
-
Assigning staging.myapp.com -->
|
65
|
+
Assigning staging.myapp.com --> 127.0.0.0 (main/giblets)
|
66
66
|
Created A record for staging.myapp.com
|
67
67
|
Complete!
|
68
68
|
|
69
69
|
"""
|
70
70
|
# Found 1 records for myapp.com
|
71
|
-
# staging.myapp.com (A)->
|
71
|
+
# staging.myapp.com (A)-> 127.0.0.0 (ttl:60, id:\d+)
|
72
72
|
|
73
73
|
|
74
74
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Feature: Missing credentials
|
2
|
+
I want to be educated/helped when I don't have credentials setup correctly
|
3
|
+
|
4
|
+
Scenario: Show example .fog file if credentials are missing
|
5
|
+
Given I have not setup my fog credentials
|
6
|
+
When I run local executable "ey-dns" with arguments "domains"
|
7
|
+
Then I should see exactly
|
8
|
+
"""
|
9
|
+
ERROR: Missing credentials for DNS providers.
|
10
|
+
An example ~/.fog credentials file has been created for you.
|
11
|
+
|
12
|
+
"""
|
13
|
+
And file "~/.fog" is created
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
@@ -2,6 +2,10 @@ Given /^I have setup my fog credentials for "([^"]*)"$/ do |provider|
|
|
2
2
|
setup_dns_credentials(provider)
|
3
3
|
end
|
4
4
|
|
5
|
+
Given /^I have not setup my fog credentials$/ do
|
6
|
+
remove_dns_credentials
|
7
|
+
end
|
8
|
+
|
5
9
|
Given /^I have DNS domain "([^"]*)" with provider "([^"]*)"$/ do |domain, provider|
|
6
10
|
setup_domain(provider, domain)
|
7
11
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module FogHelpers
|
2
2
|
def setup_dns_credentials(provider)
|
3
3
|
email, password = "ossgrants+dns@engineyard.com", "ossgrants1"
|
4
|
-
File.open(
|
4
|
+
File.open(fog_credentials_file, "w") do |file|
|
5
5
|
@credentials = case provider.to_sym
|
6
6
|
when :DNSimple
|
7
7
|
{ :dnsimple_email => email, :dnsimple_password => password}
|
@@ -12,15 +12,21 @@ module FogHelpers
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
def remove_dns_credentials
|
16
|
+
FileUtils.rm_rf(fog_credentials_file)
|
17
|
+
end
|
18
|
+
|
15
19
|
def setup_domain(provider, domain)
|
16
|
-
dns_provider(provider).zones.select { |z| z.domain == domain }.each
|
17
|
-
domain.destroy
|
18
|
-
end
|
20
|
+
dns_provider(provider).zones.select { |z| z.domain == domain }.each { |z| z.destroy }
|
19
21
|
dns_provider(provider).zones.create(:domain => domain)
|
20
22
|
end
|
21
23
|
|
22
24
|
def dns_provider(provider)
|
23
25
|
@dns_provider ||= Fog::DNS.new({:provider => provider})
|
24
26
|
end
|
27
|
+
|
28
|
+
def fog_credentials_file
|
29
|
+
File.expand_path("#{ENV['HOME']}/.fog")
|
30
|
+
end
|
25
31
|
end
|
26
32
|
World(FogHelpers)
|
data/lib/engineyard-dns.rb
CHANGED
data/lib/engineyard-dns/cli.rb
CHANGED
@@ -5,12 +5,12 @@ require "engineyard/cli/ui"
|
|
5
5
|
require "engineyard/error"
|
6
6
|
require "fog"
|
7
7
|
require "fog/bin"
|
8
|
+
require "ipaddress"
|
8
9
|
|
9
10
|
module EngineYard
|
10
11
|
module DNS
|
11
12
|
class CLI < Thor
|
12
13
|
include EY::UtilityMethods
|
13
|
-
# include Thor::Actions
|
14
14
|
|
15
15
|
def self.start(*)
|
16
16
|
Thor::Base.shell = EY::CLI::UI
|
@@ -18,54 +18,42 @@ module EngineYard
|
|
18
18
|
super
|
19
19
|
end
|
20
20
|
|
21
|
-
desc "assign DOMAIN [
|
22
|
-
method_option :
|
23
|
-
method_option :
|
24
|
-
method_option :
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
desc "assign DOMAIN [SUBDOMAIN]", "Assign DNS domain/tld (or name.tld) to your AppCloud environment"
|
22
|
+
method_option :environment, :aliases => ["-e"], :desc => "Environment containing the IP to which to resolve", :type => :string
|
23
|
+
method_option :account, :aliases => ["-c"], :desc => "Name of the account where the environment is found"
|
24
|
+
method_option :force, :aliases => ["-f"], :desc => "Override DNS records if they already exist", :type => :boolean
|
25
|
+
def assign(domain_name, subdomain = "")
|
26
|
+
$stdout.sync
|
27
|
+
validate_fog_credentials
|
28
28
|
|
29
|
+
say "Fetching AppCloud environment information..."
|
29
30
|
environment = fetch_environment(options[:environment], options[:account])
|
30
|
-
account_name, env_name = environment.account.name, environment.name
|
31
|
-
unless environment.instances.first
|
32
|
-
error "Environment #{account_name}/#{env_name} has no booted instances."
|
33
|
-
end
|
34
|
-
public_hostname = environment.instances.first.public_hostname
|
35
|
-
status = environment.instances.first.status
|
36
|
-
|
37
|
-
# TODO - use DNS client to convert public_hostname into IP address
|
38
|
-
unless public_hostname =~ /ec2-(\d+)-(\d+)-(\d+)-(\d+)/
|
39
|
-
error "Cannot determine public IP from current hostname #{public_hostname}"
|
40
|
-
end
|
41
|
-
public_ip = "#{$1}.#{$2}.#{$3}.#{$4}"
|
42
31
|
|
43
|
-
|
44
|
-
|
32
|
+
public_ip = fetch_public_ip(environment)
|
33
|
+
|
45
34
|
say ""
|
46
|
-
say "Searching for #{domain_name} amongst your DNS providers..."
|
35
|
+
say "Searching for #{domain_name} amongst your DNS providers..."
|
47
36
|
|
48
37
|
domain, provider_name = find_domain(domain_name)
|
49
38
|
unless domain
|
50
39
|
error "Please register domain #{domain_name} with your DNS provider"
|
51
40
|
end
|
52
41
|
say "Found #{domain_name} in #{provider_name} account"
|
53
|
-
say ""
|
54
|
-
|
55
|
-
assign_dns(domain,
|
56
|
-
assign_dns(domain,
|
57
|
-
|
42
|
+
say ""
|
43
|
+
|
44
|
+
assign_dns(domain, environment.account.name, environment.name, public_ip, subdomain, options[:force])
|
45
|
+
assign_dns(domain, environment.account.name, environment.name, public_ip, "www", options[:force]) if subdomain == ""
|
46
|
+
|
58
47
|
say "Complete!", :green
|
59
|
-
|
60
|
-
# ::DNSimple::Commands::ListRecords.new.execute([domain])
|
61
48
|
end
|
62
|
-
|
49
|
+
|
63
50
|
desc "domains", "List available domains/zones from your DNS providers"
|
64
51
|
def domains
|
52
|
+
validate_fog_credentials
|
65
53
|
dns_provider_names.each do |provider_name|
|
66
54
|
dns_provider = ::Fog::DNS.new({:provider => provider_name})
|
67
55
|
domains = dns_provider.zones
|
68
|
-
|
56
|
+
|
69
57
|
if domains.size == 0
|
70
58
|
say "#{provider_name}: ", :yellow; say "none"
|
71
59
|
else
|
@@ -77,11 +65,11 @@ module EngineYard
|
|
77
65
|
end
|
78
66
|
end
|
79
67
|
end
|
80
|
-
|
68
|
+
|
81
69
|
desc "version", "show version information"
|
82
70
|
def version
|
83
71
|
require 'engineyard-dns/version'
|
84
|
-
|
72
|
+
say EngineYard::DNS::VERSION
|
85
73
|
end
|
86
74
|
|
87
75
|
map "-v" => :version, "--version" => :version, "-h" => :help, "--help" => :help
|
@@ -89,36 +77,30 @@ module EngineYard
|
|
89
77
|
private
|
90
78
|
def say(msg, color = nil)
|
91
79
|
color ? shell.say(msg, color) : shell.say(msg)
|
80
|
+
$stdout.flush
|
92
81
|
end
|
93
82
|
|
94
83
|
def display(text)
|
95
|
-
|
84
|
+
say text
|
96
85
|
exit
|
97
86
|
end
|
98
87
|
|
99
88
|
def error(text)
|
100
|
-
|
101
|
-
exit
|
89
|
+
say "ERROR: #{text}", :red
|
90
|
+
exit(1)
|
102
91
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
req = http.get(path)
|
110
|
-
waiting = yield req
|
111
|
-
end
|
112
|
-
sleep 1; print '.'; $stdout.flush
|
113
|
-
rescue SocketError => e
|
114
|
-
sleep 1; print 'x'; $stdout.flush
|
115
|
-
rescue Exception => e
|
116
|
-
puts e.message
|
117
|
-
sleep 1; print '.'; $stdout.flush
|
118
|
-
end
|
92
|
+
|
93
|
+
# Return the public IP assigned to an environment (which may or may not be a booted cluster of instances)
|
94
|
+
# Displays error and exits if no public IP assigned to the environment
|
95
|
+
def fetch_public_ip(environment)
|
96
|
+
unless environment.load_balancer_ip_address
|
97
|
+
error "#{environment_display environment} has no assigned public IP address."
|
119
98
|
end
|
99
|
+
|
100
|
+
say "#{environment_display environment} has IP #{environment.load_balancer_ip_address}"
|
101
|
+
environment.load_balancer_ip_address
|
120
102
|
end
|
121
|
-
|
103
|
+
|
122
104
|
# Discover which DNS provider (DNSimple, etc) is controlling +domain_name+ (a zone)
|
123
105
|
# and return [domain/zone, provider name]
|
124
106
|
#
|
@@ -133,28 +115,43 @@ module EngineYard
|
|
133
115
|
end
|
134
116
|
[nil, nil]
|
135
117
|
end
|
136
|
-
|
137
|
-
def assign_dns(domain, account_name, env_name, public_ip,
|
138
|
-
if record = domain.records.select {|r| r.name ==
|
139
|
-
if override || ask_override_dns?(domain,
|
118
|
+
|
119
|
+
def assign_dns(domain, account_name, env_name, public_ip, subdomain = "", override = false)
|
120
|
+
if record = domain.records.select {|r| r.name == subdomain}.first
|
121
|
+
if override || ask_override_dns?(domain, subdomain)
|
140
122
|
record.destroy
|
141
|
-
say "Deleted #{domain_name domain,
|
123
|
+
say "Deleted #{domain_name domain, subdomain}"
|
142
124
|
else
|
143
|
-
error "Cannot replace existing #{domain_name domain,
|
125
|
+
error "Cannot replace existing #{domain_name domain, subdomain} DNS"
|
144
126
|
end
|
145
127
|
end
|
146
|
-
say "Assigning "
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
say "
|
128
|
+
say "Assigning "
|
129
|
+
say "#{domain_name domain, subdomain} ", :green
|
130
|
+
say "--> "
|
131
|
+
say "#{public_ip} ", :green
|
132
|
+
say "(#{account_name}/#{env_name})"
|
133
|
+
|
134
|
+
record = domain.records.create(:ip => public_ip, :name => subdomain, :type => record_type(public_ip), :ttl => "60")
|
135
|
+
say "Created #{record.type} record for #{domain_name domain, subdomain}"
|
151
136
|
end
|
152
|
-
|
137
|
+
|
138
|
+
# "A" for IPv4 and "AAAA" for IPv6; else display error and exit
|
139
|
+
def record_type(public_ip)
|
140
|
+
address = IPAddress(public_ip)
|
141
|
+
if address.ipv4?
|
142
|
+
"A"
|
143
|
+
elsif address.ipv6?
|
144
|
+
"AAAA"
|
145
|
+
else
|
146
|
+
error "Cannot recognize IP #{public_ip} as either IPv4 or IPv6 format"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
153
150
|
def ask_override_dns?(domain, name)
|
154
151
|
ui = EY::CLI::UI::Prompter.backend
|
155
152
|
ui.agree("Replace #{domain_name domain, name}: ", "y")
|
156
153
|
end
|
157
|
-
|
154
|
+
|
158
155
|
# "myapp.com", "name" => "name.myapp.com"
|
159
156
|
# "myapp.com", "" => "myapp.com"
|
160
157
|
def domain_name(domain, name = nil)
|
@@ -164,20 +161,51 @@ module EngineYard
|
|
164
161
|
domain.domain
|
165
162
|
end
|
166
163
|
end
|
167
|
-
|
164
|
+
|
168
165
|
# Returns the list of DNS providers that the current user has access to
|
169
166
|
# Includes the +fog_dns_providers+ list
|
170
167
|
# TODO find credentials in alternate locations (e.g. ~/.dnsimple)
|
171
168
|
def dns_provider_names
|
172
169
|
fog_dns_provider_names
|
173
170
|
end
|
174
|
-
|
171
|
+
|
175
172
|
# Returns the list of DNS providers that the current user has fog credentials
|
176
173
|
# TODO how do I get the base list from fog?
|
177
174
|
def fog_dns_provider_names
|
178
|
-
['AWS', 'Bluebox', 'DNSimple', 'Linode', 'Slicehost', 'Zerigo'] & Fog.
|
175
|
+
['AWS', 'Bluebox', 'DNSimple', 'Linode', 'Slicehost', 'Zerigo'] & Fog.available_providers
|
179
176
|
end
|
180
177
|
|
178
|
+
def environment_display(environment)
|
179
|
+
"AppCloud environment #{environment.account.name}/#{environment.name}"
|
180
|
+
end
|
181
|
+
|
182
|
+
def validate_fog_credentials
|
183
|
+
return if File.exist?(Fog.credentials_path)
|
184
|
+
|
185
|
+
File.open(Fog.credentials_path, "w") do |file|
|
186
|
+
file << <<-CREDENTIALS
|
187
|
+
:default:
|
188
|
+
:aws_access_key_id: ACCESSKEY
|
189
|
+
:aws_secret_access_key: SECRETKEY
|
190
|
+
:bluebox_customer_id: ID
|
191
|
+
:bluebox_api_key: APITOKEN
|
192
|
+
:dnsimple_email: EMAIL
|
193
|
+
:dnsimple_password: PASSWORD
|
194
|
+
:linode_api_key: APITOKEN
|
195
|
+
:slicehost_password: APITOKEN
|
196
|
+
:zerigo_email: EMAIL
|
197
|
+
:zerigo_token: APITOKEN
|
198
|
+
CREDENTIALS
|
199
|
+
end
|
200
|
+
FileUtils.chmod(0600, Fog.credentials_path)
|
201
|
+
|
202
|
+
pretty_path = Fog.credentials_path
|
203
|
+
pretty_path = "~/.fog" if Fog.credentials_path == File.expand_path("~/.fog")
|
204
|
+
error <<-HELP
|
205
|
+
Missing credentials for DNS providers.
|
206
|
+
An example #{pretty_path} credentials file has been created for you.
|
207
|
+
HELP
|
208
|
+
end
|
181
209
|
end
|
182
210
|
end
|
183
211
|
end
|
@@ -2,15 +2,13 @@
|
|
2
2
|
|
3
3
|
For me, one of the things I liked to do with a new AppCloud application is to attached a pretty domain. The default AWS EC2 URL doesn't glorify my fine efforts.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
To make setting up DNS easier with AppCloud, we've released the `ey-dns` command line application.
|
5
|
+
To make setting up DNS easier with AppCloud, we've released the `ey-dns` command line application as an open source project ([readme](https://github.com/engineyard/engineyard-dns#readme)).
|
8
6
|
|
9
7
|
It's really quite easy to use:
|
10
8
|
|
11
|
-
1. Register your application's domain with
|
12
|
-
2. Transfer your domain to
|
13
|
-
3. Install and run the command line application:
|
9
|
+
1. Register your application's domain with a DNS provider (see supported list below), such as DNSimple.
|
10
|
+
2. Transfer your domain to the DNS provider or change to use their name servers, such as ns1.dnsimple.com (ns2, ns3, etc) for DNSimple.
|
11
|
+
3. Install and run the command line application within your Rails/Ruby app:
|
14
12
|
|
15
13
|
$ gem install engineyard-dns
|
16
14
|
$ cd path/to/my/app
|
@@ -18,10 +16,6 @@ It's really quite easy to use:
|
|
18
16
|
Assigning myapp.com --> 1.2.3.4 (drnic/myapp_production)
|
19
17
|
Assigning www.myapp.com --> 1.2.3.4 (drnic/myapp_production)
|
20
18
|
|
21
|
-
Found 2 records for myapp.com
|
22
|
-
.myapp.com (A)-> 1.2.3.4 (ttl:, id:12345)
|
23
|
-
www.myapp.com (A)-> 1.2.3.4 (ttl:, id:12346)
|
24
|
-
|
25
19
|
If you have previously assigned the domain records to another host, it will prompt you to change them.
|
26
20
|
|
27
21
|
If there is any confusion about which AppCloud environment is hosting your application, it will show you your options and then you can use the `--environment` and `--account` options to be more specific:
|
@@ -29,6 +23,57 @@ If there is any confusion about which AppCloud environment is hosting your appli
|
|
29
23
|
$ ey-dns apply myapp.com --environment myapp_production
|
30
24
|
$ ey-dns apply myapp.com staging --environment myapp_staging
|
31
25
|
|
26
|
+
## Supported DNS providers
|
27
|
+
|
28
|
+
This tool will automatically determine which DNS provider is managing the domain/zone that you are wiring up to your AppCloud environment.
|
29
|
+
|
30
|
+
The `ey-dns` uses [fog](https://github.com/geemus/fog) to access DNS providers. The current list of available DNS providers for fog is: AWS, Bluebox, DNSimple, Linode, Slicehost, Zerigo. The next section shows how to setup fog credentials.
|
31
|
+
|
32
|
+
## DNS credentials
|
33
|
+
|
34
|
+
To access your DNS provider, you need to add your account/API credentials into `~/.fog` file. I currently have DNS access to DNSimple, Slicehost and AWS Route 53. My `~/.fog` file looks a little bit like:
|
35
|
+
|
36
|
+
:default:
|
37
|
+
:dnsimple_email: MYEMAIL
|
38
|
+
:dnsimple_password: XXXXXXXXXXX
|
39
|
+
:aws_access_key_id: 0NJRCXXXXXXXXXXXX
|
40
|
+
:aws_secret_access_key: QGtnbXXXXXXXXXXXX/qQ4lXXXXXXXXXXXXXX
|
41
|
+
:slicehost_password: f9a265f66XXXXXXXXXXXXXXXXXXXXXXXXXXX
|
42
|
+
|
43
|
+
### DNSimple credentials
|
44
|
+
|
45
|
+
I currently use [DNSimple](https://dnsimple.com/r/a72aa4340dce68) for registering and serving all my new domains. Their API credentials are the same email/password you use to login to the service.
|
46
|
+
|
47
|
+
Note the surreptitious referral used here, giving me a free month for each DNSimple sign-up, bwhahahaha. To avoid gifting me a free month, use [http://dnsimple.com](http://dnsimple.com/) link. A free month isn't as cool as free swag, but I don't think DNSimple has free swag. Well, I don't have any of it.
|
48
|
+
|
49
|
+
### AWS credentials
|
50
|
+
|
51
|
+
Recently AWS began offering an API-driven DNS server [Route 53](http://aws.amazon.com/route53/). The AWS credentials for access DNS are the same credentials you use in CarrierWave or PaperClip to access AWS S3. To find them, log into your [AWS Account](http://aws.amazon.com/account/) and navigate to "Security Credentials", then "Access Credentials",
|
52
|
+
and click "Show" to see your secret access key.
|
53
|
+
|
54
|
+
<img src="https://img.skitch.com/20110524-m7d5js2nrfwxynbw14hh9qqf3f.png">
|
55
|
+
|
56
|
+
### Slicehost credentials
|
57
|
+
|
58
|
+
Until I switched to DNSimple and to fog, I used Slicehost for its [API/CLI-driven](https://github.com/cameroncox/slicehost-tools) DNS. I still have many domains managed by Slicehost. To enable API access to your Slicehost account in `fog` (and hence `ey-dns`) go to [https://manage.slicehost.com/api](https://manage.slicehost.com/api), enabled API access and copy your API token into the `slicehost_password` field of `~/.fog` above.
|
59
|
+
|
60
|
+
<img src="https://img.skitch.com/20110524-jbmkcwumrdgw2pgrt7kpe1mbga.png">
|
61
|
+
|
62
|
+
### Testing credentials
|
63
|
+
|
64
|
+
You can test your DNS credentials with the `ey-dns domains` command:
|
65
|
+
|
66
|
+
$ ey-dns domains
|
67
|
+
AWS: none
|
68
|
+
DNSimple:
|
69
|
+
drnicwilliams.com - 0 records
|
70
|
+
emrubyconf.com - 2 records
|
71
|
+
mocra.com - 27 records
|
72
|
+
Slicehost:
|
73
|
+
myconfplan.com. - 0 records
|
74
|
+
|
75
|
+
## Summary
|
76
|
+
|
32
77
|
Hopefully this tool makes it much easier to setup or change DNS for your AppCloud environments. Let us know in the comments or in the project's [Issues](https://github.com/engineyard/engineyard-dns/issues) if you love it, find bugs or have feature requests.
|
33
78
|
|
34
79
|
The source and instructions for the project is [available on GitHub](https://github.com/engineyard/engineyard-dns#readme).
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-dns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Dr Nic Williams
|
@@ -10,139 +15,190 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-27 00:00:00 -07:00
|
14
19
|
default_executable:
|
15
20
|
dependencies:
|
16
21
|
- !ruby/object:Gem::Dependency
|
17
|
-
name: thor
|
18
|
-
prerelease: false
|
19
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
23
|
none: false
|
21
24
|
requirements:
|
22
|
-
- - "
|
25
|
+
- - "="
|
23
26
|
- !ruby/object:Gem::Version
|
24
|
-
|
27
|
+
hash: 51
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 3
|
31
|
+
- 20
|
32
|
+
version: 1.3.20
|
33
|
+
name: engineyard
|
34
|
+
prerelease: false
|
25
35
|
type: :runtime
|
26
36
|
version_requirements: *id001
|
27
37
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: engineyard
|
29
|
-
prerelease: false
|
30
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
39
|
none: false
|
32
40
|
requirements:
|
33
|
-
- -
|
41
|
+
- - ~>
|
34
42
|
- !ruby/object:Gem::Version
|
35
|
-
|
43
|
+
hash: 59
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 8
|
47
|
+
- 2
|
48
|
+
version: 0.8.2
|
49
|
+
name: fog
|
50
|
+
prerelease: false
|
36
51
|
type: :runtime
|
37
52
|
version_requirements: *id002
|
38
53
|
- !ruby/object:Gem::Dependency
|
39
|
-
name: fog
|
40
|
-
prerelease: false
|
41
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
42
55
|
none: false
|
43
56
|
requirements:
|
44
|
-
- -
|
57
|
+
- - ~>
|
45
58
|
- !ruby/object:Gem::Version
|
46
|
-
|
59
|
+
hash: 27
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
- 8
|
63
|
+
version: "0.8"
|
64
|
+
name: ipaddress
|
65
|
+
prerelease: false
|
47
66
|
type: :runtime
|
48
67
|
version_requirements: *id003
|
49
68
|
- !ruby/object:Gem::Dependency
|
50
|
-
name: rake
|
51
|
-
prerelease: false
|
52
69
|
requirement: &id004 !ruby/object:Gem::Requirement
|
53
70
|
none: false
|
54
71
|
requirements:
|
55
72
|
- - ~>
|
56
73
|
- !ruby/object:Gem::Version
|
74
|
+
hash: 59
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
- 9
|
78
|
+
- 0
|
57
79
|
version: 0.9.0
|
80
|
+
name: rake
|
81
|
+
prerelease: false
|
58
82
|
type: :development
|
59
83
|
version_requirements: *id004
|
60
84
|
- !ruby/object:Gem::Dependency
|
61
|
-
name: cucumber
|
62
|
-
prerelease: false
|
63
85
|
requirement: &id005 !ruby/object:Gem::Requirement
|
64
86
|
none: false
|
65
87
|
requirements:
|
66
88
|
- - ~>
|
67
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 31
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
- 10
|
68
94
|
version: "0.10"
|
95
|
+
name: cucumber
|
96
|
+
prerelease: false
|
69
97
|
type: :development
|
70
98
|
version_requirements: *id005
|
71
99
|
- !ruby/object:Gem::Dependency
|
72
|
-
name: rspec
|
73
|
-
prerelease: false
|
74
100
|
requirement: &id006 !ruby/object:Gem::Requirement
|
75
101
|
none: false
|
76
102
|
requirements:
|
77
103
|
- - ~>
|
78
104
|
- !ruby/object:Gem::Version
|
105
|
+
hash: 9
|
106
|
+
segments:
|
107
|
+
- 2
|
108
|
+
- 5
|
79
109
|
version: "2.5"
|
110
|
+
name: rspec
|
111
|
+
prerelease: false
|
80
112
|
type: :development
|
81
113
|
version_requirements: *id006
|
82
114
|
- !ruby/object:Gem::Dependency
|
83
|
-
name: json
|
84
|
-
prerelease: false
|
85
115
|
requirement: &id007 !ruby/object:Gem::Requirement
|
86
116
|
none: false
|
87
117
|
requirements:
|
88
118
|
- - ~>
|
89
119
|
- !ruby/object:Gem::Version
|
120
|
+
hash: 7
|
121
|
+
segments:
|
122
|
+
- 1
|
123
|
+
- 4
|
124
|
+
- 0
|
90
125
|
version: 1.4.0
|
126
|
+
name: json
|
127
|
+
prerelease: false
|
91
128
|
type: :development
|
92
129
|
version_requirements: *id007
|
93
130
|
- !ruby/object:Gem::Dependency
|
94
|
-
name: awesome_print
|
95
|
-
prerelease: false
|
96
131
|
requirement: &id008 !ruby/object:Gem::Requirement
|
97
132
|
none: false
|
98
133
|
requirements:
|
99
134
|
- - ">="
|
100
135
|
- !ruby/object:Gem::Version
|
136
|
+
hash: 3
|
137
|
+
segments:
|
138
|
+
- 0
|
101
139
|
version: "0"
|
140
|
+
name: awesome_print
|
141
|
+
prerelease: false
|
102
142
|
type: :development
|
103
143
|
version_requirements: *id008
|
104
144
|
- !ruby/object:Gem::Dependency
|
105
|
-
name: realweb
|
106
|
-
prerelease: false
|
107
145
|
requirement: &id009 !ruby/object:Gem::Requirement
|
108
146
|
none: false
|
109
147
|
requirements:
|
110
148
|
- - ~>
|
111
149
|
- !ruby/object:Gem::Version
|
150
|
+
hash: 23
|
151
|
+
segments:
|
152
|
+
- 0
|
153
|
+
- 1
|
154
|
+
- 6
|
112
155
|
version: 0.1.6
|
156
|
+
name: realweb
|
157
|
+
prerelease: false
|
113
158
|
type: :development
|
114
159
|
version_requirements: *id009
|
115
160
|
- !ruby/object:Gem::Dependency
|
116
|
-
name: open4
|
117
|
-
prerelease: false
|
118
161
|
requirement: &id010 !ruby/object:Gem::Requirement
|
119
162
|
none: false
|
120
163
|
requirements:
|
121
164
|
- - ">="
|
122
165
|
- !ruby/object:Gem::Version
|
166
|
+
hash: 3
|
167
|
+
segments:
|
168
|
+
- 0
|
123
169
|
version: "0"
|
170
|
+
name: open4
|
171
|
+
prerelease: false
|
124
172
|
type: :development
|
125
173
|
version_requirements: *id010
|
126
174
|
- !ruby/object:Gem::Dependency
|
127
|
-
name: sinatra
|
128
|
-
prerelease: false
|
129
175
|
requirement: &id011 !ruby/object:Gem::Requirement
|
130
176
|
none: false
|
131
177
|
requirements:
|
132
178
|
- - ">="
|
133
179
|
- !ruby/object:Gem::Version
|
180
|
+
hash: 3
|
181
|
+
segments:
|
182
|
+
- 0
|
134
183
|
version: "0"
|
184
|
+
name: sinatra
|
185
|
+
prerelease: false
|
135
186
|
type: :development
|
136
187
|
version_requirements: *id011
|
137
188
|
- !ruby/object:Gem::Dependency
|
138
|
-
name: fakeweb
|
139
|
-
prerelease: false
|
140
189
|
requirement: &id012 !ruby/object:Gem::Requirement
|
141
190
|
none: false
|
142
191
|
requirements:
|
143
192
|
- - ~>
|
144
193
|
- !ruby/object:Gem::Version
|
194
|
+
hash: 27
|
195
|
+
segments:
|
196
|
+
- 1
|
197
|
+
- 3
|
198
|
+
- 0
|
145
199
|
version: 1.3.0
|
200
|
+
name: fakeweb
|
201
|
+
prerelease: false
|
146
202
|
type: :development
|
147
203
|
version_requirements: *id012
|
148
204
|
description: Easily configure your DNS with Engine Yard AppCloud via DNSimple.
|
@@ -166,8 +222,8 @@ files:
|
|
166
222
|
- engineyard-dns.gemspec
|
167
223
|
- features/assign_dns_to_environment.feature
|
168
224
|
- features/list_available_domains.feature
|
225
|
+
- features/missing_credentials.feature
|
169
226
|
- features/step_definitions/common_steps.rb
|
170
|
-
- features/step_definitions/dnsimple_steps.rb
|
171
227
|
- features/step_definitions/ey_api_steps.rb
|
172
228
|
- features/step_definitions/fog_steps.rb
|
173
229
|
- features/support/common.rb
|
@@ -194,25 +250,31 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
194
250
|
requirements:
|
195
251
|
- - ">="
|
196
252
|
- !ruby/object:Gem::Version
|
253
|
+
hash: 3
|
254
|
+
segments:
|
255
|
+
- 0
|
197
256
|
version: "0"
|
198
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
258
|
none: false
|
200
259
|
requirements:
|
201
260
|
- - ">="
|
202
261
|
- !ruby/object:Gem::Version
|
262
|
+
hash: 3
|
263
|
+
segments:
|
264
|
+
- 0
|
203
265
|
version: "0"
|
204
266
|
requirements: []
|
205
267
|
|
206
268
|
rubyforge_project: engineyard-dns
|
207
|
-
rubygems_version: 1.
|
269
|
+
rubygems_version: 1.5.0
|
208
270
|
signing_key:
|
209
271
|
specification_version: 3
|
210
272
|
summary: Configure your Engine Yard AppCloud environment and your DNSimple domain.
|
211
273
|
test_files:
|
212
274
|
- features/assign_dns_to_environment.feature
|
213
275
|
- features/list_available_domains.feature
|
276
|
+
- features/missing_credentials.feature
|
214
277
|
- features/step_definitions/common_steps.rb
|
215
|
-
- features/step_definitions/dnsimple_steps.rb
|
216
278
|
- features/step_definitions/ey_api_steps.rb
|
217
279
|
- features/step_definitions/fog_steps.rb
|
218
280
|
- features/support/common.rb
|