Utiliser MySQL comme inventaire Ansible
Publié le :
**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.