Linux - Exécuter la même commande sur plusieurs ordinateurs à la fois

39

J'ai environ une douzaine de machines Linux sur lesquelles j'ai parfois besoin d'exécuter les mêmes commandes. Existe-t-il un moyen plus simple (ou automatisé) de le faire en plus de se connecter à chaque ordinateur et d'exécuter la commande, un à la fois? Ce ne sont pas les mêmes commandes tout le temps et ce n'est pas à une heure prédéfinie, ce n'est donc pas idéal pour des outils comme cron.

Chris Bunch
la source
question similaire serverfault.com/questions/17931/…
hayalci
Enfin la liste canonique :)
rogerdpack

Réponses:

12

Hm, peut-être que pconsole est l'outil que vous voulez.

Nœud
la source
Wow, pconsole est assez cool! Je l'ai installé pas de problèmes et ça a l'air d'être génial jusqu'à présent. Merci!
Chris Bunch
C'est l'un de mes outils préférés aussi. :) np
Noeud
15

Il y a aussi ClusterSSH , qui, bien, fait exactement ce que vous pensez qu'il fait. Yay pour la dénomination descriptive!

Jörg W Mittag
la source
404 sur SourceForge, semble maintenant être ici sur GitHub .
Pablo Un
8

Vous devriez jeter un coup d'œil à Puppet, voici un article de linux.com sur sa configuration et son utilisation

trent
la source
1
Hmm, Puppet a l'air très intéressant. Je vais jeter un œil dessus si pconsole commence à m'échouer, car je l'ai déjà en cours d'exécution et c'est plus facile que d'apprendre le langage de Puppet. Merci pour la suggestion cependant!
Chris Bunch
Plus précisément, l'outil Marionette Collective (également appelé mcollective ou mco). C'est une partie de la marionnette qui vous permet de faire des choses sur un groupe d'hôtes, en vous basant sur les faits de la marionnette.
Brian Minton
8

Vous pouvez essayer Capistrano . À l’origine, il s’agissait d’un outil de déploiement Rails, mais il s’est développé pour faire beaucoup de choses avec des machines distantes.

Pour une approche plus complète de l'administration de plusieurs machines, essayez Chef .

rkj
la source
8

Ansible a la capacité de faire des commandes ad hoc et est également extensible pour une gestion complète de la configuration. La capacité à correspondre en fonction des groupes est excellente.

http://docs.ansible.com/intro_adhoc.html

Robert
la source
ansiblefonctionne bien avec des centaines de machines à la fois ou vous pouvez le limiter à n machines à la fois
poussins
6

Je suppose que je vais copier et coller ma réponse de Stack Overflow , ce que les gens semblaient aimer. . .


La question de savoir comment exécuter des commandes sur plusieurs serveurs à la fois est apparue sur une liste de diffusion Perl l’autre jour et je vais donner la même recommandation que celle que j’avais donnée , à savoir utiliser gsh: http://outflux.net/unix/ logiciel / gsh

gsh est similaire à la " for box in box1_name box2_name box3_name" solution déjà donnée mais je trouve que gsh est plus pratique. Vous configurez un fichier / etc / ghosts contenant vos serveurs dans des groupes tels que web, db, RHEL4, x86_64 ou autre (man ghosts), puis vous utilisez ce groupe lorsque vous appelez gsh.

[pdurbin@beamish ~]$ gsh web "cat /etc/redhat-release; uname -r"
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-2.foo.com: 2.6.9-78.0.1.ELsmp
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-3.foo.com: 2.6.9-78.0.1.ELsmp
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-4.foo.com: 2.6.18-92.1.13.el5
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-5.foo.com: 2.6.18-92.1.13.el5
[pdurbin@beamish ~]$

Vous pouvez également combiner ou séparer des groupes fantômes, en utilisant par exemple web + db ou web-RHEL4.

Je mentionnerai également que, même si je n’ai jamais utilisé shmux, son site Web contient une liste de logiciels (y compris gsh) qui vous permettent d’exécuter des commandes sur plusieurs serveurs à la fois. Capistrano a déjà été mentionné et (d'après ce que j'ai compris) pourrait également figurer sur cette liste.

Philip Durbin
la source
5

Si vous êtes sur un bureau KDE, konsole a l'option "Envoyer une entrée à toutes les sessions". Cela s'applique à toutes les sessions ouvertes dans la même fenêtre de konsole.

rgmarcha
la source
5

Vous pouvez également essayer ssh [user@]hostname [command]et parcourir en boucle les noms d’hôtes.

