Il y a une liste d'adresses IP dans un fichier .txt, ex .:
1.1.1.1
2.2.2.2
3.3.3.3
Derrière chaque adresse IP, il y a un serveur et sur chaque serveur, il y a un sshd fonctionnant sur le port 22. Tous les serveurs ne figurent pas dans la known_hosts
liste (sur mon PC, Ubuntu 10.04 LTS / bash).
Comment puis-je exécuter des commandes sur ces serveurs et collecter la sortie?
Idéalement, j'aimerais exécuter les commandes en parallèle sur tous les serveurs.
Je vais utiliser l'authentification par clé publique sur tous les serveurs.
Voici quelques pièges potentiels:
- Le SSH m'invite à mettre la clé SSH des serveurs donnés à mon
known_hosts
fichier. - Les commandes données peuvent renvoyer un code de sortie différent de zéro, indiquant que la sortie est potentiellement non valide. J'ai besoin de le reconnaître.
- Une connexion peut ne pas être établie avec un serveur donné, par exemple à cause d’une erreur de réseau.
- Il devrait y avoir un délai d'expiration, au cas où la commande serait exécutée plus longtemps que prévu ou si le serveur ne fonctionnait pas pendant l'exécution de la commande.
Les serveurs sont AIX / ksh (mais je pense que cela n'a pas vraiment d'importance.
ssh
scripting
parallelism
LanceBaynes
la source
la source
Réponses:
En supposant que vous ne puissiez pas installer pssh ou d’autres personnes, vous pourriez faire quelque chose comme:
la source
-o StrictHostKeyChecking=no
tromper , mais vous pouvez ajouter pour éviter cela. Cependant, il est préférable d'analyser d'abord tous les serveurs à partir d'une ligne de commande afin que les clés de l'hôte puissent être ajoutées.wait
commande récupère ces ressources, y compris le code de retour du processus (comment les processus se sont terminés). Ensuite, si plus tard dans le programme, vous mettez un autre processus, disons une compression, en arrière-plan et vous devez l’attendre, puis sans cette boucle, l’attente récupérera l’un des programmes ssh terminés, pas la compression - ce qui peut encore être en cours d'exécution. Vous obtiendrez un statut de retour sur le mauvais processus enfant. Il est bon de nettoyer après vous-même.Il existe plusieurs outils vous permettant de vous connecter à et d'exécuter des séries de commandes sur plusieurs ordinateurs à la fois. Voici un couple:
la source
Si vous utilisez plus les scripts Python que les
bash
scripts, alors Fabric est peut-être l'outil idéal.Depuis la page d'accueil de Fabric :
la source
J'utilise GNU parallèle pour cela, plus précisément vous pouvez utiliser cette recette:
Avec
your.txt
être le fichier avec l'adresse IP / les noms du serveur.la source
ssh
, mais vous avez besoin d'un moyen de vous connecter aux autres ordinateurs et ces moyens étaient moins sécurisés (commersh
). Vous ne décrivez pas ce que vous utilisez maintenant pour aller de machine en machine (telnet
?,rsh
?).Configuration très basique:
Authentifier avec nom / mot de passe n'est vraiment pas une bonne idée. Vous devez configurer une clé privée pour cela:
la source
ssh $host $command
pour chaque hôte. Essayez d’exécuter ces commandes manuellement pour savoir ce qui se passe.Je suggère Ansible.cc . C'est un gestionnaire de configuration et un répartiteur de commandes.
la source
Je pense que vous êtes à la recherche de pssh et des versions parallèles des scp, rsync, etc.
la source
J'ai construit un outil open-source appelé Overcast pour faciliter ce genre de choses.
D'abord, vous définissez vos serveurs:
Ensuite, vous pouvez exécuter plusieurs commandes et fichiers de script, séquentiellement ou parallèlement, comme suit:
la source
Le projet Hypertable a récemment ajouté un outil ssh multi-hôtes. Cet outil est construit avec libssh et établit des connexions et émet des commandes de manière asynchrone et en parallèle pour un parallélisme maximal. Voir Outil SSH multi-hôtes pour une documentation complète. Pour exécuter une commande sur un ensemble d'hôtes, vous devez l'exécuter comme suit:
Vous pouvez également spécifier un nom d'hôte ou un modèle IP, par exemple:
Il prend également en charge une
--random-start-delay <millis>
option qui retardera le début de la commande sur chaque hôte d’un intervalle de temps aléatoire compris entre 0 et<millis>
millisecondes. Cette option peut être utilisée pour éviter des problèmes de tonnerre lorsque la commande en cours d'exécution accède à une ressource centrale.la source
J'ai développé collectnode Très simple et efficace pour exécuter des tâches sur plusieurs serveurs (Windows inclus)
Comment utiliser CollectNode:
Créez la liste du serveur, avec laquelle travailler:
Exécutez CollectNode en passant la liste des services:
En option, il est possible de filtrer les résultats. Par exemple, cette commande n’affiche que le serveur sur lequel la condition est remplie.
https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/
la source
Juste un heads-up pour une très bonne question:
La meilleure solution que j'ai trouvée est, sans surprise, tmux.
Vous pouvez faire Ctrl-B: setw synchronize-panes dans tmux pour des résultats étonnants. Pour cela, vous devez avoir toutes vos connexions ssh ouvertes, dans des sous-fenêtres différentes d'une fenêtre de Tmux.
la source
Peut-être que quelque chose comme ceci fonctionne, pour exécuter la commande sur plusieurs hôtes? Supposons que tous les hôtes sont configurés dans .ssh / config pour une connexion sans mot de passe.
$ < hosts.txt xargs -I {} ssh {} command
la source
Créez un fichier / etc / sxx / hosts
peupler comme ça:
partage la clé SSH sur toutes les machines.
Installez sxx à partir du paquet:
https://github.com/ericcurtin/sxx/releases
Puis lancez la commande comme ceci:
la source
Utilisez Paramiko http://www.paramiko.org/ et le parallélisme basé sur les threads https://docs.python.org/3/library/threading.html . Le code .below permet d'exécuter plusieurs commandes sur chaque serveur en parallèle!
Remarque: répétez les instructions ci-dessus pour chaque serveur.
la source
Je pense "attendre" est ce dont vous avez besoin.
Beaucoup de gens ne savent même pas qu'il existe. C'est un programme basé sur tcl qui posera des questions et des réponses possibles en votre nom. Jetez un coup d'œil à https://wiki.tcl-lang.org/page/Expect
la source