A while ago I released a Puppet 4 Hiera based node classifier to see what is next for hiera_include(). This had the major drawback that you couldn’t set an environment with it like with a real ENC since Puppet just doesn’t have that feature.
I’ve released a update to the classifier that now include a small real ENC that takes care of setting the environment based on certname and then boots up the classifier on the node.
Usage
ENCs tend to know only about the certname, you could imagine getting most recent seen facts from PuppetDB etc but I do not really want to assume things about peoples infrastructure. So for now this sticks to supporting classification based on certname only.
It’s really pretty simple, lets assume you are wanting to classify node1.example.net, you just need to have a node1.example.net.yaml (or JSON) file somewhere in a path. Typically this is going to be in a directory environment somewhere but could of course also be a site wide hiera directory.
In it you put:
classifier::environment: development |
And this will node will form part of that environment. Past that everything in the previous post just applies so you make rules or assign classes as normal, and while doing so you have full access to node facts.
The classifier now expose some extra information to help you determine if the ENC is in use and based on what file it’s classifying the node:
- $classifier::enc_used – boolean that indicates if the ENC is in use
- $classifier::enc_source – path to the data file that set the environment. undef when not found
- $classifier::enc_environment – the environment the ENC is setting
It supports a default environment which you configure when configuring Puppet to use a ENC as below.
Configuring Puppet
Configuring Puppet is pretty simple for this:
[main] node_terminus = exec external_nodes = /usr/local/bin/classifier_enc.rb --data-dir /etc/puppetlabs/code/hieradata --node-pattern nodes/%%.yaml |
Apart from these you can do –default development to default to that and not production and you can add –debug /tmp/enc.log to get a bunch of debug output.
The data-dir above is for your classic Hiera single data dir setup, but you can also use globs to support environment data like –data-dir /etc/puppetlabs/code/environments/*/hieradata. It will now search the entire glob until it finds a match for the certname.
That’s really all there is to it, it produce a classification like this:
--- environment: production classes: classifier: enc_used: true enc_source: /etc/puppetlabs/code/hieradata/node.example.yaml enc_environment: production |
Conclusion
That’s really all there is to it, I think this might hit a high percentage of user cases and bring a key ability to the hiera classifiers. It’s a tad annoying there is no way really to do better granularity than just per node here, I might come up with something else but don’t really want to go too deep down that hole.
In future I’ll look about adding a class to install the classifier into some path and configure Puppet, for now that’s up to the user. It’s shipped in the bin dir of the module.