On Friday, April 26, 2013 12:36:21 PM UTC-5, phundisk wrote:
>
> I am presuming that this is something I need to do with stored configs, 
> but there might also be another way to do it.
>
> I am looking to create a file called /root/production.servers which will 
> list all my production servers.  All production servers have the puppet 
> variable of $environment='production' in the nodes.pp.  Is there a way I 
> can utilize this variable to create this file?  Is stored configs the best 
> option here?
>

There are basically two approaches:

   1. The master knows at all times which nodes are supposed to be 
   production servers.  This would involve an exhaustive list of the 
   production servers in a Puppet manifest or in a data file read by the 
   master.  In this case, you would probably just build the file via a 
   template and apply it as a normal File resource.  No stored configs are 
   needed for this.
   2. What I think you're saying, though, is that you want Puppet to 
   dynamically recognize nodes based on their self-declared environment (if 
   the master were choosing the environment rather than the agent, then you 
   would have case 1).  The most natural way to handle this situation is via 
   exported resources (which requires stored configs).

For case 2, the key thing to remember is that each production server must 
declare and export a distinct resource that describes its own node-specific 
data.  That's not the whole file, but rather just a piece of one.  The 
Concat add-in module is perfect for this sort of thing.  You might use it 
like so:

# This class must be included on production servers
# (and not on other nodes).
class prod::server {
  # Export a line of the production server list
  @@concat::fragment { "prodserver-${hostname}":
    target => '/root/production.servers',
    content => "${hostname}\n"
  }
}

# Nodes that should have the server list declare this class;
# they may be production servers, but do not need to be.
class prod::serverlist {

  # The target file
  concat { '/root/production.servers':
    owner => 'root',
    group => 'root',
    mode => '0644'
  }

  # Import all the fragments:
  Concat::Fragment<<| target == '/root/production.servers' |>>
}


The final piece, then, is to ensure that class 'prod::server' gets declared 
on all the production servers, and only those.  If you're going to use the 
$environment variable to control this, then that means putting a 
conditional statement such as this one somewhere that that is evaluated for 
every node:

if $environment == 'production' {
  include 'prod::server'
}

That could go in a shared base node or in a common class that all nodes 
declare.


John

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to