Bekijk Volledige Versie : Eenvoudig script om op basis van wget en een diff een config bestand te wijzigen
Beste WHTers,
Op een flink aantal servers willen wij een cronjob laten draaien met een script dat het volgende doet:
1) Haal middels wget een configfile op en schrijf weg naar tmp
2) Check of het configfile afwijkt van de huidig gebruikte config in onze software
Indien ja: overschrijf de config en herstart onze service
Indien nee: doe niets :)
Alvast bedankt! Uiteraard tegen vergoeding, geef even aan wat je voor een dergelijk script zou willen hebben. Deadline is .... vandaag :drool:
Bedankt!
systemdeveloper
13/12/13, 01:16
Stap 1: zorg dat je overal vanaf je basis server op je remote servers komt via passwordless ssh (ssh-keys dus)
Indien je een aparte ssh poort gebruikt dien je in het script bij de scp regels een parameter -P <poort> toe te voegen.
Stap 2: 'serverlist' bestand maken met al je servers
server1.domein.tld
server2.domein.tld
server3.domein.tld
Stap 3: Onderstaand scriptje runnen nadat je BASECONFIG hebt aangepast naar de naam van je basis config bestand, REMOTECONFIGPATH naar het pad waar je config bestand op de remote servers staat, REMOTECONFIGFILE naar de naam van het config bestand op je remote servers.
doit.sh:
#!/bin/sh
# je basis config die geupload moet worden indien gewijzigd
BASECONFIG=baseconfig
# het pad (zonder trailing / op de servers waar de config staat)
REMOTECONFIGPATH=/tmp
# de naam van het config bestand op de servers
REMOTECONFIGFILE=config
MD5BASE=`md5 -q ${BASECONFIG}`
while read line
do
scp -q root@${line}:/${REMOTECONFIGPATH}/${REMOTECONFIGFILE} /tmp/
MD5REMOTE=`md5 -q /tmp/${REMOTECONFIGFILE}`
if [ "x${MD5REMOTE}" = "x${MD5BASE}" ];
then
echo "${line} config unchanged"
else
echo "${line} config changed, uploading ${BASECONFIG}"
scp -q /tmp/${BASECONFIG} root@${line}:${REMOTECONFIGPATH}/${REMOTECONFIGFILE}
fi
done < serverlist
Stap 4: 25 euro geven aan de eerste de beste dakloze die je tegenkomt :)
Fantastisch! Ziet er goed uit, zo even testen. En stap 4 ga ik zeker doen ;) (!) :thumbup:
Maar, ik wil op de server ook een service herstarten na het uploaden van het bestand. Dat zie ik hier niet in terug :) Hoe dat op afstand te doen?
systemdeveloper
13/12/13, 10:59
Maar, ik wil op de server ook een service herstarten na het uploaden van het bestand. Dat zie ik hier niet in terug :) Hoe dat op afstand te doen?
Je kunt dan iets zoals:
ssh root@${line} "service xxx restart"
toevoegen direct na de laatste 'scp' regel.
Vergeet ook niet op de servers de ssh commando's te limiteren tot wat het script nodig heeft. Bij een eventuele hack geef je niet zo 123 op alle machines root access vrij.
Helaas doet het script niet helemaal wat ik wil:
1) Hij moet per server een nieuwe wget uitvoeren, en in het wget request het adres van de server (line) als parameter. Via wget genereer ik namelijk een uniek bestand per server :)
2) md5 krijg ik niet werkend op een centos server? Moet ik een andere commando gebruiken?
PS. als het helemaal werkt krijgt de eerst beste dakloze 20 euro extra :)
2) md5 krijg ik niet werkend op een centos server? Moet ik een andere commando gebruiken?
Gebruik eens "md5sum" in plaats van "md5"
systemdeveloper
16/12/13, 17:21
md5 is ind een beethe freebsdish... :)
Heb het even aangepast.
#!/bin/sh
# je basis config die geupload moet worden indien gewijzigd
BASECONFIG=baseconfig
# het pad (zonder trailing / op de servers waar de config staat)
REMOTECONFIGPATH=/tmp
# de naam van het config bestand op de servers
REMOTECONFIGFILE=config
MD5BASE=`md5sum ${BASECONFIG}|awk '{print $1}'`
while read line
do
scp -q root@${line}:/${REMOTECONFIGPATH}/${REMOTECONFIGFILE} /tmp/
MD5REMOTE=`md5sum /tmp/${REMOTECONFIGFILE}|awk '{print $1}'`
if [ "x${MD5REMOTE}" = "x${MD5BASE}" ];
then
echo "${line} config unchanged"
else
echo "${line} config changed, uploading ${BASECONFIG}"
scp -q /tmp/${BASECONFIG} root@${line}:${REMOTECONFIGPATH}/${REMOTECONFIGFILE}
fi
done < serverlist
Wat je verder bedoelt met punt 1 is me niet helemaal duidelijk. Het doet nu per server een scp aangezien je met wget geen config naar je remote servers kunt uploaden.
Wat je verder bedoelt met punt 1 is me niet helemaal duidelijk. Het doet nu per server een scp aangezien je met wget geen config naar je remote servers kunt uploaden.
Ik denk dat hij bedoeld dat het script op elke server geinstalleerd zal worden en het gedownload wordt, en er een php script (of iets dergelijks) gebruikt wordt om het ip/mac/hostname/... te herkennen en daar dan de correcte config voor te maken. Maar dat kun je natuurlijk ook met een push methode doen als je jouw script wat uitbreid met bvb een generic config met zaken als {HOSTNAME} - {IP} en dat uit een lijst laat replace.
@TS: Misschien is het handiger om naar oplossingen als puppet, chef, cfengine, ... te kijken
Ik wil per while een wget commando doen op de 'master' server. Dat bestand dient dan te worden geupload naar de server uit serverlist.
Ik wil per while een wget commando doen op de 'master' server. Dat bestand dient dan te worden geupload naar de server uit serverlist.
Zoiets dan:
#!/bin/sh
# je basis config die geupload moet worden indien gewijzigd
BASECONFIG=baseconfig
# het pad (zonder trailing / op de servers waar de config staat)
REMOTECONFIGPATH=/tmp
# de naam van het config bestand op de servers
REMOTECONFIGFILE=config
# de service die herstart moet worden
SERVICE=servicenaam
# de url om je config te grabben
URL="http://www.jouw-website.tld/config.php"
while read line; do
wget -q "${URL}?hostname=${line}" -O /tmp/${BASECONFIG}
scp -q root@${line}:/${REMOTECONFIGPATH}/${REMOTECONFIGFILE} /tmp/
MD5BASE=`md5sum /tmp/${BASECONFIG}|awk '{print $1}'`
MD5REMOTE=`md5sum /tmp/${REMOTECONFIGFILE}|awk '{print $1}'`
if [ "x${MD5REMOTE}" = "x${MD5BASE}" ]; then
echo "${line} config unchanged"
else
echo "${line} config changed, uploading ${BASECONFIG}"
scp -q /tmp/${BASECONFIG} root@${line}:${REMOTECONFIGPATH}/${REMOTECONFIGFILE}
echo "${line} restarting service"
ssh root@${line} "service ${SERVICE} restart"
fi
rm -f /tmp/${BASECONFIG}
rm -f /tmp/${REMOTECONFIGFILE}
done < serverlist
systemdeveloper
16/12/13, 18:15
Ah zo... jammer dan. Het was in elk geval een leuke oefening :)
patrickekkel
16/12/13, 19:35
Ik ben dakloos :) krijg ik nu 45 euro :P
Hij werkt echt bijna, hij leest alleen de eerste regel van serverlist uit helaas!
Ah ik zie wel dat de while werkt, alleen stopt hij de hele loop zodra hij 1 x een bestand heeft aangepast op 1 server. Zodra er niets te doen is gaat hij wel verder met de volgende server.
Iemand? Ik heb het idee dat het door SCP komt.
NB: het is na het commando:
echo "${line} restarting machine"
ssh root@${line} "reboot"
---
Ik had achter ssh root@${line} "reboot" al een '&' gezet, en dat leek iets te helpen maar nog niet helemaal.
Niemand? :(
Met die '&' werkt het per 2 machines.
Quick question, maar waarom doe je "reboot"? Je moet toch gewoon de service opnieuw opstarten en niet je volledige server, want je script hangt nu vast omdat hij wacht tot reboot uitgevoerd is. Maar hij krijgt uiteraard geen bevestiging dat het ook daadwerkelijk gedaan waardoor je script dus vast blijft hangen bij dat commando.
Indien je toch je volledige server wenst te herstarten dan moet je het even proberen met:
ssh root@${line} "reboot; exit"
systemdeveloper
29/12/13, 15:41
Of je kijkt even naar 'man shutdown' en laat hem na 5 seconden of zo rebooten.
In principe maakt het niet uit aangezien de reboot ook de ssh sessie afsluit en het script dan gewoon een error krijgt dat de verbinding weg is. Zou daarna dus gewoon verder moeten gaan, tenzij er e.e.a. veranderd is aan het scriptje.