Comment puis-je automatiser l'exécution des commandes à distance via SSH à plusieurs serveurs en parallèle?
J'ai cherché un peu sur des questions similaires, mais d'autres que l'exécution d'une commande ou peut-être un peu de commande, avec des articles tels que:
ssh user@host -t sudo su -
Cependant, que faire si j'ai essentiellement besoin d'exécuter un script sur (disons) 15 serveurs à la fois. Est-ce faisable en bash? Dans un monde parfait, j'ai besoin d'éviter l'installation d'applications si possible pour tirer cette off. Pour la commodité du raisonnement, disons simplement que j'ai besoin de faire ce qui suit à travers 10 hôtes:
- Déployer un nouveau conteneur Tomcat
- Déployer une application dans le conteneur, et de le configurer
- Configurer un vhost Apache
- Recharger Apache
J'ai un script qui fait tout cela, mais il s'appuie sur me connecter à tous les serveurs, en tirant sur un script vers le bas à partir d'une mise en pension, puis de l'exécuter. Si ce n'est pas faisable en bash, quelles alternatives proposez-vous? Ai-je besoin d'un plus gros marteau, comme Perl (Python pourrait être préférée depuis que je peux garantir, Python est sur toutes les cases dans une RHEL environnement grâce à yum/up2date)? Si quelqu'un peut le point de moi de toute information utile, ça serait grandement apprécié, surtout si c'est faisable en bash. Je me contenterai pour le Perl ou Python, mais je ne sais pas aussi bien ceux (de travail). Merci!
sudo -sH
au lieu de sudo su -
.Êtes-vous plus demandant comment exécuter plusieurs lignes à distance, ou comment exécuter les lignes "en parallèle" sur plusieurs hôtes simultanément? Pour les parallèles, voir serverfault.com/a/875812/27813
OriginalL'auteur f4nt | 2008-10-28
Vous devez vous connecter pour publier un commentaire.
Souvent, je vais juste utiliser l'original Tcl version d'Attendre. Vous avez seulement besoin d'avoir que sur la machine locale. Si je suis à l'intérieur d'un programme à l'aide de Perl, je le fais avec Net::SSH::Attendre. D'autres langues sont similaires "s'attendre à" des outils.
Si vous n'perl droit, ça peut être sympa 😉
OriginalL'auteur brian d foy
Vous pouvez exécuter un script local, comme indiqué par le che et le Yang, et/ou vous pouvez utiliser un document Ici:
OriginalL'auteur Bash
La question de savoir comment exécuter des commandes sur plusieurs serveurs à la fois est venu sur un Perl liste de diffusion, l'autre jour et je vais vous donner la même recommandation J'ai donné il y, qui consiste à utiliser
gsh
:http://outflux.net/unix/software/gsh
gsh est similaire à la "
for box in box1_name box2_name box3_name
" solution déjà donné mais je trouve gsh pour être plus pratique. Vous configurez /etc/fantômes fichier contenant vos serveurs dans des groupes tels que web, db, RHEL4, x86_64, ou que ce soit (homme fantômes) puis servez-vous de ce groupe lorsque vous appelez gsh.Vous pouvez aussi combiner ou diviser fantôme groupes, à l'aide de web+db ou web-RHEL4, par exemple.
Je vais aussi mentionner que, bien que je n'ai jamais utilisé shmux, son site web contient une liste de logiciels (y compris gsh) qui vous permet d'exécuter des commandes sur plusieurs serveurs à la fois. Capistrano a déjà été mentionné, et (d'après ce que je comprends) pourrait être sur cette liste.
OriginalL'auteur Philip Durbin
Prendre un coup d'oeil à Attendre (
man expect
)J'ai accompli des tâches similaires dans le passé en utilisant Attendre.
OriginalL'auteur antik
Vous pouvez transférer le script local vers le serveur distant et de l'exécuter avec une seule commande:
Celui-ci peut être automatisée à l'aide de l'authentification par clé publique et d'emballage avec des scripts pour effectuer une exécution parallèle.
OriginalL'auteur Yang Zhao
Vous pouvez essayer paramiko. C'est un pur python client ssh. Vous pouvez programmer vos sessions ssh. Rien à installer sur des machines distantes.
Voir ce excellent article sur la façon de l'utiliser.
OriginalL'auteur Christopher Mahan
Pour vous donner la structure, sans code.
Vous pouvez utiliser un script unique de faire tout cela automatiquement. Sans avoir à vous taper toutes les commandes, dans le cas où ce n'était pas clair, f4nt
OriginalL'auteur Darron
pssh peut être intéressant, car, contrairement à la plupart des solutions mentionnées ici, les commandes sont exécutées en parallèle.
(Pour mon usage personnel, j'ai écrit un simple petit script très similaire à GavinCattell, il est documenté ici - en français).
OriginalL'auteur bortzmeyer
Avez-vous regardé des choses comme De marionnettes ou Cfengine. Ils peuvent faire ce que vous voulez, et probablement beaucoup plus.
OriginalL'auteur Keltia
Pour ceux qui par hasard sur cette question, je vais inclure une réponse qui utilise Tissu, ce qui résout exactement le problème décrit ci-dessus: Exécution de commandes arbitraires sur plusieurs hôtes sur ssh.
Une fois que le tissu est installé, vous devez créer un
fabfile.py
, et de mettre en œuvre tâches qui peut être exécuté sur vos hôtes distants. Par exemple, une tâche à Recharger Apache pourrait ressembler à ceci:Ensuite, sur votre ordinateur local, exécutez
fab reload
et lasudo /etc/init.d/apache2 reload
commande obtenir tous les hôtes spécifiés dansenv.hosts
.OriginalL'auteur Brad Montgomery
Vous pouvez le faire de la même manière que vous avez fait avant, juste le script au lieu de le faire manuellement. Le code suivant télécommandes de la machine nommée "loca" et exécute deux commandes. Ce que vous devez faire est de simplement insérer des commandes que vous souhaitez exécuter.
Alors, pour itérer sur toutes les machines, faire quelque chose comme:
Afin de faire de ce ssh chose de travailler sans entrer des mots de passe de tous les temps, vous aurez besoin pour configurer l'authentification par clé. Vous pouvez lire à ce sujet à IBM developerworks.
&
à la fin de la commande ssh et unwait
en bas et qu'ils l'avaient exécutée en parallèle 🙂OriginalL'auteur che
Vous pouvez exécuter la même commande sur plusieurs serveurs à la fois avec un outil comme cluster ssh. Le lien est une discussion de cluster ssh sur le paquet Debian du jour blog.
OriginalL'auteur David Locke
Bien, pour l'étape 1 et 2 n'est-il pas un tomcat manager l'interface web; vous pourriez script avec curl ou zsh avec le libwww brancher.
Pour SSH, vous êtes à la recherche de:
1) obtenez pas invité à entrer un mot de passe (utilisez les touches)
2) passer les commande(s) sur de SSH en ligne de commande, ce qui est similaire à
rsh
dans un réseau de confiance.D'autres postes vous ai montré de quoi faire, et je serais probablement utiliser
sh
aussi, mais je serais tenté d'utiliserperl
commessh tomcatuser@server perl -e 'do-everything-on-one-line;'
ou vous pourriez faire ceci:soit
scp the_package.tbz tomcatuser@server:the_place/.
ssh tomcatuser@server /bin/sh <<\EOF
définir des trucs comme
TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbz
oursync rsync://repository/the_package_place
mv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war
[vous n'avez pas l'habitude de redémarrer tomcat]mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart
[pourrait avoir besoin de se connecter en tant qu'utilisateur apache pour déplacer ce fichier et redémarrer]EOF
OriginalL'auteur dlamblin
Vous voulez DSH ou distribué shell, qui est utilisé dans les faisceaux beaucoup. Voici le lien: dsh
En gros, vous avez des groupes de nœuds (un fichier avec des listes de nœuds) et que vous spécifiez le nœud de groupe que vous souhaitez exécuter des commandes sur alors vous devez utiliser dsh, comme vous le feriez ssh pour exécuter des commandes sur eux.
Il doit exécuter la commande sur toutes les machines en même temps et le retour de la sortie préfixé par le nom d'hôte. La commande ou le script doit être présent sur le système, de sorte qu'un système de fichiers NFS partagé peut être utile pour ces sortes de choses.
OriginalL'auteur Steve Baker
Crée le nom d'hôte ssh commande de toutes les machines accessibles.
par Quierati
http://pastebin.com/pddEQWq2
Ex Exécuter:
OriginalL'auteur Quierati
Il existe un outil appelé FLATT (Automatisation FLexible et Dépannage de l'Outil) qui vous permet d'exécuter des scripts sur plusieurs hôtes Unix/Linux avec un clic d'un bouton. C'est un ordinateur de bureau GUI application qui fonctionne sur Mac et Windows, mais il y a aussi une ligne de commande client java.
Vous pouvez créer des jobs batch et les réutiliser sur plusieurs hôtes.
Nécessite Java 1.6 ou supérieur.
OriginalL'auteur Andy M
Bien que c'est un sujet complexe, je la recommande fortement Capistrano.
OriginalL'auteur m104
Je ne sais pas si cette méthode fonctionne pour tout ce que vous voulez, mais vous pouvez essayer quelque chose comme ceci:
Qui va exécuter le script (qui se trouve en local) sur le serveur distant.
OriginalL'auteur Jeremy Cantrell
Multixterm est cool pour ce faire, et vous permet de facilement mettre la 1 de n machine arrière dans la séquence.
OriginalL'auteur David Ritchie
Viens de lire une nouvelle blog à l'aide de setsid sans aucune autre installation/configuration, hormis le noyau officiel. Testé/Vérifié sous Ubuntu14.04.
Alors que l'auteur a une très claire explication et des exemples de code, voici la part de magie pour un rapide coup d'œil:
OriginalL'auteur user3438301
Voici un script pour faire une commande SSH sur plusieurs machines, il peut aider:
Vous pourriez même mettre ce donc, il est dans votre chemin, appeler quelque chose comme sshAll, puis il suffit de taper sshAll commande.
OriginalL'auteur GavinCattell