Raspberry Cluster – S01E03 – Configurer la PiTeam avec Ansible

Raspberry Cluster - S01E03

Les Raspberry Pi de la PiTeam sont éparpillés dans tout l’univers, on va devoir utiliser un moyen de communication plus rapide que la lumière si on veut pouvoir les configurer et les piloter à distance.

Ansible pour configurer le Raspberry Cluster

Ansible est avant tout une plateforme logicielle libre créée par Michael DeHaan, rachetée en Octobre 2015 par Red Hat, permettant la gestion et la configuration de machines Linux.
Son fonctionnement est très simple, il permet à partir du protocole SSH de configurer intégralement sa/ses machine(s) Linux sans qu’il y ait d’agent à installer dessus (il suffit qu’un interpréteur Python 2.7 minimum soit installé sur la machine Linux au préalable).

Pour la petit histoire, le mot ansible a été imaginé en 1966 par Ursula K. Le Guin dans Le Monde de Rocannon. C’est dans cette épopée un dispositif théorique permettant de réaliser des communications à une vitesse supraluminique. (source Wikipédia)


Acheter Ansible en français sur Amazon

Préparation du centre de contrôle

Raspberry Cluster - S01E03 - Centre-de-contrôle

Pour pouvoir configurer les Raspberry Pi de la PiTeam, il va falloir une machine sous Linux sur laquelle on va pouvoir installer Ansible. Les possibilités sont nombreuses, on peut l’installer sur un PC ayant un OS Linux, ou faisant tourner VirtualBox, ou un Mac sous OSX, voir même un serveur.

Je vais simplement prendre mon PC tournant sous Windows 10 en version développeur intégrant le Bash Linux-Ubuntu. (voir tuto).

  • Ouvrir son terminal Ubuntu, il vous faut les droits root (si vous avez une autre distribution, il vous faudra adapter les commandes).
  • Mettez à jour la liste des fichiers disponibles dans les dépôts APT.
sudo apt-get update
  • Mettez à jour les dernières versions de tous les paquets installés sur le système.
sudo apt-get upgrade
  • Exécutez la commande d’installation d’Ansible.
sudo apt-get install ansible
  • Pour être sûr qu’Ansible fonctionne, on vérifie sa version.
ansible --version

Raspberry Cluster - S01E03 - Version Ansible

Le centre de contrôle est prêt !

Ouvrir les portes avec les clés SSH

Raspberry Cluster - S01E03 - sécurité clés SSH

Afin de pouvoir ouvrir les accès sur les Raspberry Pi de la PiTeam, il va falloir leur fournir une clé publique, mais avant toute chose il faut la créer.

  • Générez le couple clé publique et clé privée.
ssh-keygen

Raspberry Cluster - S01E03 - Clés SSH publique privée

  • Une fois cette commande, vous allez devoir fournir plusieurs informations (je vous propose de taper directement  « Entrer » pour  file in which to save the key c’est l’emplacement par défaut des clés).
  • Entrez une passphrase (un mot de passe un peu compliqué) 2 fois et c’est fini la paire de clés SSH est créée.

Maintenant, les Raspberry Pi doivent posséder la clé publique générée pour donner les droits au centre de contrôle d’ouvrir la connexion avec sa clé privée.

  • Entrez la commande ssh-copy-id suivi de l’utilisateur à autoriser avec sa clé et l’adresse du serveur [user]@[adresse] (l’adresse peut être une IP ou un nom de domaine, etc…).
sudo ssh-copy-id pi@192.168.0.103

Raspberry Cluster - S01E03 - Envoi de la cle publique

  • Vous allez répondre à la question « Are you sure you want to continue connecting« , répondre « yes » pour accepter de faire confiance à la signature de la machine cible et après entrez le mot de passe de l’utilisateur choisi de cette dernière.
  • Dernière chose, il faut maintenant ajouter la clé au SSH-AGENT pour qu’on ne soit pas obligé de rentrer constamment la passphrase.
  • Vérifiez que le ssh-agent soit bien en service.
eval $(ssh-agent -s)
  • On doit avoir une réponse de type : « Agent pid xxxxxx », après on lui rentre la clé et la passphrase quand il le demande.
ssh-add ~/.ssh/id_rsa

Je peux maintenant contrôler PiEtro-03 sans être obligé de rentrer son mot de passe utilisateur, il va falloir que je répète 5 autres fois cette commande.

Chouette la PiTeam est complètement contrôlable avec une connexion par clés SSH, maintenant que les Raspberry Pi sont partis dans l’univers, on va pouvoir avoir un œil dessus !

Faire l’inventaire des Raspberry Pi du Raspberry Cluster

Le Raspberry Cluster est constitué de 6 Raspberry Pi qui forment la PiTeam, pour qu’Ansible puisse interagir avec eux, il va falloir créer un fichier inventaire au format « ini » pour les lister.

  • Créez en premier le répertoire du projet au niveau du répertoire de votre utilisateur Linux (par défaut ~ ou /home/utilisateur).
