Når man administrere flere maskiner kan det ofte være nødvendigt at scripte sig ud af nogle opgaver, og der kan være behov for at disse scripts skal logge ind på andre servere automatisk, men derudover kan du også bruge SSH nøgler til selv at logge ind med. Det er meget brugt i professionelle UNIX miljøer, primært fordi det er nemt, men sikkerheden er faktisk også højere.
Typisk vil man sætte passphrase på sin private-key hvis man bruger den interaktivt, men i det her eksempel gør vi det, netop fordi vi vil kunne bruge det i vores scripts.
Jeg er ved at skrive en artikel til DKUUG hvori vi bygger et redundant hosting setup, og derfor er jeg igang med at sætte et cluster op i mit lab. Maskinerne hedder:
* Master.lab.mikjaer.com
* Vps1.lab.mikjaer.com
* Vps2.lab.mikjaer.com
* Vps3.lab.mikjaer.com
Master serveren skal have adgang til at udføre kommandoer på vps1-vps3, derfor starter vi med at logge ind på vps1, og oprette en nøgle:
root@master:~# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): <enter> Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): <enter> Enter same passphrase again: <enter> Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: cd:2f:21:73:1f:be:25:0a:71:db:5d:4f:bf:e6:8c:bf root@vps1 The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | o | | S * . o| | * B o oo| | . o * o o| | . o +o..| | . ..+E.| +-----------------+
Nu kan root@master.lab.mikjaer.com’s hhv. offentlige og private nøgle ses i /root/.ssh
root@master:~# ls -l /root/.ssh/ total 8 -rw------- 1 root root 1679 Oct 10 12:23 id_rsa -rw-r--r-- 1 root root 391 Oct 10 12:23 id_rsa.pub
og vi skal nu have indholdet af id_rsa.pub over på de andre maskiner og lægge dem i filen /root/.ssh/authorized_keys hvormed vi giver rettighed til at personer eller maskiner der anvender “id_rsa” som nøgle, til at logge ind som root på destinationsmaskinen.
Såfremt at lab1-3 er nyinstalleret, hvilket de er i dette tilfælde, kan nøglen installeres således: (gentages selvsagt for hver vps)
root@master:~# cat /root/.ssh/id_rsa.pub | ssh root@vps3.lab.mikjaer.com mkdir /root/.ssh \&\& cat \>/root/.ssh/authorized_keys The authenticity of host 'vps3.lab.mikjaer.com (109.202.159.63)' can't be established. RSA key fingerprint is 41:26:9c:3d:3f:a6:1e:8b:e5:35:84:a0:81:47:a6:bc. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'vps3.lab.mikjaer.com,109.202.159.63' (RSA) to the list of known hosts. root@vps3.lab.mikjaer.com's password:
For at teste kan vi lige hurtigt køre:
root@master:~# ssh root@vps3.lab.mikjaer.com uptime 12:43:47 up 14 min, 0 users, load average: 0.00, 0.00, 0.00
og se at det virker 😉
Sidste skridt er nu at installere mit cluster-script på master serveren, så vi nemt kan sende den samme kommando til alle serverne i clusteret:
root@master:~# ssh root@vps3.lab.mikjaer.com uptime 12:43:47 up 14 min, 0 users, load average: 0.00, 0.00, 0.00
#!/bin/bash NODES="vps1.lab.mikjaer.com vps2.lab.mikjaer.com vps3.lab.mikjaer.com" help () { echo "Copyright (c) 2004-2012 Mikjaer ApS, released as it under the BSD License" echo "" echo Usage: ./cluster.sh do \[command\] exit -1 } docmd () { for f in $NODES do echo $f: ssh -t root@$f "${*}" done } if [ -z $1 ] ; then help fi if [ $1 = "do" ]; then docmd "${*:2}" else help fi
Scriptet er måske lidt overkill, men tilgengæld er der plads til at man kan udvide det med flere funktioner.Gem scriptet som cluster.sh og tester scriptet:
root@master:~# chmod 755 cluster.sh root@master:~# ./cluster.sh do uptime vps1.lab.mikjaer.com: 12:54:49 up 1 min, 0 users, load average: 0.00, 0.00, 0.00 vps2.lab.mikjaer.com: 12:54:49 up 1 min, 0 users, load average: 0.00, 0.00, 0.00 vps3.lab.mikjaer.com: 12:54:49 up 1 min, 0 users, load average: 0.00, 0.00, 0.00
Et andet lækker lille twist er at hvis udelukkende vi bruger den her kommando til at administrere clusteret med nu kan vi faktisk lave en retsvisende log over hvilke kommandoer der har kørt på det:
#!/bin/bash NODES="vps1.lab.mikjaer.com vps2.lab.mikjaer.com vps3.lab.mikjaer.com" help () { echo "Copyright (c) 2004-2012 Mikjaer ApS, all rights reserved" echo "" echo Usage: ./cluster.sh do \[command\] exit -1 } docmd () { for f in $NODES do echo $f: ssh -t root@$f "${*}" | tee output.tmp done echo `date` : ${*} : `cat output.tmp` >> cluster.log rm output.tmp } if [ -z $1 ] ; then help fi if [ $1 = "do" ]; then docmd "${*:2}" else help fi
Det ser sådan her ud:
root@master:~# cat cluster.log Wed Oct 10 12:59:48 UTC 2012 : uptime : 12:59:48 up 6 min, 0 users, load average: 0.00, 0.00, 0.00 Wed Oct 10 13:00:01 UTC 2012 : uptime : 13:00:01 up 6 min, 0 users, load average: 0.00, 0.00, 0.00
😉