mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 17:33:54 +00:00
Add salt-ssh roster for the minons cache on the master
This commit is contained in:
parent
c5a8d14ada
commit
266428b069
75
salt/roster/cache.py
Normal file
75
salt/roster/cache.py
Normal 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
|
Loading…
Reference in New Issue
Block a user