sudo mkdir ~/ansible
sudo mkdir ~/ansible/RaspberryCluster
  •  Créer ensuite le fichier inventaire que nous allons appeler ici « PiTeam.inv ».
sudo vi PiTeam.inv
  • Nous avons utilisé vim pour créer le fichier, en appuyant sur la touche « i« , nous pouvons copier dedans les informations de notre inventaire.
[PiTeam]
PiErrik-01 ansible_host=192.168.0.101 ansible_user=pi
PiLar-02 ansible_host=192.168.0.102 ansible_user=pi
PiEtro-03 ansible_host=192.168.0.103 ansible_user=pi
PiMprenelle-04 ansible_host=192.168.0.104 ansible_user=pi
PiEl-05 ansible_host=192.168.0.105 ansible_user=pi
PiNa-06 ansible_host=192.168.0.106 ansible_user=pi
  • Faites « Echap« >> « :wq » >> « Entrer » et votre fichier est maintenant créé.

Je vais vous explique maintenant comment fonctionne le fichier inventaire.

  • [PiTeam]  : nom de notre groupe
  • PiErrik-01 : nom/label de notre Raspberry Pi (host cible)
  • ansible_host=192.168.0.101 : l’adresse de notre Raspberry Pi (host cible)
  • ansible_user=pi : l’utilisateur qui a la clé publique et les droits root de notre Raspberry Pi (par défaut sur un Raspberry Pi, c’est pi)
  • On enregistre autant de lignes qu’il y a de hosts cibles.

On a l’inventaire, on va pouvoir tester Ansible.


La PiTeam est elle accessible ?

Le premier test que nous allons faire avec Ansible, c’est de voir si tous les Raspberry Pi de la PiTeam répondent au ping.

  • Exécuter votre première commande Ansible.
ansible -i PiTeam.inv -m ping all

Raspberry Cluster - S01E03 - ansible ping

Whoua ! Et sous vos yeux ébahies, tous les Raspberry Pi répondent positivement au Ping !

Petite explication sur la commande « ansible » :

  • -i PiTeam.inv : -i pour l’invenaire et le nom de l’inventaire à utiliser.
  • -m ping : -m pour dire à ansible que nous utilisons le module ping (on reviendra plus tard sur cette notion).
  • all : car on veut tous les hosts cibles de l’inventaire.

Mayday !!! Mayday !!! PiMprenelle-04 vient de nous lâcher !!! (J’ai éteint  PiMprenelle-04 et j’ai relancé la commande, on voit qu’il est facile de suivre l’état de notre PiTeam)

Raspberry Cluster - S01E03 - ansible ping mayday


Installons Docker à l’aide d’un playbook

Dans cet épisode, nous allons simplement installer l’engine Docker sur tous les Raspberry Pi à l’aide d’un playbook. Le playbook est un peu une recette de cuisine, pour simplifier on commence par dire ce qu’il faut et après les tâches à suivre dans l’ordre de déclarations.

Nous allons commencer par un playbook simple qui va nous permettre d’installer Docker sur notre PiTeam (on fera une description complète du playbook dans un prochain numéro).

  • Créez un fichier install-Docker-PiTeam.yml
sudo vi install-Docker-PiTeam.yml
  • Collez les lignes suivantes de notre playbook.
---
- name: "Install Docker - PiTeam"
  hosts: PiTeam
  become: true
  tasks:
   - name: "install linux-image-extra"
     shell: sudo apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual
     ignore_errors: yes
   - name: "Update"
     shell: sudo apt-get update
     ignore_errors: yes
   - name: "Install dependancies"
     shell: sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
   - name: "Add Docker's official GPG key"
     shell: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
   - name: "Add Repository Docker armhf"
     shell: sudo add-apt-repository "deb [arch=armhf] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
     ignore_errors: yes
   - name: "Update"
     shell: sudo apt-get update
     ignore_errors: yes
   - name: "Install Docker"
     shell: sudo apt-get -y install docker-ce
   - name: "Running docker without using sudo"
     shell: sudo usermod -a -G docker pi
  • Lancez la commande Ansible-Playbook
ansible-playbook -b -i PiTeam.inv install-Docker-PiTeam.yml

Et voilà le travail, tous les Raspberry Pi de la PiTeam sont installés avec Docker, dans le prochain épisode, nous allons pouvoir jouer avec Docker-Swarm !

Michaël LIXON
Michaël LIXON
Ingénieur Études et Développement - Coach et formateur DevOps | Une prestation ? Prenez contact au +33 (0)4 83 28 80 40 - CELAD - Sophia-Antipolis.

