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:
- déployer un nouveau Conteneur Tomcat
- déployer une application dans le conteneur, et la configurer
- configurer un serveur virtuel Apache
- 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!
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.
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
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.
jetez un coup d'oeil à Expect (man expect
)
j'ai accompli des tâches similaires dans le passé en utilisant Attendre.
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.
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.
Pour vous donner la structure, sans code.
- utilisez scp pour copier votre script d'installation/configuration dans la boîte cible.
- utilisez ssh pour invoquer votre script sur la boîte distante.
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