http://www.flickr.com/photos/toasty/915288758/
Scenario:

I have an idea!
Since all nodes are configured with Salt why not
let Salt maintain nodes in OpenNMS too?
What is Salt Stack anyway?
What is Salt Stack anyway? (2)
Overview of our options:
Option 1: DNS importer
<requisition-def import-name="linuxservers"
import-url-resource="dns://salt/linuxservers">
<cron-schedule>0 0 0 * * ? *</cron-schedule>
</requisition-def>
DNS zone generation in Salt
@ in soa localhost. root 1 3H 15M 1W 1D
ns localhost.
{% set nets=salt['publish.publish']('*','network.interfaces') %}\
{% for n in nets %}{% set pdata=salt['publish.publish'](n,'pillar.data') %}\
{% if pdata.has_key(n) %}{% if pdata[n].has_key('zone') %}\
{% if pdata[n]['zone']=='linuxservers' %}
{{ n }} IN A {{ nets[n]['eth0']['inet'][0]['address'] }}
{% endif %}{% endif %}{% endif %}{% endfor %}
https://gist.github.com/3987451
DNS: review
Option 2: Events
Event listener service (started from inittab or upstart):
event = salt.utils.event.MasterEvent('/var/run/salt/master/')
evt_generator=event.iter_events(tag='key',full=True)
for data in evt_generator:
payload = data['data']
minion_id = payload['id']
if payload.get('act') == 'accept' and payload.get('result'):
minion_id=("%s/%s" % ('add',minion_id))
if payload.get('act') == 'delete' and payload.get('result'):
minion_id=("%s/%s" % ('delete',minion_id))
redis.rpush(salt_queue, "%s"%(minion_id))
Redis: shared queue and K/V store:
[root@srvdpis ~]# redis-cli get testserver.xxxxxxxxx "mainsite/55bc57cfdeaf95c3320facb6a95a3afce2475cbd"
Consumer process (started from crontab every 20'):
Events: review
The metadata as defined inside Salt
[root@saltmaster ~]# cat /srv/pillar/provisioning.sls
requisition: mainsite
opennms_categories: 'production,servers'
opennms_assetinfo: { comment: 'Server a' }
Tip: reuse this metadata in the motd →
in the motd...
How it looks like in OpenNMS...
The node page