Comment exécuter des commandes sur plusieurs hôtes Linux à l'aide de PSSH

Je suis sûr que vous avez entendu dire que tous les enfants sympas jouent avec l'automatisation de l'orchestration ces jours-ci. Mais savez-vous pourquoi? Tout d'abord, les ressources consommées par les charges de travail de microservices modernes deviennent beaucoup plus complexes et se déploient sur bien plus d'instances que jamais. Et deuxièmement, de plus en plus de ces ressources sont virtuelles plutôt que physiques - beaucoup d'entre elles n'existeront que pendant quelques minutes, voire quelques secondes.

Tout cela signifie que même si vous vouliez vous connecter à chacun de vos nombreux serveurs, cela n'aurait tout simplement pas de sens. Dans la plupart des cas, en fait, ce ne serait même pas possible. Au lieu de cela, vous allez exécuter de nombreux scripts intelligents. Et les outils que vous utilisez pour exécuter ces types de scripts sont généralement appelés orchestrateurs.

Je suis sûr que vous avez rencontré au moins un ou deux membres du club d'orchestration. Outre Ansible, il y a Terraform, Chef, Puppet et autres. Mais il existe également des outils de niveau inférieur qui fonctionnent comme des add-ons aux outils Linux de base comme SSH. Bien que, vu comment il fonctionnera nativement sur Windows et, bien sûr, macOS, je ne suis pas sûr qu'il soit tout à fait correct d'appeler SSH un outil «Linux».

L'un de ces modules complémentaires SSH est un ensemble d'outils appelé pssh - qui signifie Parallel SSH. C'est ce que nous allons apprendre dans cet article - qui est extrait de mon nouveau cours Pluralsight, Linux System Optimization.

Pour l'instant, cependant, je vais vous parler un peu du laboratoire que j'utilise afin que vous puissiez le reproduire plus facilement et le suivre à la maison. J'ai trois conteneurs Ubuntu LXD en cours d'exécution. La base de toutes nos opérations sera celle avec une adresse IP de 10.0.3.140, tandis que les deux nœuds hôtes que nous approvisionnerons à distance utiliseront 10.0.3.93 et ​​10.0.3.43.

Tout ce que nous ferons suppose que nous avons un accès SSH sans mot de passe de mon conteneur de base à chacun des deux nœuds. Si vous ne savez pas comment faire cela, vous pouvez consulter le module SSH de mon cours Protocol Deep Dive: SSH et Telnet sur Pluralsight. Si vous êtes pressé, ce didacticiel Red Hat vous amènera au même endroit.

Installation pssh sur Ubuntu est simple et rapide: sudo apt install pssh. Cela ne devient pas plus difficile avec CentOS.

J'ai créé un simple fichier d'inventaire d'hôte appelé sshhosts.txt qui ne contient rien de plus que les adresses IP de mes deux nœuds:

$ less sshhosts.txt 10.0.3.93 10.0.3.43 

Maintenant, je vais exécuter la commande pssh parallel-ssh pour exécuter une seule commande sur mes hôtes.

$ parallel-ssh -i -h sshhosts.txt df -ht ext4 

-i indique au programme de s'exécuter comme interactif - sinon, aucune sortie de commande ne s'affichera. -h pointe vers le fichier hosts que j'ai appelé sshhosts.txt. Et la commande elle-même sera l'ancien utilitaire Unix df. Cela renverra une liste des lecteurs connectés au système avec leurs points de montage et leurs informations d'utilisation. Le -h affichera ici l'espace disque en unités lisibles par l'homme et le t limitera l'accès aux seuls lecteurs formatés comme ext4.

Pourquoi est-ce que je me soucie de cette entreprise ext4? Parce qu'Ubuntu utilise le gestionnaire de packages snap et que chaque snap crée son propre appareil virtuel. Et alors? Eh bien, je ne veux pas avoir à parcourir une douzaine de périphériques virtuels rapportant 0 espace libre juste pour accéder aux disques réels rapportant l'utilisation réelle.

$ parallel-ssh -i -h sshhosts.txt df -ht ext4 [1] 22:02:00 [SUCCESS] 10.0.3.43 Filesystem Size Used Avail Use% Mounted on /dev/sda2 457G 131G 304G 30% / [2] 22:02:00 [SUCCESS] 10.0.3.93 Filesystem Size Used Avail Use% Mounted on /dev/sda2 457G 131G 304G 30% / 

Et voilà! Informations d'espace disque complet sur mes deux nœuds. Je suis sûr que vous avez remarqué que les informations sont identiques. C'est parce que ce sont tous les deux des conteneurs fonctionnant sur mon poste de travail, donc pour autant qu'ils le sachent, ils ont tous les deux un accès complet à mon propre lecteur.

Pour ma prochaine astuce, je collecterai les fichiers / etc / group de chacun de mes nœuds. C'est le genre d'opération qui pourrait être utile pour surveiller rapidement l'état de sécurité de vos nœuds. Vous pouvez ajouter un script qui analyse les données entrantes et vous alerte en cas d'anomalies.

Avant de commencer, je vais créer un répertoire appelé localement host-files. Ensuite, j'utiliserai la parallel-slurpcommande - dont le nom décrit merveilleusement sa fonction. Là encore, -h pointe vers le fichier hosts. Le -Ldéfinit le répertoire host-files comme emplacement cible pour l'écriture des données que nous allons générer, /etc/groupest le fichier distant que nous voulons extraire et groupest le nom que nous aimerions attribuer aux données localement.

mkdir host-files parallel-slurp -h sshhosts.txt -L host-files/ /etc/group group 

Quand c'est fait, votre répertoire host-files contiendra des sous-répertoires nommés d'après l'adresse IP de chacun de vos nœuds. Comme vous pouvez le voir, il existe un fichier appelé "group" qui contient les données / etc / group de chaque nœud.

$ tree host-files/ host-files/ ├── 10.0.3.43 │   └── group └── 10.0.3.93 └── group 

Est-ce que pssh est livré avec d'autres friandises? Ouaip. Et courir aproposvous donne toute la liste.

$ apropos parallel parallel-nuke (1) - parallel process kill program parallel-rsync (1) - parallel process kill program parallel-scp (1) - parallel process kill program parallel-slurp (1) - parallel process kill program parallel-ssh (1) - parallel ssh program 

Cet article est basé sur le contenu de mon cours Pluralsight, «Optimisation du système Linux». Il y a beaucoup plus de bonté d'administration sous la forme de livres, de cours et d'articles disponibles sur bootstrap-it.com.