I barely know enough Puppet to ask this question.

I think I understand that the configuration for a particular node would consist of a collection of modules, with some node-specific glue. From the tutorials and documentation, it appears that the node-specific resources would be in a manifests/site.pp file, in node /nodename/ { } resources, with "includes" for the relevant classes, and resources to make node-specific configuration changes.

Now enter an External Node Classifier (ENC) such as theForeman.

From my reading of the ENC documentation, I COULD use node /nodename/ { } resources in a site.pp, but I can't declare any new resources. It's basically not recommended. The generated YAML is all just includes and variable settings.

So what does one do for configuration specific to a given node or a host group -- the wiring that integrates all your included classes?

Do you end up creating a class that's specific to the node? Where do you put that class, in a node-specific module? Or do you make a catch-all module for your site-specific configuration with classes that can be assigned to a specific node?

  • I appear to be in this situation (not entirely unexpected) where the Puppet tutorial teaches a configuration style that's not really useful in a real-world configuration. I'm struggling to find guidance. – Mojo Feb 6 '14 at 21:30
  • Couldn't you just define your nodes in the site manifest, and import the puppet environment into TheForeman? Am I missing something? Is this one specific problem or a plethora? – Vasili Syrakis Feb 6 '14 at 21:52
  • My nodes had some resources defined within the node object, and those can't be imported. I don't know where to put those resources now. (That and getting my terminology correct.) – Mojo Feb 6 '14 at 22:31

One approach to this is expressed in Designing Puppet – Roles and Profiles. The basic tenets are as follows:

  • A node includes one role, and one only.
  • A role includes one or more profiles to define the type of server
  • A profile includes and manages modules to define a logical technical stack
  • Modules manage resources
  • Modules should only be responsible for managing aspects of the component they are written for
  • I'm going to have to grab that book so I can put some concrete definitions to the terms "role" and "profile." I've not seen those words used in any other Puppet contexts, so I can't connect them to code in my head. – Mojo Feb 7 '14 at 15:45
  • It's not a book, it's a blog post. Most of the post is spent explaining the authors idea of roles and profiles, including demonstrating code for them. – sciurus Feb 7 '14 at 16:49
  • YES and it's just what I was looking for. Tell me this: Where do the roles and profiles go? Do you build a module called "roles" and one called "profiles?" That would make sense to me. Then on the ENC you can just assign a role to a node and get its proper bundle. – Mojo Feb 7 '14 at 17:09
  • Yes, that's how to do it. – sciurus Feb 7 '14 at 20:21
  • // , Minor note. "tenants" should read "tenets". – Nathan Basanese Aug 21 '15 at 17:16

I am assuming you are telling Foreman to import from a puppet master, if so I would suggest setting up your puppet dir like this:


you would then include this line in the site.pp file:

import 'nodes/*'

Then, in default.pp create your base server:

node default {
    #this is where you put all of the puppet directives you want on every server.
    #for example if you wanted screen on all of your servers
    package{ "screen": ensure -> installed; }

Then in another file under nodes, say web.pp you could include that and then set the directives for all web servers like so:

node /^web0[1-9]\.example\.com$/ inherits default {
    #this will inherit all of the settings in the default node and then do anything else you add.
    #like installing nginx
    package { "nginx": ensure -> installed; }

You can even chain inherits like in this db.pp file:

node db inherits default {
    #install postgresql-9.3
    package { "postgresql-9.3": ensure -> installed; }

node /^db0[1-9]\.example\.com$/ inherits db {
    #This block can even be empty unless you need something here.
  • Did you mean to include puppet/nodes as one of the directories on the puppet master? So the node-specific configuration isn't distributed by the ENC (Foreman) but delivered by the puppet master? I thought nodes delivered by the ENC couldn't include resources (like "package"). – Mojo Feb 6 '14 at 22:52
  • Yes I did mean to include nodes but under puppet/manifests. I also had the site.pp file in the wrong location. node configs can contain resources, I do it all over the place. Only time I don't is when I need to have more than just a package, like when I need the package, a config, and maybe a user. Then I'll use a class, which i define under the modules dir. – meatflag Feb 6 '14 at 23:15
  • import is deprecated -- use hiera_include instead to include a bunch of classes via some logic (see docs.puppet.com/hiera/1/…) – David Gardner May 11 '16 at 11:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.