Aller au contenu

Utiliser MySQL comme inventaire Ansible

logo ansible

**Parfois votre CMDB peut être stocké dans une base de données comme Mysql. C’est mon cas où un script python utilisant les résultats de la command nmap et des gather_facts d’Ansible stocke les machines dans la base mysql. **

L’inventaire dynamique classique consiste à obtenir la liste des hôtes via un script externe et à la renvoyer à la commande ansible dans le format requis.

Ici on va utiliser deux astuces qui sont :

  • la commande add_host permettant d’ajouter une machine à un groupe dynamiquement ;
  • la possibilité de définir plusieurs sections avec différents groupes cible ;

Récupération des machines stockés dans votre base mysql

La première partie du playbook est un simple appel à la commande mysql via le module shell. Vous aurez juste à modifier les champs entre < > pour utiliser ce playbook. Cette requête vient récupérer les adresses IP qui sont ensuite stockées dans une variable nommée stuff

---
- hosts: localhost
connection: local
gather_facts: no
tasks:
- name: Retrieve stuff from mysql
shell: mysql --user=<user> --password=<secret> <schema> --host=<ip> --port=<port> --batch --skip-column_names
--execute="SELECT ipaddr FROM cmdb WHERE state like 'up'"
register: stuff

Création du groupe

Toujours dans lé même section du playbook on va utiliser la commande add_host pour constituer le groupe qui sera ensuite utilisé dans la seconde section du playbook.

- name: Add host
add_host:
hostname: "{{item}}"
groups: running_hosts
with_items: "{{ stuff.stdout_lines }}"

Utilisation du groupe dans la seconde section du playbook

Maintenant il suffit juste d’ajouter une nouvelle section à votre playbook utilisant cette fois le groupe running_hosts. Ici je vais créer un fichier de facts persos (via un template jinja) qui seront récupérés par la collecte des facts si elle est activée.

Le code complet :

---
- hosts: localhost
connection: local
gather_facts: no
tasks:
- name: Retrieve stuff from mysql
shell: mysql --user=<user> --password=<secret> <schema> --host=<ip> --port=<port> --batch --skip-column_names
--execute="SELECT ipaddr FROM cmdb WHERE state like 'up'"
register: stuff
- name: Add host
add_host:
hostname: "{{item}}"
groups: running_hosts
with_items: "{{ stuff.stdout_lines }}"
- hosts: running_hosts
strategy: host_pinned
gather_facts: no
tasks:
- name: create folder
file:
path: /etc/ansible/facts.d
mode: '0644'
state: directory
- name: get install_date
shell: stat /root/install.log | grep "Modif" | tail -1 | cut -d" " -f2,3| cut -d"." -f1
register: install_date
- name: Create file
template:
src: local_fact.j2
dest: /etc/ansible/facts.d/defaults.fact

Le fichier jinja :

jinja2: trim_blocks:False
[informations]
reboot_date={% if reboot_date.stdout_lines != [] %}{{reboot_date.stdout_lines[0]}}{% else %}{% endif %}
install_date={% if install_date.stdout_lines != [] %}{{install_date.stdout_lines[0]}}{% else %}{% endif %}

Voilà vous pouvez je suis sûr que vous trouverez des use-case utilisant cette technique.

La suite de la formation ansible dans de prochains billets.