vmachines.append(machine['name'])
if vmachines:
log.info("updating host keys for %s", ' '.join(sorted(vmachines)))
- keys.do_update_keys(vmachines)
+ keys.do_update_keys(vmachines, _raise=False)
# get statuses again to refresh any updated keys
statuses = query.get_statuses(machines)
if statuses:
log = logging.getLogger(__name__)
-def do_update_keys(machines, all_=False):
+def do_update_keys(machines, all_=False, _raise=True):
reference = query.list_locks(keyed_by_name=True)
if all_:
machines = reference.keys()
- keys_dict = misc.ssh_keyscan(machines)
+ keys_dict = misc.ssh_keyscan(machines, _raise=_raise)
return push_new_keys(keys_dict, reference), keys_dict
return args
-def ssh_keyscan(hostnames):
+def ssh_keyscan(hostnames, _raise=True):
"""
Fetch the SSH public key of one or more hosts
:param hostnames: A list of hostnames, or a dict keyed by hostname
+ :param _raise: Whether to raise an exception if not all keys are retrieved
:returns: A dict keyed by hostname, with the host keys as values
"""
if isinstance(hostnames, basestring):
keys_dict = dict()
for hostname in hostnames:
with safe_while(
- sleep=1, tries=5, action="ssh_keyscan " + hostname) as proceed:
+ sleep=1,
+ tries=5 if _raise else 1,
+ _raise=_raise,
+ action="ssh_keyscan " + hostname,
+ ) as proceed:
while proceed():
key = _ssh_keyscan(hostname)
if key:
break
if len(keys_dict) != len(hostnames):
missing = set(hostnames) - set(keys_dict.keys())
- raise RuntimeError("Unable to scan these host keys: %s" % missing)
+ msg = "Unable to scan these host keys: %s" % ' '.join(missing)
+ if not _raise:
+ log.warn(msg)
+ else:
+ raise RuntimeError(msg)
return keys_dict