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

bit.ly/ouce2013

Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

OpenNMS, meet Configuration Management (with SaltStack) OUCE 2013 @afactotum

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?

oh yeah: it's awesome!

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:

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

META - Food for Thought

Q&A

thanks