Central styring af flere maskiner i et cluster (SSH Pubkey’s + Bash Script)

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

😉

Dette indlæg blev udgivet i Knowledge Base, Linux, Old Base. Bogmærk permalinket.

Skriv et svar