PuppetENC is a connector plugin that adds support for Puppet External Node Classifiers (http://docs.puppetlabs.com/guides/external_nodes.html), or ENCs.
The PuppetENC plugin implements the Puppet 2.6.5+ ENC output format with some modifications. The basic output format is described here. The following modifications apply:
The parameters from separate ENCs are all merged together, including parameters from any parameterized classes. This is a shallow merge; in other words, only the top-level keys are considered. For instance, assuming you had one ENC that produced:
parameters:
ntp_servers:
- 0.pool.ntp.org
- ntp1.example.com
And another that produced:
parameters:
ntp_servers:
- ntp2.example.com
This would result in connector data that included either the first value of ntp_servers or the second, but not both; this would depend on the order in which the ENCs were run, which is non-deterministic and should not be relied upon. However, if you add one ENC that produced:
parameters:
ntp_servers:
- 0.pool.ntp.org
- ntp1.example.com
And another that produced:
parameters:
mail_servers:
- mail.example.com
Then the connector data would consist of:
{"ntp_servers": ["0.pool.ntp.org", "ntp1.example.com"],
"mail_servers": ["mail.example.com"]}
To use the PuppetENC plugin, first do mkdir /var/lib/bcfg2/PuppetENC. Add PuppetENC to your plugins line in /etc/bcfg2.conf. Now you can place any ENCs you wish to run in /var/lib/bcfg2/PuppetENC. Note that ENCs are run each time client metadata is generated, so if you have a large number of ENCs or ENCs that are very time-consuming, they could have a significant impact on server performance. In that case, it could be worthwhile to write a dedicated Connector plugin.
PuppetENC parameters can be accessed in templates as metadata.PuppetENC, which is a dict of all parameter data merged together. For instance, given the following ENC output:
---
classes:
common:
puppet:
ntp:
ntpserver: 0.pool.ntp.org
aptsetup:
additional_apt_repos:
- deb localrepo.example.com/ubuntu lucid production
- deb localrepo.example.com/ubuntu lucid vendor
parameters:
ntp_servers:
- 0.pool.ntp.org
- ntp.example.com
mail_server: mail.example.com
iburst: true
environment: production
metadata.PuppetENC would contain:
'additional_apt_repos': ['deb localrepo.example.com/ubuntu lucid production',
'deb localrepo.example.com/ubuntu lucid vendor'],
'iburst': True,
'mail_server': 'mail.example.com',
'ntp_servers': ['0.pool.ntp.org', 'ntp.example.com'],
'ntpserver': '0.pool.ntp.org'}
(Note that the duplication of NTP server data doesn’t make this an especially good example; it’s just the official Puppet example.)
So, in a template you could do something like:
{% for repo in metadata.PuppetENC['additional_apt_repos'] %}\
${repo}
{% end %}\