8c4a42a6bd6df88b09e2a4634b71c9a0042c8feb
[ansible.git] / scripts / ansible-debian-versions
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 """Outil d'extraction d'informations système sur les serveurs Debian.
4
5 Copyright ©2016  Agence universitaire de la Francophonie -- www.auf.org
6 Licence : GPL version 3
7 Auteur : Progfou <jean-christophe.andre@auf.org>
8 """
9 import sys
10 import ansible.runner
11 from time import strftime
12 import re
13
14 if len(sys.argv) != 2:
15     print "Usage : %s <nom-d-ensemble-de-machines>" % sys.argv[0]
16     sys.exit(1)
17 subset = sys.argv[1]
18
19 # constantes
20
21 URL = "http://git.auf.org/?p=ansible.git;a=blob;f=scripts/ansible-debian-versions"
22
23 VERSION = "16.03.10"
24
25 RELEASE_COLOR = {
26   "8": "00ae00", "7": "e6ff00", "6": "ff950e", "5": "ff420e",
27 }
28 DEFAULT_RELEASE_COLOR = "ff0000"
29 UNKNOWN_RELEASE_COLOR = "f0f0f0"
30
31 VIRTUAL_INDEX = {
32   "inconnu": 0,
33   "physique": 5,
34   "openvz / hôte": 10,
35   "openvz / invité": 15,
36   "kvm / hôte": 20,
37   "QEMU / invité": 23,
38   "kvm / invité": 25,
39 }
40
41 VIRTUAL_COLOR = {
42   "kvm / hôte": "00ae00", "kvm / invité": "00ae00",
43   "openvz / invité": "e6ff00",
44   "openvz / hôte": "ff950e",
45   "physique": "ff420e",
46 }
47 UNKNOWN_VIRTUAL_COLOR = "f0f0f0"
48
49 # collecte des données
50
51 pm = ansible.runner.Runner(module_name='setup', timeout=5, subset=subset)
52 out = pm.run()
53
54 # sauvegarde temporaire pour débogage
55
56 import json
57 file('/tmp/out.json', 'w').write(json.dumps(out, sort_keys=True, indent=4, separators=(',', ': ')))
58
59 # traitement des données
60
61 server_list = []
62
63 for server,data in out['contacted'].items():
64     data['name'] = server
65     facts = data['ansible_facts']
66     # famille
67     if 'ansible_os_family' in facts:
68         data['os_family'] = facts['ansible_os_family']
69     else:
70         data['os_family'] = 'inconnue'
71     # distribution
72     if 'ansible_lsb' in facts:
73         lsb_data = facts['ansible_lsb']
74         data['description'] = lsb_data['description']
75         data['major_release'] = lsb_data['major_release']
76     elif 'ansible_distribution' in facts and 'ansible_distribution_release' in facts:
77         data['description'] = "%s %s" % (facts['ansible_distribution'],
78                                     facts['ansible_distribution_release'])
79         data['major_release'] = re.split(r'[^0-9]', facts['ansible_distribution_release'])[0]
80         if not data['major_release']:
81             data['major_release'] = '0'
82     else:
83         data['description'] = 'inconnue (information non disponible)'
84         data['major_release'] = '0'
85     # virtualisation
86     if 'ansible_virtualization_type' in facts and \
87        'ansible_virtualization_role' in facts:
88         if facts['ansible_virtualization_role'] == 'guest':
89             virtual_info = '%s / invité' % facts['ansible_virtualization_type']
90         elif facts['ansible_virtualization_role'] == 'host':
91             virtual_info = '%s / hôte' % facts['ansible_virtualization_type']
92         elif facts['ansible_virtualization_role'] == 'NA':
93             virtual_info = 'physique'
94         else:
95             virtual_info = "inconnu (%s / %s)" % (
96                 facts['ansible_virtualization_type'],
97                 facts['ansible_virtualization_role'] )
98         data['virtual_info'] = virtual_info
99     elif 'ansible_processor' in facts and facts['ansible_processor'][0].startswith('QEMU'):
100         data['virtual_info'] = 'QEMU / invité'
101     else:
102         data['virtual_info'] = 'inconnu'
103     # architecture
104     if 'ansible_machine' in facts and 'ansible_userspace_bits' in facts:
105         data['architecture'] = "%s bits / %s" % (
106             facts['ansible_userspace_bits'], facts['ansible_machine'] )
107     else:
108         data['architecture'] = 'inconnue'
109     # ajout à la liste
110     server_list.append({
111         'name': data['name'],
112         'os_family': data['os_family'],
113         'description': data['description'],
114         'major_release': data['major_release'],
115         'architecture': data['architecture'],
116         'virtual_info': data['virtual_info'],
117     })
118
119 for server,data in out['dark'].items():
120     # ajout à la liste
121     server_list.append({
122         'name': server,
123         'os_family': 'inconnue',
124         'description': 'inconnue (échec de connexion)',
125         'major_release': '0',
126         'architecture': 'inconnu',
127         'virtual_info': 'inconnu',
128     })
129
130 # tri de la liste des serveurs par version de distribution croissante
131
132 def sort_key(x):
133     os_family = '0' if x['os_family'] == 'inconnue' else x['os_family']
134     virtual_index = VIRTUAL_INDEX.get(x['virtual_info'], 1)
135     reversed_name = '.'.join(reversed(x['name'].split('.')))
136     return '%s-%03d-%02d-%s' % ( os_family, int(x['major_release']),
137         virtual_index, reversed_name )
138
139 server_list.sort(key=sort_key)
140
141 # affichage du code wiki MoinMoin correspondant
142
143 print "||<rowstyle=\"background-color: #cccccc;\">'''Serveur'''||'''Version du système au %s'''||'''Architecture'''||'''Virtualisation'''||" % strftime('%Y-%m-%d')
144
145 for server in server_list:
146     # couleur pour la version
147     if server['major_release'] == '0':
148         server['release_color'] = UNKNOWN_RELEASE_COLOR
149     elif server['major_release'] in RELEASE_COLOR:
150         server['release_color'] = RELEASE_COLOR[server['major_release']]
151     else:
152         server['release_color'] = DEFAULT_RELEASE_COLOR
153     # couleur pour la virtualisation
154     if server['virtual_info'] in VIRTUAL_COLOR:
155         server['virtual_color'] = VIRTUAL_COLOR[server['virtual_info']]
156     else:
157         server['virtual_color'] = UNKNOWN_VIRTUAL_COLOR
158     if 'invité' not in server['virtual_info']:
159         server['virtual_info'] = "'''%s'''" % server['virtual_info']
160     # affichage
161     print "||<)>%(name)s||<#%(release_color)s>%(description)s||%(architecture)s||<#%(virtual_color)s>%(virtual_info)s||" % server
162
163 print "(tableau généré via le script [[%s|ansible-debian-versions]] version %s)" % (URL, VERSION)