web-dev-qa-db-fra.com

Meilleur moyen de boucler à travers une liste de serveurs

Je fais régulièrement des choses où je me loge dans une liste de serveurs pour prendre des mesures. Par exemple:

for s in `cat servers.txt` ; do
    echo; echo $s
    ssh $s 'do something'
done

Je me demande (du point de vue du shell) s'il y a un moyen plus facile de le faire que cat servers.txt

Oui, je sais sur des outils tels que Mcollective, Capistrano, etc. - Je le fais souvent pour réparer des problèmes de Mcollective :-)

6
Sonia Hamilton

Mon rapide et sale ... où les servers.txt disposent d'une série d'hôtes ou d'IPS, une par ligne.

#!/bin/bash

SERVER_LIST=/path/to/servers.txt

while read REMOTE_SERVER
do
        ssh $REMOTE_SERVER "do_something_cool"
done < $SERVER_LIST
5
ewwhite

J'utilise clustersh .
[.____] Cela ouvre beaucoup de petites coquilles et vous pouvez taper à tous dans le même temps. Vraiment pratique lorsque vous souhaitez exécuter la même commande sur beaucoup de serveurs, mais que vous voyez toujours la sortie.
[.____] Je l'utilise comme ceci: clusterssh $(~/get-servers.sh), mais vous pouvez évidemment faire quelque chose comme clusterssh $(cat servers.txt)
[.____] Le résultat ressemble à ceci:

enter image description here

Il est également disponible en tant que package Debian.

6
Nitz

S'il vous plaît faites vous-même une faveur et utilisez quelque chose conçu pour cela. Vous savez déjà sur Mcollective, mais vous et moi-même savons que cela nécessite une infrastructure de travailler. Comme la marionnette et le chef.

clustersh , parallèle ssh et coquille de danseuse sont de petites améliorations simples sur une coquille pour boucle. Ils n'ont pas besoin de plus d'infrastructures.

Mais il y a aussi ansile , qui vous permet de faire cela, mais écrivez également des "plais de jeux" réutilisables avec plusieurs étapes. Il a besoin python installé en plus de SSHD, mais dans la pratique, je n'ai jamais eu à installer séparément cela, il a toujours été disponible.

Ansible est le seul système de gestion de la configuration que j'ai essayé qui fonctionne également comme un outil de déploiement et d'orchestration (Baskpet a besoin de Mcollective et peut-être Capistrano/Tissu pour cela, ...)

(Oui, la marionnette et le chef et tout le reste peuvent être exécutés sans serveurs centraux, mais vous devez installer des packages sur les hôtes à gérer, ce qui n'a pas besoin).

4
ptman

Pour exécuter une tâche simple sur une large gamme de serveurs sans utiliser d'outil conçu à cet effet, peu importe qu'ils nécessitent une infrastructure antérieure ou non, vous pouvez utiliser un simple script shell appelé mussh , distribué en tant que package dans de nombreuses distributions.

Vous pouvez l'appeler avec une liste d'hôtes, une liste de commandes, stocker les deux fichiers et quelques options de plus, comme ssh-agent Intégration, Support de proxy, ... chèque le manuel pour tous les détails.

Un exemple pourrait être aussi simple que:

$ mussh -H Host_list.txt -C command_list.txt
4
dawud

Voici comment utiliser Xargs pour paralléser ces sessions SSH:

cat servers.txt | xargs -IH -n1 -P0 ssh H 'some command to run'

Vous pouvez également ajouter les options -N ou -f à SSH pour rediriger le stdin de/dev/null ou mettre la session en arrière-plan. Si vous devez taper un mot de passe pour chaque hôte, cela ne vous aide pas beaucoup, mais si vous utilisez des touches SSH, cela fonctionne très bien.

3
Michael Martinez

Avez-vous envisagé d'utiliser Parallel-ssh? https://code.google.com/p/parallel-ssh/

Je suis généralement revenue à l'utilisation de celle-ci si/lorsque la configuration de la MCO ou de la marionnette est cassée. Il s'agit d'une autre dépendance à gérer, mais totalement la peine si vous avez une grande flotte de Boxen à gérer - avec le bonus supplémentaire de pouvoir choisir le nombre de machines à travailler en tandem/parallèle, voire en faisant une à la fois, comme Vous êtes habitué avec Bash.

2
Andrew

UNDLELETED ma réponse. Bien que ce ne soit pas vraiment clair ce que vous demandez.


Il existe un projet appelé parallèle ssh qui fournit des versions parallèles de SSH, SCP et RSYNC.

Ainsi, l'avantage est que vous n'avez pas besoin de faire un script shell que vous devez simplement fournir la liste des serveurs à exécuter la commande et qu'il le fera en parallèle.

C'est génial si vous avez un long ensemble de commandes SSH à faire comme il les fera tout en parallèle offrant une vitesse potentiellement importante.

par exemple.

parallel-ssh -h myhosts.txt "echo 'hello world'"
0
Matt