Dashboard qui sera déployé :
Avec le confinement de 3 mois, beaucoup d’entre nous on trouvĂ© d’avantage de temps durant les week-end pour travailler sur des projets qui avaient Ă©tĂ© mis de cĂŽtĂ©, et c’est mon cas, notamment avec ces Raspberry qui me font de l’oeil depuis un moment !
J’ai donc pensĂ© Ă cumuler plusieurs projets sur lesquels je voulais m’investir, Ă savoir :
Continuer de travailler sur Ansible
Installer le TIG Stack sur un Raspberry
Utiliser le plug-in CSV pour Telegraf
Explorer les nouveautés de la version 7.0 de Grafana
Visualiser les donnĂ©es liĂ©es Ă l’Ă©pidĂ©mie de Covid-19 fournies par le gouvernement Français
Faire quelque chose de mes deux Raspberry Pi 4 :)
Vous avez compris l’idĂ©e : je vais dĂ©crire dans cet article un Playbook Ansible pour dĂ©ployer le Stack TIG permettant de visualiser les donnĂ©es du Covid19 en France, le tout sur un Raspberry Pi 4. Les donnĂ©es proviennent de fichiers CSV disponibles ici : https://www.data.gouv.fr/fr/datasets/donnees-hospitalieres-relatives-a-lepidemie-de-covid-19/ .
Elles sont traitĂ©es avec Telegraf pour ĂȘtre ensuite enregistrĂ©es en base de donnĂ©es sur InfluxDB . Enfin, elles sont visualisĂ©es via des dashboards crĂ©Ă©s avec Grafana .
Cet article n’a pas pour vocation d’expliquer l’utilisation dĂ©taillĂ©e de Ansible. Mais je pense que c’est un bon exemple pour poursuivre ma sĂ©rie dĂ©marrĂ©e sur le sujet. Donc pour ceux qui se sentent un peu perdu avec ce qui va suivre, pas de panique, on aura l’occasion d’y revenir en dĂ©tail dans un prochain article.
Prérequis
Avoir un Raspberry, Ă dĂ©faut vous pouvez l’installer sur une VM Ubuntu.
Je pars du principe que vous avez un environement permettant l’exĂ©cution de Playbook Ansible. Si ce n’est pas le cas, vous pouvez suivre les Ă©tapes de cet article : https://plop.bzh/fr/ansible/ansible-wsl-01/
Ce sera plus simple si vous copiez votre clé SSH :
1
ssh-copy-id ubuntu@192.168.0.18
Actuellement j’utilise Ansible 2.9.9 dans un VirtualEnv (voir https://plop.bzh/fr/ansible/ansible-wsl-01/#virtualenv ):
1
2
3
4
5
6
7
( ansible) jlg@DESKTOP-N97SPSR:~/ansible/ansible-pi-tig$ ansible --version
ansible 2.9.9
config file = None
configured module search path = [ '/home/jlg/.ansible/plugins/modules' , '/usr/share/ansible/plugins/modules' ]
ansible python module location = /home/jlg/venv/ansible/lib/python3.6/site-packages/ansible
executable location = /home/jlg/venv/ansible/bin/ansible
python version = 3.6.9 ( default, Apr 18 2020, 01:56:04) [ GCC 8.4.0]
Fichiers du projet
Tous les fichiers sont disponibles sur GitHub .
Structure du projet
Voici les fichiers/dossiers que l’on va retrouver dans le projet :
1
2
3
4
5
6
7
8
9
10
| group_vars\
| | all.yml
| files\
| | dashboard-covid19-FR.sjon
| | donnees-hospitalieres-covid19-2020-06-14-19h00.csv
| | telegraf.conf
| templates\
| | dashboards.yml.j2
| inventory.ini
| playbook.yml
Inventaire
Fichier inventaire:
1
pi-tig ansible_host = 192.168.1.21
J’ai pris l’habitude de ne jamais utiliser/modifier le fichier d’inventaire par dĂ©faut d’Ansible, Ă savoir le fichier /etc/ansible/hosts . C’est une bonne pratique. On pourrait utiliser un fichier hosts dans le rĂ©pertoire du projet, mais lĂ encore je prĂ©fĂšre utiliser un fichier qui ne sera pas appeler par dĂ©faut lors de l’exĂ©cution d’un Playbook afin d’Ă©viter les mauvaise surprises.
Puis on valide l’accĂšs au node:
1
ansible pi-tig -i inventory.ini -m ping -u ubuntu
ubuntu est le user par dĂ©faut crĂ©Ă© pour l’image Ubuntu sur Rapsberry-Pi. Si vous avez choisi de l’installer sur x86, indiquez le user dĂ©fini lors de l’installation.
RĂ©sultat attendu:
pi-tig | SUCCESS => {
"changed": false,
"ping": "pong"
}
Variables
Dans l’optique d’avoir un projet le plus simple et lisible, toutes les variables sont stockĂ©es dans le fichier groups_vars\all.yml . Elles seront donc importĂ©es automatiquement lors de l’exĂ©cution du Playbook.
1
2
3
4
5
influxdb_dbname : covid19
grafana_datasource : "{{ influxdb_dbname }}"
grafana_dashboards :
- "dashboard-covid19-FR.json"
TrĂšs peu de variables dans ce projet. On aurait pu en utiliser d’avantage. Cela peu d’ailleurs ĂȘtre un bon exercice si vous dĂ©butez avec Ansible, d’essayer de variabiliser un peu plus le Playbook.
Playbook
Plusieurs possiblitĂ©s (comme souvent avec Ansible) pour la structure du Playbook. Pour plus de clartĂ© j’ai optĂ© pour un seul Playbook, lui-mĂȘme composĂ© de 4 Play diffĂ©rents. Deux autres options possibles:
Un seul Play: envisageable car j’installe tous les composants sur le mĂȘme noeud, avec le mĂȘme user et je n’utilise qu’un fichier de variable.
Le fichier serait moins lisible, et cela offrirait moins de souplesse pour la réutilisabilité.
Utilisation de rÎle: création de trois rÎles pour Grafana, InfluxDB et Telegraf
Cela rendrait la structure du projet un peu trop complexe au vu de la simplicité des actions à réaliser pour ce projet.
On aura l’occasion de voir l’utilisation des rĂŽles avec TIG dans un prochain article, pas de panique đ
Prérequis
Création du Playbook et du premier Play :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
- name : Prerequisites
hosts : pi-tig
remote_user : ubuntu
become : true
tasks :
- name : Set timezone to Europe/Paris
timezone :
name : Europe/Paris
- name : Add InfluxData Apt key
apt_key :
url : https://repos.influxdata.com/influxdb.key
state : present
- name : Add stable InfluxData Apt repository
apt_repository :
# repo: "deb https://repos.influxdata.com/{{ ansible_facts['distribution']|lower }} {{ ansible_facts['distribution_release'] }} stable"
repo : "deb https://repos.influxdata.com/{{ ansible_facts['distribution']|lower }} bionic stable"
state : present
- name : Add Grafana Apt key
apt_key :
url : https://packages.grafana.com/gpg.key
state : present
- name : Add Grafana stable Apt repository
apt_repository :
repo : deb https://packages.grafana.com/oss/deb stable main
state : present
Tout l’intĂ©rĂȘt d’Ansible c’est que je n’ai pas vraiment besoin de vous expliquer ce que les tasks rĂ©alisent đ
L’installation d’InfluxDB, Telegraf et Grafana se fera depuis les repos des Ă©diteurs respectifs. J’ai intĂ©grĂ© l’ajout des repos dans ce premier Play car InfluxDB et Telegraf viennent du mĂȘme Ă©diteur (InfluxData) et que je ne voulais pas avoir deux fois la mĂȘme tĂąche dans leur Play respectif.
Au moment oĂč je rĂ©dige l’article, InfluxData ne fournit pas de version d’InfluxDB dans ces repos pour la version 20.04 (Focal Fossa) d’Ubuntu, je fais donc pointer le repo sur la version prĂ©cĂ©dent. J’ai laissĂ© en commentaire (ligne 18) la mĂ©thode pour rĂ©cupĂ©rer directement la version de votre OS via les Ansible Facts .
InfluxDB
Installation, dĂ©marrage et activation du service d'InfluxDB ; puis je vĂ©rifie la prĂ©sence de la database, si elle n’est pas prĂ©sente je la crĂ©e:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
- name : InfluxDB
hosts : pi-tig
remote_user : ubuntu
become : true
gather_facts : false
tasks :
- name : Install InfluxDB
apt :
update_cache : yes
pkg : influxdb
- name : Service started and enabled
service :
name : influxdb
enabled : yes
state : started
- name : Wait influxdb service to be ready
wait_for :
timeout : 20
- name : Check database presence
uri :
url : "http://127.0.0.1:8086/query"
method : POST
body : 'q=SHOW DATABASES'
register : response
- name : Create database
uri :
url : "http://127.0.0.1:8086/query"
method : POST
body : 'q=CREATE DATABASE "{{ influxdb_dbname }}"'
register : response
changed_when : response.status == 200
when : "influxdb_dbname not in response.json | json_query('results[0].series[0].values[*][0]')"
Je n’utilise pas les modules Influxdb d’Ansible car il ne semble plus vraiment mis Ă jour, la derniĂšre version d’InfluxDB supportĂ©e Ă©tant la 1.2.4 et on est en 1.8 ! De plus, le fait de passer par les API ne nĂ©cessite aucun prĂ©requis Ă installer.
Telegraf
Installation de Telegraf avec démarrage des services:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
- name : Telegraf
hosts : pi-tig
remote_user : ubuntu
become : true
gather_facts : false
tasks :
- name : Install Telegraf
apt :
update_cache : yes
pkg : telegraf
- name : Service started and enabled
service :
name : telegraf
enabled : yes
state : started
- name : Copy the telegraf configuration file
copy :
src : "files/telegraf.conf"
dest : "/etc/telegraf/telegraf.conf"
mode : 0644
force : yes
notify : restart telegraf
- name : Copy covid19 data CSV file
copy :
src : "{{ item}}"
dest : "/tmp/covid19.csv"
mode : 0644
force : yes
with_fileglob :
- "files/donnees-hospitalieres-covid19-*.csv"
notify : restart telegraf
handlers :
- name : restart telegraf
service :
name : telegraf
state : restarted
Ici on intĂšgre directement le fichier de configuration de Telegraf qui contient la partie traitement des donnĂ©es CSV, ainsi que le fichier de donnĂ©es lui-mĂȘme.
Vous pouvez remplacer le fichier de données par une version plus récente. Le Playbook utilise with_fileglob pour faire matcher un fichier source.
Une fois que Telegraf a intĂ©grĂ© les donnĂ©es, le service peut ĂȘtre arrĂȘtĂ© et dĂ©sactivĂ©. Sinon il rĂ©integrera les donnĂ©es toutes les 5min (pratique pour les mises Ă jour).
Grafana
Pour finir on installe Grafana et on importe le Dashboard:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
- name : Grafana
hosts : pi-tig
remote_user : ubuntu
become : true
gather_facts : false
tasks :
- name : Install Grafana
apt :
force_apt_get : yes
update_cache : yes
pkg : grafana
- name : Grafana started and enabled
service :
name : grafana-server
enabled : yes
state : started
- name : Wait grafana-server service to be ready
wait_for :
timeout : 15
- name : Check datasource presence
uri :
url : "http://127.0.0.1:3000/api/datasources"
method : GET
force_basic_auth : true
user : admin
password : admin
register : response
- name : Create datasource
uri :
url : "http://127.0.0.1:3000/api/datasources"
method : POST
force_basic_auth : true
user : admin
password : admin
body_format : form-urlencoded
body :
name : "{{ grafana_datasource }}"
type : "influxdb"
url : "http://127.0.0.1:8086"
access : "proxy"
basicAuth : "false"
database : "{{ influxdb_dbname }}"
when :
- "grafana_datasource not in response.json | json_query('[*].name')"
- name : Transfer dashboard provisioning configuration file
template :
dest : "/etc/grafana/provisioning/dashboards/dashboards.yml"
src : "dashboards.yml.j2"
mode : 0644
force : yes
notify : restart grafana
- name : Create a dashboard directory
file :
path : "/var/lib/grafana/dashboards"
state : directory
mode : '0755'
- name : Transfer dashboard JSON files
template :
dest : "/var/lib/grafana/dashboards/{{ item }}"
src : "files/{{ item }}"
mode : 0644
force : yes
loop : "{{ grafana_dashboards }}"
notify : restart grafana
- name : Set the correct datasource name in the dashboard
replace :
dest : "/var/lib/grafana/dashboards/{{ item }}"
regexp : '"(?:\${)?DS_[A-Z0-9_-]+(?:})?"'
replace : '"{{ grafana_datasource }}"'
changed_when : false
loop : "{{ grafana_dashboards }}"
notify : restart grafana
handlers :
- name : restart grafana
service :
name : grafana-server
state : restarted
Pour les mĂȘmes raisons qu’avec InfluxDB, on utilise plutĂŽt les Rest API en direct plutĂŽt que le module Ansible pour Grafana.
Exécution du Playbook
Récupération des sources:
1
git clone https://github.com/plop-bzh/ansible-tig-on-rpi
Puis lancement du Playbook:
1
ansible-playbook playbook.yml -i inventory.ini -K
Si vous n’avez pas copiĂ© votre clĂ© SSH, il faudra Ă©galement fournir un mot de passe pour se connecter avec l’utilisateur ubuntu :
1
ansible-playbook playbook.yml -i inventory.ini -K -k
-k va vous demander le mot de passe pour le compte ubuntu , puis -K pour sudo .
On accÚde au serveur: http://IPRASPBERRYPI:3000/d/SQfyoqqZz/covid19-france-hospital-statistics?orgId=1 , avec les identifiants par défaut admin/admin .
Conclusion
C’est une bonne base de dĂ©part pour Ă©voquer la Stack TIG ainsi qu’une mise en pratique d’Ansible.
J’espĂšre que ça aidera certain d’entre vous !