There's no way to do DNS lookups in a template with stock Puppet, but you can 
pretty easily write a custom function to do that for you. By default, Resolv 
will use the settings in /etc/resolv.conf, so as long as your nameservers are 
set up correctly on the puppetmaster, you shouldn't run into any problems.

Try plopping something like this into 
lib/puppet/parser/functions/get_ip_addr.rb in your module's directory: 
<a href="https://gist.github.com/3308273";>https://gist.github.com/3308273</a>

require 'resolv'

module Puppet::Parser::Functions
  newfunction(:get_ip_addr, :type => :rvalue) do |args|
    # Super sexy regex to match valid IPs
    ip_addr_re = 
/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/
    hostname = args[0].strip
    if hostname =~ ip_addr_re then return hostname end
    begin
      Resolv::DNS.open { |dns| return dns.getaddress hostname }
    rescue Resolv::ResolvError
      return ''
    end
  end
end


Then you can call it in your template file as ```scope.function_get_ip_addr``` 
and it will either return the IP address for a hostname, the unchanged IP 
address for a valid IP address, and an empty string otherwise.

I'm not sure what your hiera() calls are supposed to return, but assuming 
$webfarm ends up as a hash with keys http_servers and https_servers containing 
an array of hashes with keys host and port, you could do something like this:

<% webfarm = scope.lookupvar 'foo::data::webfarm' %>
<% webfarm['http_servers'].each do |server| %>
    <%= scope.function_get_ip_addr server['host'] %>:<%= server['port'] %>
<% end %>

On Thursday, August 9, 2012 1:38:14 PM UTC-7, Tim Mooney wrote:
> Environment: puppet 2.7.14 on both master and all clients.  We're also
> 
> using puppetlabs-stdlib and hiera, if that matters.
> 
> 
> 
> I know this is really more of a ruby/erb question, but I've been searching
> 
> for a couple hours and haven't turned up anything relatively close to what
> 
> I'm trying to do, and I'm hoping someone here has had to do this and can
> 
> provide a suggestion for how to proceed.
> 
> 
> 
> I'm generating a configuration file from a template.  The configuration
> 
> file will need to have IP addresses in it, but I would like to be able to
> 
> use either hostnames or IP adresses in the puppet config.  This means
> 
> that I need to be able to resolve the hostnames and turn them into IP
> 
> addresses, probably in the template itself.
> 
> 
> 
> Basically, given something like this in puppet:
> 
> 
> 
> class foo::data {
> 
> 
> 
>    $webfarm = {
> 
>      http_servers => hiera('webfarm_http_servers', [
> 
>        {
> 
>          host => 'foo1.example.com',
> 
>          port => '80',
> 
>         },
> 
>        {
> 
>          host => 'foo2.example.com',
> 
>          port => '80',
> 
>         },
> 
>        {
> 
>          host => 'foo3.example.com',
> 
>          port => '80',
> 
>         },
> 
>      ]),
> 
>      https_servers => hiera('webfarm_https_servers', [
> 
>        {
> 
>          host => 'foo1.example.com',
> 
>          port => '443',
> 
>         },
> 
>        {
> 
>          host => 'foo22.example.com',
> 
>          port => '443',
> 
>         },
> 
>        {
> 
>          host => 'foo99.example.com',
> 
>          port => '443',
> 
>         },
> 
>      ]),
> 
>    }
> 
> }
> 
> 
> 
> I need my template to iterate over the http_servers and https_servers
> 
> arrays and resolve the values for the host key for each element.
> 
> 
> 
> Anyone have an example of how to do this in a template?
> 
> 
> 
> Thanks,
> 
> 
> 
> Tim
> 
> -- 
> 
> Tim Mooney                                             tim.moo...@ndsu.edu
> 
> Enterprise Computing & Infrastructure                  701-231-1076 (Voice)
> 
> Room 242-J6, IACC Building                             701-231-8541 (Fax)
> 
> North Dakota State University, Fargo, ND 58105-5164


On Thursday, August 9, 2012 1:38:14 PM UTC-7, Tim Mooney wrote:
> Environment: puppet 2.7.14 on both master and all clients.  We're also
> 
> using puppetlabs-stdlib and hiera, if that matters.
> 
> 
> 
> I know this is really more of a ruby/erb question, but I've been searching
> 
> for a couple hours and haven't turned up anything relatively close to what
> 
> I'm trying to do, and I'm hoping someone here has had to do this and can
> 
> provide a suggestion for how to proceed.
> 
> 
> 
> I'm generating a configuration file from a template.  The configuration
> 
> file will need to have IP addresses in it, but I would like to be able to
> 
> use either hostnames or IP adresses in the puppet config.  This means
> 
> that I need to be able to resolve the hostnames and turn them into IP
> 
> addresses, probably in the template itself.
> 
> 
> 
> Basically, given something like this in puppet:
> 
> 
> 
> class foo::data {
> 
> 
> 
>    $webfarm = {
> 
>      http_servers => hiera('webfarm_http_servers', [
> 
>        {
> 
>          host => 'foo1.example.com',
> 
>          port => '80',
> 
>         },
> 
>        {
> 
>          host => 'foo2.example.com',
> 
>          port => '80',
> 
>         },
> 
>        {
> 
>          host => 'foo3.example.com',
> 
>          port => '80',
> 
>         },
> 
>      ]),
> 
>      https_servers => hiera('webfarm_https_servers', [
> 
>        {
> 
>          host => 'foo1.example.com',
> 
>          port => '443',
> 
>         },
> 
>        {
> 
>          host => 'foo22.example.com',
> 
>          port => '443',
> 
>         },
> 
>        {
> 
>          host => 'foo99.example.com',
> 
>          port => '443',
> 
>         },
> 
>      ]),
> 
>    }
> 
> }
> 
> 
> 
> I need my template to iterate over the http_servers and https_servers
> 
> arrays and resolve the values for the host key for each element.
> 
> 
> 
> Anyone have an example of how to do this in a template?
> 
> 
> 
> Thanks,
> 
> 
> 
> Tim
> 
> -- 
> 
> Tim Mooney                                             tim.moo...@ndsu.edu
> 
> Enterprise Computing & Infrastructure                  701-231-1076 (Voice)
> 
> Room 242-J6, IACC Building                             701-231-8541 (Fax)
> 
> North Dakota State University, Fargo, ND 58105-5164

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/puppet-users/-/AZx4EGIxT8cJ.
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