Les ansible variables
Je vais te montrer comment sauvegarder des variables dans un fichier et chargé ce fichier lorsque l’on souhaite accéder à ces variables.
Pour l’exemple je vais sauvegarder les vars de gather_facts, ces variables sont les informations de la machine cible, comme le hostname, l’ip, la distribution et un grand nombre de variables que je ne citerai pas, tu trouveras la liste sur la documentation du module gather_facts.
Définir ses variables
Je vais activer les variables gather_facts puis les stocker dans des variables définies :
- name: "get data information on host"
hosts: ma-machine
gather_facts: yes
vars:
hostname: "{{ ansible_hostname }}"
os: "{{ ansible_distribution }}"
ip: "{{ ansible_eth1.ipv4.address }}"
Vars: permet d’indiquer les variables à définir.
Ici j’ai donc défini les variables :
- hostname
- os
- ip
Sauvegarder ses variables dans un fichier yaml
On va maintenant créer une tâche qui va écrire dans un fichier yaml sur notre localhost nos variables :
tasks:
- name: save vars in playbook/vars/data_hosts.yml on localhost
lineinfile:
path: /etc/ansible/playbook/vars/data_hosts.yml
line: |
hostname: "{{ hostname }}"
os: "{{ os }}"
ip: "{{ ip }}"
create: yes
delegate_to: localhost
Le paramètre create: yes créée le fichier si il n’existe pas et delegate_to: localhost indique que l’action sera réalisé uniquement sur le localhost
Une fois la tâche lancé le fichier contenant nos variables sera comme tel :
hostname: "ma-machine"
os: "Debian"
ip: "172.16.16.30"
Charger nos variables
Pour charger les variables d’un fichier il suffit d’utiliser le module include_vars :
tasks:
- name: load vars in playbook/vars/data_hosts.yml
include_vars:
file: /etc/ansible/playbook/vars/data_hosts.yml
On peut alors utiliser nos variables stocké dans un fichier dans n’importe quel playbook.
Exemple d’utilisation :
Voici un playbook où je souhaitais récupérer les variables d’une machine pour ensuite les injecter dans une base de données mysql.
---
- name: "get data information on host"
hosts: '{{ host }}'
gather_facts: yes
vars:
hostname: "{{ ansible_hostname }}"
os: "{{ ansible_distribution }}"
ip: "{{ ansible_eth1.ipv4.address }}"
tasks:
- name: save vars in playbook/vars/data_hosts.yml on localhost
lineinfile:
path: /etc/ansible/playbook/vars/data_hosts.yml
line: |
hostname: "{{ hostname }}"
os: "{{ os }}"
ip: "{{ ip }}"
create: yes
delegate_to: localhost
- name: "insert value in main DB"
hosts: main-bdd
become: yes
tasks:
- name: load vars in playbook/vars/data_hosts.yml
include_vars:
file: /etc/ansible/playbook/vars/data_hosts.yml
- name: Check if hostname is in DB
community.mysql.mysql_query:
login_db: main
login_user: '{{ mysql_main_user }}'
login_password: '{{ mysql_main_password }}'
query: SELECT * FROM serveurs where hostname='{{ hostname }}'
register: check_hostname_db
- name: remove entry if hostname exist in table serveurs
community.mysql.mysql_query:
login_db: main
login_user: '{{ mysql_main_user }}'
login_password: '{{ mysql_main_password }}'
query: DELETE FROM serveurs where hostname='{{ hostname }}'
when: check_hostname_db.query_result != ""
- name: insert value hostname,os, ip in serveurs table
community.mysql.mysql_query:
login_db: main
login_user: '{{ mysql_main_user }}'
login_password: '{{ mysql_main_password }}'
query:
- INSERT INTO serveurs(hostname,os,adresse_ip) VALUES ('{{ hostname }}','{{ os }}','{{ ip }}')
- name: remove playbook/vars/data_hosts.yml
file:
path: /etc/ansible/playbook/vars/data_hosts.yml
state: absent
delegate_to: localhost
(Si vous souhaitais utiliser ce playbook il vous faudra d’abord initialiser les variables (autre que hostname, os et ip) 😉)