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 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
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).
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install ansible
ansible --version
Le centre de contrôle est prêt !
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.
ssh-keygen
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.
sudo ssh-copy-id pi@192.168.0.103
eval $(ssh-agent -s)
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 !
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.
sudo mkdir ~/ansible sudo mkdir ~/ansible/RaspberryCluster
sudo vi PiTeam.inv
[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
Je vais vous explique maintenant comment fonctionne le fichier inventaire.
On a l’inventaire, on va pouvoir tester Ansible.
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.
ansible -i PiTeam.inv -m ping all
Whoua ! Et sous vos yeux ébahies, tous les Raspberry Pi répondent positivement au Ping !
Petite explication sur la commande « ansible » :
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)
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).
sudo vi install-Docker-PiTeam.yml
--- - 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
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 !
10 Comments
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.
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).
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 »]}
Salut Laudrac, non toujours pas de réponse positive pour te faire avancer (faut dire que ma réponse est un peu tardive).
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 :/
Salut Laudrac, non désolé, pas d’informations pour corriger l’erreur.
Bonjour,
Vous n’avaz pas essayé de faire un apt-get dist-upgrade ?
Bonjour Fred,
Oui c’est vrai j’aurais pu 🙂