On Feb 27, 2009, at 4:13 PM, Jason Slagle wrote:

>
> Ok, so I figured I'd move this here since IRC isn't the place for it.
>
> Ok, so I have my 40ish servers.  Of those, 36 or so of them have hosts
> entries that need to look like this:
>
> 127.0.0.1             localhost
> 172.x.x.x             dbprod1.xxx.com dbprod1
> 172.x.x.x             mgmt01.xxx.com mgmt01 puppet certmaster
> 172.x.x.x             mybox.xxx.com mybox
>
> Where mybox is the name of the box.
>
> The others have a few additional entries.
>
> So, I made a class that creates those hosts entries and I include it  
> on my
> host.
>
> Part of the class does this:
>
>   host { "${fqdn}":
>     ip => $ipaddress,
>     alias => $hostname,
>   }
>
> Seems simple enough eh?
>
> The issue comes up with those few exception.  In particular on the  
> mgmt01
> box.  It blows up because it I end up redefining the host, which is a
> nono.
>
> So - lightbulb goes off in head.  I'll add a case to the class that  
> checks
> if the fqdn is one of the ones I manually insert, and if so I'll  
> skip it.
>
> Now to me, this is a bad solution because it puts node specific logic
> inside a class - I think that from a architecture/reusable component/ 
> large
> scale perspetive that stuff belongs at the node definition.  I guess I
> could just not use my host class on my exception.
>
> So, my next attempt was this:
>
> node mgmt01.xxx.com {
>   $extrahosts = ["puppet", "certmaster"]
>   include hosts
> }
>
> So, I thought this would work:
>
> if $extrahosts {
>   $myhosts = [$hostname, $extrahosts]
> } else {
>   $myhost = $hostname
> }
>
>   host { "${fqdn}":
>     ip => $ipaddress,
>     alias => $myhost,
>   }
>
> Still have the case to handle the duplicate type, but this allow me to
> specify the extra aliases and handles the rest of my cases.
>
> But, this doesn't work.
>
> It would seem that the above not working in SOME form really limits  
> the
> ability to write modules/classes that work in 90% of the cases and  
> can be
> overridden in the other 10%.  This simplifies configuration a lot.
>
> Am I just doing something wrong?  Am I crazy?  Am I thinking too  
> much like
> a programmer?  Do I suck?

You've got a strange modeling problem, and I don't know that there's a  
simple way to implement the specific model you've chosen.

You should be able to do something like this in the code that creates  
the host:

   if ! defined(Host[$fqdn]) {
     host { $fqdn: .... }
   }

But you've chosen what amounts to a recursive process here:  If the  
hosts can look up their own information, there isn't really any value  
to putting it in the hosts file, is there?  Seems redundant and  
potentially self-referential, if they're using the existing hosts file  
to look up the information.

Seems to make more sense to pick a specific data source, like dns or  
some external host table, and rely on that explicitly for building  
your hosts file.

One option, used successfully for users -- and there's a lot more  
crossover in managing the types than is obvious -- is to have a single  
class with all hosts defined as virtual resources, and then just  
select the ones you want:

class hosts {
   @host {
     foo: ipaddress => bar, ...;
     ...
   }
}

class myservice {
   realize(Host[foo])
}

You can then realize a given host (e.g., mgmt01) as many times as you  
want while keeping just one copy in your configuration.  If you use  
this then you have to statically declare all of this, which is  
probably a bit redundant since you also likely have it in DNS.  There  
are ways to mitigate that, too, but you're clearly in the realm of "I  
have a complicated system and would like to spend a bunch of time on  
it".

-- 
Sometimes I think we're alone. Sometimes I think we're not. In
either case, the thought is staggering. --R. Buckminster Fuller
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to