Comment puis-je automatiser l'exécution de commandes à distance sur SSH vers plusieurs serveurs en parallèle?

j'ai cherché un peu partout pour des questions similaires, mais à part exécuter une commande ou peut-être quelques commandes avec des éléments tels que:

ssh user@host -t sudo su -

par contre, si j'ai essentiellement besoin d'exécuter un script sur (disons) 15 serveurs à la fois. Est-ce faisable à bash? Dans un monde parfait, je dois éviter d'installer des applications si possible pour réussir. Pour le bien de l'argument, disons simplement que j'ai besoin de faire ce qui suit à travers 10 hosts:

  1. déployer un nouveau Conteneur Tomcat
  2. déployer une application dans le conteneur, et la configurer
  3. configurer un serveur virtuel Apache
  4. Recharger Apache

j'ai un script qui fait tout cela, mais il s'appuie sur moi me connectant à tous les serveurs, tirant un script vers le bas à partir d'un repo, et l'exécutant ensuite. Si ce n'est pas faisable à bash, quelles alternatives suggérez-vous? Est-ce que j'ai besoin d'un plus gros marteau, comme Perl (Python pourrait être préféré puisque je peux garantir que Python est sur toutes les boîtes dans un environnement RHEL grâce à yum / up2date)? Si quelqu'un peut me donner des informations utiles, ce serait très apprécié, surtout si c'est faisable à bash. Je me contenterai de Perl ou Python, mais je ne les connais pas aussi bien (je travaille là-dessus). Merci!

17
demandé sur rogerdpack 2008-10-28 18:30:10

21 réponses

souvent, je vais juste utiliser la version originale Tcl de Expectate. Il suffit d'avoir ça sur la machine locale. Si je suis dans un programme utilisant Perl, je le fais avec Net::SSH::Attendez-vous à. D'autres langues ont des outils "d'attente" similaires.

8
répondu brian d foy 2008-10-28 16:19:07

Vous pouvez exécuter un script local comme montré par che et Yang, et / ou vous pouvez utiliser un document ici:

ssh root@server /bin/sh <<\EOF  
wget http://server/warfile    # Could use NFS here  
cp app.war /location  
command 1  
command 2  
/etc/init.d/httpd restart  
EOF 
11
répondu Bash 2008-10-28 16:16:33

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 I give there, qui est d'utiliser gsh:

http://outflux.net/unix/software/gsh

gsh est similaire au "for box in box1_name box2_name box3_name solution déjà donné mais je trouve que gsh est plus commode. Vous configurez un fichier/etc / ghosts contenant vos serveurs dans des groupes tels que web, db, RHEL4, x86_64, ou peu importe (fantômes de man) alors vous utilisez ce groupe quand 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 diviser des groupes fantômes, en utilisant web+db ou web-RHEL4, par exemple.

je mentionnerai aussi 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 la liste bien.

8
répondu Philip Durbin 2017-09-26 16:40:11

jetez un coup d'oeil à Expect (man expect)

j'ai accompli des tâches similaires dans le passé en utilisant Attendre.

6
répondu antik 2008-10-28 15:47:56

Vous pouvez pipe le script local au serveur distant et l'exécuter avec une commande:

ssh -t user@host 'sh' < path_to_script

ceci peut être encore plus automatisé en utilisant l'authentification par clé publique et en enveloppant avec des scripts pour effectuer l'exécution parallèle.

4
répondu Yang Zhao 2008-10-28 15:52:47

Vous pouvez essayer paramiko. C'est un client SSH pur-python. Vous pouvez programmer vos sessions ssh. Rien à installer sur les machines distantes.

Voir le excellent article sur la façon de l'utiliser.

4
répondu Christopher Mahan 2009-11-09 08:57:27

Pour vous donner la structure, sans code.

  1. utilisez scp pour copier votre script d'installation/configuration dans la boîte cible.
  2. utilisez ssh pour invoquer votre script sur la boîte distante.
3
répondu Darron 2008-10-28 15:33:34

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 petit script plus simple très similaire à celui de GavinCattell, il est documentée ici - en français