summaryrefslogtreecommitdiffstats
path: root/scripts/fetch-ssh-keys.v2
blob: b9106b38bc87ecd24542c2c3493ed91bbafd81e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/usr/bin/python -tt
import os
import sys
import copy
import itertools

from ansible import plugins
from ansible.errors import AnsibleOptionsError
from ansible.plugins.callback import CallbackBase
from ansible.plugins.callback import default
from ansible.cli.adhoc import AdHocCLI
ALIAS_PATH = '/srv/web/infra/hosts/{hostname}/host_aliases'


class ResultAccumulator(CallbackBase):
    def __init__(self, *args, **kwargs):
        super(ResultAccumulator, self).__init__(*args, **kwargs)
        self.unreachable = set()
        self.host_status = {}
        self.sshhostkeys = {}

    def v2_runner_on_unreachable(self, result):
        self.unreachable.add(result._host.get_name())

    def v2_runner_on_ok(self, result, *args, **kwargs):
        facts = result._result['ansible_facts']
        key = "ssh-rsa {0}".format(facts['ansible_ssh_host_key_rsa_public'])

        names = [result._host.get_name()]
        ansible_fqdn = facts['ansible_fqdn']
        if ansible_fqdn not in names:
            names.append(ansible_fqdn)

        ansible_hostname = facts['ansible_hostname']
        if ansible_hostname not in names:
           if ansible_fqdn.find('.stg.') != -1 or result._host.get_name().find('.stg.') != -1:
             names.append(ansible_hostname+".stg")
           else:
             names.append(ansible_hostname)

        try:
            with open(ALIAS_PATH.format(hostname=result._host.get_name()),
                      "rb") as alias_file:
                aliases = [a.strip() for a in alias_file.readlines()]
            for alias in aliases:
                if alias not in names:
                    names.append(alias)
        except IOError:
            pass

        ipv4_addresses = facts["ansible_default_ipv4"]
        if ipv4_addresses:
         names.append(ipv4_addresses["address"])

        # ignore link local addresses
        non_link_local = facts["ansible_default_ipv6"]
        if non_link_local:
         names.append(non_link_local["address"])

        #get tunnel addresses; hardcoded to tun0
        if facts.has_key('ansible_tun0'):
         tunnel_addresses=facts["ansible_tun0"]
         names.append(tunnel_addresses['ipv4']['address'])

        self.sshhostkeys[result._host.get_name()] = {"key": key,
                                 "names": ",".join(names)}

if __name__ == '__main__':
    args = copy.copy(sys.argv)
    args.extend(['-m', 'setup'])
    cb = ResultAccumulator()
    cli = AdHocCLI(copy.copy(args), callback=cb)
    try:
        cli.parse()
    except AnsibleOptionsError:
        if len(cli.args) != 1:
            cli.args = copy.copy(args)
            cli.args.append('all')
        cli.parse()
    
    cli.run()

    for host in cb.unreachable:
        sys.stderr.write('unreachable: %s\n' % host)

    for host in sorted(cb.sshhostkeys.items()):
     print "{names} {key} {comment}".format(comment=host[0],**host[1])