Jason V.
la source
2
Cela ne satisfait pas vraiment la partie "à la fois" (c'est sérialisé, pas en parallèle), mais comme cela ne semble pas être une exigence du corps de la question, cela peut aussi être une solution décente.
voretaq7
4

Regardez aussi func. Func vous permet d'utiliser une architecture de module pour contrôler différents aspects d'un système, du traitement des paquetages aux commandes en cours, etc. Il fonctionne sur un module client / serveur via SSL et dispose également d'un schéma d'authentification assez flexible.

Bâton
la source
Parallèlement à cela, Func est en cours de construction par Red Hat et son utilisation devrait être étendue dans les futurs produits Fedora / RHEL. C’est assurément une chose à surveiller, car j’espère que cela deviendra la solution standard de facto pour ce type de problème.
Christopher Cashell
4

J'ai utilisé ClusterSSH et cela fonctionne. Cependant, au-delà d'un certain nombre de terminaux, il ne s'adapte pas bien.

Je suis surpris que personne n'ait mentionné xargs. Xargs est parfait pour la plupart des choses. En fait, je suis tellement à l'aise avec ça que je n'utilise plus clusterssh.

Exemple

echo -n host1 host2 host3 host4|xargs -d" " -n1 -P30 -I+ ssh + "sudo service apache2 restart"

(Redémarrez Apache sur tous les hôtes Web.)

JDS
la source
pour les adeptes, la -P30partie signifie "exécute 30 d'entre eux en parallèle"
rogerdpack
4

Si vous êtes déjà un utilisateur de tmux, vous pouvez profiter de tmux-cssh (signifie TMUX-C(luster)-SSH). Vous lui donnez une liste de noms de serveurs et il ouvre une nouvelle fenêtre tmux avec une session SSH ouverte pour chaque serveur dans son propre volet. Toutes les frappes sont copiées dans chaque fenêtre. Selon le nombre d'hôtes, la sortie peut être difficile à lire.

shampooing aux pommes
la source
1
Un lien de doublure n'est pas forcément utile. S'il vous plaît être descriptif. Pourquoi recommandez-vous cet outil?
Deer Hunter
3

Les autres outils sont:

RunDeck peut également être décrit comme étant le ControlTier léger.

Ces outils vous fournissent non seulement un shell de cluster, mais également une interface Web et vous permettent de sauvegarder vos travaux pour une utilisation ultérieure.

Christian
la source
2

Vous pouvez également essayer Cluster SSH (cssh). Je ne l'ai pas utilisé, mais un article sur LinuxJournal.com intitulé "Gérer plusieurs serveurs efficacement" en parle.

Brad Beyenhof
la source
1

Utilisez plat , simple et très puissant! Ce script a changé ma vie :) Un script pour les gouverner tous!

http://nic-nac-project.org/~drimiks/gnu/dish.shtml

Le shell de diligence 'dish' exécute les commandes via ssh / rsh / telnet / mysql simultanément sur plusieurs systèmes. Changer de mot de passe, mettre à jour la configuration, copier des fichiers, vérifier l'état, etc. sur des centaines de nœuds est alors simple. Dish est similaire au 'dsh' (shell distribué) d'IBM mais permet en outre l'exécution à distance de commandes nécessitant une authentification. Comparé à d'autres packages open source qui incluent un shell distribué (ou des outils similaires) comme ClusterIt, le shell de danseur, le shell distribué parallèle ou C3, dish est un wrapper distant et facile à utiliser pour les cas où une solution flexible est nécessaire. Vous pouvez consulter la page de manuel du plat en ligne ici.

Guillaume
la source
1

Voici quelques exemples utilisant les commandes mentionnées dans d'autres réponses:

pdsh

Peut prendre des plages numériques, les sorties avec le nom d'hôte en premier, semblent en réalité maintenues :

version la plus simple:

pdsh -w hostname echo done

sortie:

hostname: done

Exemple plus compliqué:

pdsh -w username@hostname[7-8],username@otherhost "sleep 5 && echo done"

sortie:

hostname8: done
hostname7: done
otherhost: done

Mac: brew install pdsh

dsh

dsh -m user@host,user@host --remoteshell ssh --concurrent-shell -- "sleep 5 && echo done"

besoin du paramétrage du shell à distance sinon il utilisera "rsh" qui peut même ne pas être disponible.

Mac: brew install dsh

pssh

pssh -i -H user@host -H user@host "sleep 5 && echo done"

Ils peuvent tous également prendre une liste de machines à partir d'un fichier.

N'hésitez pas à ajouter plus d'exemples ici, c'est un wiki de communauté

Mac: brew install pssh

Cluster SSH

Le cluster SSH (la "version uniquement mac" apparemment, il existe deux versions, l'autre est ici ) ouvre en réalité de "vrais terminaux" avec un gros terminal au fond qui envoie une entrée à tous les autres. C'est donc comme une interface utilisateur qui l'envoie à plusieurs.

Ex:

csshX hostname0[1-2] hostname3 puis tapez dans la boîte rouge et il va à chaque fenêtre de terminal, une par hôte, qu'il apparaît.

mac: brew install csshx(une ancienne version mais fonctionne toujours)

il y a aussi un brew install ansibleFWIW

rogerdpack
la source