Pour un rendu optimal, activez JavaScript

Stack TIG sur Raspeberry Pi 4

 ·  ☕ 8 min de lecture  ·  🩆 Jeremy
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.

Prérequis

  1. Avoir un Raspberry, Ă  dĂ©faut vous pouvez l’installer sur une VM Ubuntu.

  2. 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/

  3. 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

Puis on valide l’accĂšs au node:

1
ansible pi-tig -i inventory.ini -m ping -u ubuntu

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"

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.

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

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

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 !

Partagez