Add salt-ssh roster for the minons cache on the master

This commit is contained in:
Joseph Hall 2014-09-11 11:36:07 -06:00
parent c5a8d14ada
commit 266428b069

75
salt/roster/cache.py Normal file
View File

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
'''
Use the minion cache on the master to derive IP addresses based on minion ID.
Currently only contains logic to return an IPv4 address; does not handle IPv6,
or authentication (passwords, keys, etc).
It is possible to configure this roster to prefer a particular type of IP over
another. To configure the order, set the roster_order in the master config
file. The default for this is:
.. code-block:: yaml
roster_order:
- public
- private
- local
'''
# Import python libs
import os.path
import msgpack
# Import Salt libs
import salt.loader
import salt.utils
import salt.utils.cloud
import salt.utils.validate.net
from salt import syspaths
def targets(tgt, tgt_type='glob', **kwargs): # pylint: disable=W0613
'''
Return the targets from the flat yaml file, checks opts for location but
defaults to /etc/salt/roster
'''
cache = os.path.join(syspaths.CACHE_DIR, 'master', 'minions', tgt, 'data.p')
if not os.path.exists(cache):
return {}
roster_order = __opts__.get('roster_order', (
'public', 'private', 'local'
))
with salt.utils.fopen(cache, 'r') as fh_:
cache_data = msgpack.load(fh_)
ipv4 = cache_data.get('grains', {}).get('ipv4', [])
preferred_ip = extract_ipv4(roster_order, ipv4)
if preferred_ip is None:
return {}
return {
tgt: {
'host': preferred_ip,
}
}
def extract_ipv4(roster_order, ipv4):
'''
Extract the preferred IP address from the ipv4 grain
'''
for ip_type in roster_order:
for ip_ in ipv4:
if not salt.utils.validate.net.ipv4_addr(ip_):
continue
if ip_type == 'local' and ip_.startswith('127.'):
return ip_
elif ip_type == 'private' and not salt.utils.cloud.is_public_ip(ip_):
return ip_
elif ip_type == 'public' and salt.utils.cloud.is_public_ip(ip_):
return ip_
return None