- From: "Luis Correa d'Almeida" <
>
- To:
- Subject: [chef] Re: Re: Setting up hosts between multiple boxes on EC2
- Date: Mon, 21 Nov 2011 11:58:15 +0000
Great, thanks. Using search works well for my setup.
On Sun, Nov 20, 2011 at 3:42 PM, Haim Ashkenazi
<
>
wrote:
>
One more thing, In this setup the node is named with the general name
>
(db.domain.com). Otherwise change the NODENAME variable.
>
>
On Sun, Nov 20, 2011 at 5:40 PM, Haim Ashkenazi
>
<
>
>
wrote:
>
>
>
> Hi
>
> I've actually implemented something like that with route53 (amazon't DNS
>
> service). For each important host (e.g, db) I've created a name (e.g.
>
> db.domain.com) and added it as CNAME to the host's internal address (this
>
> does not work between regions though). The reason I chose route53 was that
>
> I
>
> think (It's not yet checked) that It helps reduces TTL since I already
>
> query
>
> the amazon DNS.
>
> The update script looks like this:
>
> #!/usr/bin/env ruby
>
> NODENAME = <%= %{'#{node.name}'} %>
>
> HOSTNAME = <%= %{'#{node[:ec2][:hostname]}'} %>
>
> DOMAINNAME = <%= %{'#{node[:company][:internal_domain]}'} %>
>
> EC2_KEY_ID = <%=
>
> %{'
'EC2_KEY_ID']}'}
>
> %>
>
> EC2_SECRET_KEY = <%=
>
> %{'
'EC2_SECRET_KEY']}'}
>
> %>
>
> require 'rubygems'
>
> require 'right_aws'
>
> module Route53Update
>
> extend self
>
> def r53
>
> @r53 ||= RightAws::Route53Interface.new(EC2_KEY_ID, EC2_SECRET_KEY)
>
> end
>
> def zone_id
>
> return @zone_id if @zone_id
>
> zone = r53.list_hosted_zones.select { |zone|
>
> zone[:name] =~ /^#{DOMAINNAME}\.?$/
>
> }.first
>
> @zone_id = zone ? zone[:aws_id] :
>
> raise("Zone #{DOMAINNAME} doesn't seem to be registered!")
>
> end
>
> def create_cname
>
> delete_cname
>
> resource_record_sets = [{
>
> :name => NODENAME,
>
> :type => 'CNAME',
>
> :ttl => 300,
>
> :resource_records => [HOSTNAME]
>
> }]
>
> r53.create_resource_record_sets(zone_id, resource_record_sets, "")
>
> end
>
> def delete_cname
>
> r53.list_resource_record_sets(zone_id).each do |record|
>
> if record[:name] == "#{NODENAME}."
>
> r53.delete_resource_record_sets(zone_id, [record], "")
>
> break
>
> end
>
> end
>
> end
>
> def validate_cname
>
> res = r53.list_resource_record_sets(zone_id).select { |record|
>
> record[:name] =~ /#{NODENAME}\.?$/
>
> }.first
>
> res && res[:resource_records].include?(HOSTNAME) ? true : false
>
> end
>
> def update_cname
>
> return if validate_cname
>
> create_cname
>
> # TODO: validate sync!
>
> end
>
> end
>
> if $0 == __FILE__
>
> Route53Update.update_cname
>
> end
>
> You have to install right_aws gem and add an init script (so it'll run on
>
> boot). You can probably figure out the variables.
>
> Using DNS helps with not having to restart application every time a host
>
> changes it IP, but you have to consider DNS caching (e.g, Java caches dns
>
> results depending on running environment).
>
> HTH
>
> Haim
>
> On Sun, Nov 20, 2011 at 3:32 PM, Luis Correa d'Almeida
>
> <
>
>
> wrote:
>
>>
>
>> Let's say I provision two boxes on EC2: db1 and app1
>
>>
>
>> What's the best way to make each box aware of the other? I need to
>
>> tell app1 the IP/host/FQDN of the db1 machine so it can connect to it.
>
>>
>
>> One option is to use hosts in the config files - for example, in the
>
>> app1 box the config references a host (db1) that I can set up either
>
>> in the hosts file or in the local DNS. But I still wouldn't know the
>
>> IP of db1 to populate the hosts file with when running chef. At this
>
>> point, I need to change my data-bags once I find out the address of
>
>> db1 and then provision app1, running a recipe that adds the right
>
>> entry to the hosts file with the newly found db1 IP.
>
>>
>
>> Just wondering if there is a better way.
>
>>
>
>> Thanks,
>
>>
>
>> Luis
>
>
>
>
>
>
>
> --
>
> Haim
>
>
>
>
--
>
Haim
>
--
Luis Corrêa d'Almeida
tribe.fm/luis
Archive powered by MHonArc 2.6.16.