10 Comments

  1. Tuxi dit :

    Bonjour,
    Quelques remarques :

    1- Pourquoi ne pas utiliser Ansible pour copier la clé SSH sur les raspberry ? (voir par exemple ce blog : https://blog.karolak.fr/post/2017-12-30-utiliser-ansible-pour-deployer-sa-cle-ssh-et-install-python/)
    En rapide, il suffit d’ajouter un « ansible_ssh_pass= » après le « ansible_user= » dans le fichier d’inventaire temporairement pour envoyer la clé SSH (en général, on supprime une fois la clé transmise et on change le pass avec un playbook).

    2- « Dernière chose, il faut maintenant ajouter les clés aux SSH-AGENT pour qu’on ne soit pas obligé rentrer constamment la passphrase. »
    Apriori, il n’y a qu’un seul SSH-AGENT et qu’une seul clé donc au singulier plutôt qu’au pluriel.

    C’est un beau projet, merci pour le partage.

    • Bonjour et merci de ton intérêt pour le projet.
      Pour répondre à tes questions, c’est vrai on peut copier les clés avec Ansible, mais cela fera partie d’un épisode plus avancé. Je voulais proposer une méthode plus courante sur Linux, car elle sert de base, mais oui on peut aussi le faire avec Ansible.
      Merci pour la correction, je vais m’en occuper dès maintenant.

  2. Hugo dit :

    Bonjour Michaël,

    Tout d’abord merci pour le tuto.

    Malheureusement, je suis sur Raspbian stretch et lorsque je lance la commande « ansible-playbook -b -i PiTeam.inv install-Docker-PiTeam.yml » j’obtiens quelques messages d’erreurs assez long et tout débute sur linux-image-extra avec un long message où je peux lire au milieu Couldn’t find any package by regex ‘linux-extra-image-4.14.70-v7’.

    J’ai passé quelques heures sur internet à chercher une solution mais rien. une idée de la cause ?

    • Bonjour @Hugo,
      Tu peux essayer d’installer ton package (regard si ton répertoire Boot n’est pas plein), sinon il faut essayer avec la même version que j’ai utilisée (sur une autre SD, une 8Go pour les test devrait faire l’affaire).

      • Laudrac dit :

        Bonjour j’ai exactement le même problème avec une 16Go de ram et un boot de 11Mo de disponible.
        Voici l’erreur que le playbook me ressort:

        {« changed »: true, « cmd »: « sudo apt-get install -y linux-image-$(uname -r) linux-image-extra-virtual », « delta »: « 0:00:01.253314 », « end »: « 2019-05-21 15:08:46.404630 », « failed »: true, « rc »: 100, « start »: « 2019-05-21 15:08:45.151316 », « stderr »: « E: Unable to locate package linux-image-4.19.42-v7\nE: Couldn’t find any package by glob ‘linux-image-4.19.42-v7’\nE: Couldn’t find any package by regex ‘linux-image-4.19.42-v7’\nE: Unable to locate package linux-image-extra-virtual », « stdout »: « Reading package lists…\nBuilding dependency tree…\nReading state information… », « stdout_lines »: [« Reading package lists… », « Building dependency tree… », « Reading state information… »], « warnings »: [« Consider using ‘become’, ‘become_method’, and ‘become_user’ rather than running sudo »]}

  3. Laudrac dit :

    bonjour j’ai exactement la même erreur :/
    voici l’erreur:

    fatal: [PiWorker]: FAILED! => {« changed »: true, « cmd »: « sudo apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual », « delta »: « 0:00:01.215356 », « end »: « 2019-05-21 20:13:28.731306 », « msg »: « non-zero return code », « rc »: 100, « start »: « 2019-05-21 20:13:27.515950 », « stderr »: « E: Impossible de trouver le paquet linux-image-extra-4.14.98-v7\nE: Couldn’t find any package by glob ‘linux-image-extra-4.14.98-v7’\nE: Impossible de trouver de paquet correspondant à l’expression rationnelle « linux-image-extra-4.14.98-v7 »\nE: Impossible de trouver le paquet linux-image-extra-virtual », « stderr_lines »: [« E: Impossible de trouver le paquet linux-image-extra-4.14.98-v7 », « E: Couldn’t find any package by glob ‘linux-image-extra-4.14.98-v7′ », « E: Impossible de trouver de paquet correspondant à l’expression rationnelle « linux-image-extra-4.14.98-v7 » », « E: Impossible de trouver le paquet linux-image-extra-virtual »], « stdout »: « Lecture des listes de paquets…\nConstruction de l’arbre des dépendances…\nLecture des informations d’état… », « stdout_lines »: [« Lecture des listes de paquets… », « Construction de l’arbre des dépendances… », « Lecture des informations d’état… »]}

    Avez-vous des pistes car en cherchant sur internet impossible de corriger cette erreur :/

  4. Fred dit :

    Bonjour,
    Vous n’avaz pas essayé de faire un apt-get dist-upgrade ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *