Aller au contenu principal

Générer une CMDB avec Ansible

· 3 minutes de lecture
Stéphane ROBERT

logo ansible

Ansible collecte énormément de données des serveurs qu'il configure via ce qu'on appelle les facts. Il existe un outil qui répond au nom d'Ansible-CMDB, qui prend en charge plusieurs types de sortie (html, csv, sql, json, markdown ...), et qui donc permet d'obtenir rapidement l'état de santé de votre parc informatique. Par exemple, on peut voir quelle version d'OS, le dernier reboot, la version du kernel, la ram, le nombre de cpu, l'occupation des disques, le taux d'utilisation de la RAM, ...

Ansible CMDB

Installation d'Ansible-CMDB

Ansible-CMDB est un programme python et donc on peut l'installer comme Ansible dans une environnement virtuel avec pip.

pip install ansible-cmdb

Utilisation d'Ansible-CMDB

Il faut avant récupérer les facts et les déposer dans un répertoire. Pour cela il suffit d'utiliser le module setup avec l'option tree.

ansible -m setup --tree out/ all

Ensuite on peut générer une page html avec la commande suivante :

ansible-cmdb out/ > overview.html

Pour afficher rapidement son contenu :

python -m http.server

Si vous avez accès à un inventaire dynamique comme celui de zabbix vous pouvez rapidement avoir un état de votre parc.

Customisation

Il est possible de modifier les templates existant. Il suffit de copier un existant depuis la source et d'y apporter vos modifications. Par exemple, si vous utiliser un environnement virtuel généré avec pyenv :

cp ~/.pyenv/versions/3.9.7/envs/ansible/lib/python3.9/site-packages/ansiblecmdb/data/tpl/html_fancy.tpl .
cp ~/.pyenv/versions/3.9.7/envs/ansible/lib/python3.9/site-packages/ansiblecmdb/data/tpl/html_fancy_defs.html mytemplate

Il faut éditer le fichier html_fancy_defs.html pour y ajouter une colonne par exemple contenant le uptime. Cela se fait en deux opérations :

Ajouter une colonne :

    {"title": "Product Serial","id": "prodserial",    "func": col_prodserial,     "sType": "string", "visible": False},
{"title": "Uptime", "id": "uptime", "func": col_uptime, "sType": "string", "visible": True},

On peut donc modifier l'état d'affichage par défaut en modifiant cette valeur à True ou False.

Ensuite, il faut ajouter la définition de la fonction "func": col_uptime :

<%def name="col_uptime(host, **kwargs)">
<%
def ConvertSectoDay(n):
weeks = n // (7 * 24 * 3600 )
n = n % (7 * 24 * 3600)
days = n // (24 * 3600)
n = n % (24 * 3600)
hours = n // 3600
n %= 3600
minutes = n // 60
n %= 60
seconds = n

return("%d Weeks, %d Days" % (weeks, days))

num_uptime = int(jsonxs(host, 'ansible_facts.ansible_uptime_seconds', default=0))
sort_uptime = "{0:012d}".format(num_uptime)
uptime = ConvertSectoDay(int(jsonxs(host, 'ansible_facts.ansible_uptime_seconds', default=0)))
%>
<span style="display:none">${sort_uptime}</span>
<span>${uptime}</span>
</%def>

Ici on prend la fact ansible_facts.ansible_uptime_seconds que l'on convertit en jours/heure.

On peut ensuite utiliser ce template avec l'option -t :

ansible-cmdb -t ./html_fancy -p host_details=0,skip_empty=1 -c name,main_ip,os,kernel,vcpus,ram,uptime,mem_usage,swap_usage,disk_usage out/ >overview.html

J'utilise aussi les options :

  • -c qui permet de filtrer les colonnes à afficher
  • -p qui permet de modifier le comportement d'ansible-cmdb :
    • host_details= 0|1 : affiche ou pas le détail complet des hosts
    • skip_empty= 0|1 : si on inclue les hosts qui étaient inaccessible

Conclusion

Ce programme peut rapidement permettre de se créer un outil agent-less de monitoring de votre parc, ou de patch management en ajoutant des customs facts sur vos machines.

Plus d'infos