Pour un rendu optimal, activez JavaScript

[My Ansible Journey] Collections

 ·  ☕ 5 min de lecture  ·  🩆 Jeremy

Partie 1 : Présentation et prérequis
Partie 2 : Bases et premiers Playbook
Partie 3 : Les Variables
Partie 4 : Les Collections
––

Et voici la quatriĂšme partie sur les collections, une nouvelles façon de gĂ©rer les modules, les rĂŽles et les plugin qui s’inscrit dans un changement important sur les releases d’Ansible. On regarde ça de plus prĂȘt.

Le code des exemples qui suivent sont toujours sur GitHub

Les Collections

Introduction

J’en avais rapidement parlĂ© dans un prĂ©cĂ©dent article, on va y revenir un peu plus en dĂ©tail.
Les Collections permettent de regrouper du contenu Ansible (Playbook, rĂŽles, modules, Plug-In
) dans des projets dĂ©diĂ©s. À partir de la version 2.10, le projet Ansible (appelĂ© ansible-base pour la version 2.10, et ansible-core pour la version 2.11 et les futures versions) se voit retrier une majoritĂ© de ses modules tiers qui sont donc rĂ©partis dans les Collections.

Pourquoi ce choix ? C’est assez simple, le projet Ansible devenait trop imposant. Le nombre d’issues et de PR sur le projet Github n’était plus raisonable, d’autant plus qu’ils concernaient majoritairement des modules dont la plupart Ă©taient gĂ©rĂ©s par des tiers mainteneurs. Les raison dĂ©taillĂ©es ici : https://www.ansible.com/blog/announcing-the-community-ansible-3.0.0-package

Cette nouvelle façon de faire peut apporter les avantages suivants :

  • Projet Ansible allĂ©gĂ©
  • Cycle de vie indĂ©pendant
  • Gestion des collections dĂ©lĂ©guĂ©e (du moins pour certains)

Ces changements concernent principalement les dĂ©veloppeurs, car cĂŽtĂ© utilisateur, il existe maintenant le Ansible community package ou Ansible Project qui suit une autre logique de versionning et qui intĂšgrent toutes les collections maintenues. La version actuelle de Ansible Project est 4.7.0, elle intĂšgre ansible-core 2.11 plus une version “freeze” des collections.
La version 5.0 est prévue pour fin novembre 2021.

Changements

Il existe trois types de collections :

  • Celles intĂ©grĂ©es dans le projet de base (ansible.builtin)
  • Les collections maintenues par la communautĂ© (community.)
  • Celles gĂ©rĂ©es par les Ă©diteurs (cisco, vmware etc.)

Liste exhaustive ici : https://github.com/ansible-collections

FQCN

Pour Fully Qualified Collection Name, reprĂ©sente le nom complet d’un Module, Role, Plug-in ou Playbook dans une Collection. Par exemple pour Grafana, le module qui permet de gĂ©rer les Datasource se nomme : community.grafana.grafana_datasource

Il est composé du namespace : community, de la collection : grafana et du content_name : grafana_datasource.
La liste des namespace est gérée par RedHat. Certains éditeurs ont leur namespace réservé comme Cisco ou VMware.

Note : Tous les modules qui n’ont pas encore Ă©tĂ© rĂ©partis dans des Collection et qui ne font pas partie de ansible-base se trouve dans les Collections :

  • community.general
  • community.network

Les Collections sont principalement hĂ©bergĂ©es sur GitHub, mais peuvent aussi l’ĂȘtre sur d’autres gestionnaire de code source. Ansible Galaxy a Ă©tĂ© revu pour prendre en compte les Collections et ainsi nous proposer un outil permettant de les gĂ©rer.

Mise Ă  jour depuis 2.9 : Nouveau VirtualEnv

Si vous aviez installé via pip, vous ne pourrez pas le mettre à jour directement, il faudra le déinstaller puis le réinstaller.
Si Ansible est dans un VirtualEnv (vu dans l’article sur les prĂ©requis), vous pouvez vous en crĂ©er un nouveau afin de conserver les deux versions d’Ansible (pratique pour des tests).

CrĂ©ation d’un nouveau VirtualEnv :

1
virtualenv -p /usr/bin/python3 ansible4

Activation du venv :

1
source ansible4/bin/activate

Installation Ansible 4.7.0 et jmespath (pour les filtres JSON) :

1
2
pip install ansible
pip install jmespath

En affichant la version, on affiche la version de ansible-core associée :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 (ansible210) jlg@DESKTOP-N97SPSR:~$ ansible --version
ansible [core 2.11.6] 
  config file = None
  configured module search path = ['/home/jlg/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/jlg/venv/ans/lib/python3.6/site-packages/ansible
  ansible collection location = /home/jlg/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/jlg/venv/ans/bin/ansible
  python version = 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0]
  jinja version = 3.0.2
  libyaml = True

PremiĂšre Collection

On peut vérifier que la Collection community.grafana est déjà présente :

1
ansible-galaxy collection install community.grafana

Dans un Play, on va indiquer que l’on souhaite charger cette Collection en ajoutant ceci Ă  l’en-tĂȘte :

1
2
3
4
5
6
7
8
- name: Grafana
  hosts: tig
  remote_user: jlg
  become: true
  gather_facts: false

  collections:
    - community.grafana

Installation Grafana

Avant d’installer Grafana, on ajuste le premier play pour les prĂ©requis :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
---
- name: Prerequisites
  hosts: tig
  gather_facts: yes
  remote_user: jlg
  become: true
  tasks:
    - name: Set timezone to Europe/Paris
      timezone:
        name: Europe/Paris
[...]
    - 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

Puis on ajoute un Play à notre Playbook pour l’installation de Grafana :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
- name: Grafana
  hosts: tig
  remote_user: jlg
  become: true
  gather_facts: false

  collections:
    - community.grafana

  tasks:
    - name: Install Grafana OSS
      apt:
        force_apt_get: yes
        update_cache: yes
        pkg: grafana

    - name : Start Grafana service
      service:
        name: grafana-server
        enabled: yes
        state: started

Ajout d’une Datasource

La premiĂšre Ă©tape de configuration de Grafana consiste Ă  ajouter une Datasource. C’est depuis cette source de donnĂ©es que l’on va pouvoir crĂ©er des dashboards. Une Datasource peut ĂȘtre une base de donnĂ©es relationnelle (MySQL, Postgres 
) ou encore une TSDB comme InfluxDB, ce qui est notre cas. On pourrait Ă©galement penser Ă  Prometheus pour ce cas.

Pour ajouter notre Datasource on va (enfin!) s’appuyer sur la collection Grafana. On ajoute ces tasks à la suite de l’installation :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    - name: Ensure Influxdb datasource exists
      grafana_datasource:
        name: "influxdb"
        grafana_url: "http://127.0.0.1:3000"
        grafana_user: "admin"
        grafana_password: "admin"
        org_id: "1"
        ds_type: "influxdb"
        ds_url: "http://127.0.0.1:8086"
        database: "{{ influxdb_database_name }}"
        time_interval: ">10s"

Pour le nom de la database on rĂ©utilise la variable que l’on avait dĂ©fini dans le prĂ©cĂ©dent article.

Dans Grafana on peut maintenant voir la Datasource InfluxDB qui a été ajoutée :

On va s’arrĂȘter lĂ  pour cet article, Ă  bientĂŽt pour la prochaine Ă©tape qui sera consacrĂ©e Ă  la suite de la configuration avec la crĂ©ation de Dashboard et la collection des donnĂ©es avec Telegraf !

Partagez