wie verwalte ich 100 Linux Server?

Das ist doch mal eine neue Fragestellung. Ok, da sind also die 100 virtuellen Server. Keiner ist wie der andere, denn wir haben hier keinen Cluster wie bei Google oder Facebook.
Wie verwalte ich diese Herde von Servern nur?
Als erstes will ich sie inventarisieren. Dazu verwende ich fusioninventory und glpi. Die Beiträge dazu siehe früher...
Zur Überwachung verwende ich Zabbix, auch dazu habe ich schon einen Blog Eintrag geschrieben.
Wie mache ich Updates? Da gibt es saltstack. Mit salt kann ich einer Gruppe von Servern einen Auftrag erteilen. Es hat nur einen kleinen Nachteil: alle Server werden gleichzeitig aktiv. Wie gehe ich also vor? Ich verwende Skripts.
Hier, wie ich es anwende:
Zuerst werden die Updates geholt.

#!/usr/bin/perl
use IO::Handle;
# open file
open (LISTFILE, "ubuntu01a") or die "file not found \n";
print "get all updates for Ubuntu servers \n";
for $line (<LISTFILE>) {
  chomp($line);
  $line2 = $line . ".*";
  $fqdn = $line . ".rest-der-domain.ch\n";
  system("salt", "$line2", "cmd.run", "apt-get update", "--log-file=./$fqdn" );
  sleep(2);
print "wait 20secs for mirror to get idle\n";
STDOUT->autoflush(1);
foreach (1..20) {
  print '.';
  sleep(1);
}
   print $? . "\n";
   open(HOSTFILE, $fqdn);
   for $hostline (<HOSTFILE>){
     print $hostline;
   }
   close HOSTFILE;
}
close LISTFILE;
print "\n end of file reached. all is well.\n";

Nun werden diese angewendet:

#!/usr/bin/perl
use IO::Handle;
# open file
open (LISTFILE, "ubuntu01a") or die "file not found \n";
print "upgrading all Ubuntu servers of list02 \n";
for $line (<LISTFILE>) {
  chomp($line);
  $line2 = $line . ".*";
  $fqdn = $line . ".my-domain.ch\n";
  system("salt", "$line2", "cmd.run", "apt-get -y --force-yes dist-upgrade", "--log-file=./$fqdn" );
  sleep(2);
print "wait 20secs for server to cool down\n";
STDOUT->autoflush(1);
foreach (1..20) {
  print '.';
  sleep(1);
}
  print $? . "\n";
  open(HOSTFILE, $fqdn);
  for $hostline (<HOSTFILE>){
     print $hostline;
  }
  close HOSTFILE;
}
close LISTFILE;
print "\n end of file reached. all is well.\n";

nun starten wir die Server neu (wegen Kernel Updates)

#!/usr/bin/perl
use IO::Handle;
# open file
open (LISTFILE, "ubuntu01a") or die "file not found \n";
print "rebooting Ubuntu servers \n";
for $line (<LISTFILE>) {
  chomp($line);
  $line2 = $line . ".*";
  $fqdn = $line . ".mydomain.ch\n";
  system("salt", "$line2", "cmd.run", "reboot", "--log-file=./$fqdn" );
  sleep(2);
close LISTFILE;
#system("rm", "*.cs.technik.fhnw.ch*");
print "\n end of file reached. all is well.\n";

nun sollten wohl noch die VMware Tools nachgeführt werden (das geht noch nicht automatisch):

#!/usr/bin/perl
use IO::Handle;
# open file
open (LISTFILE, "ubuntu01a") or die "file not found \n";
print "configure vmware-tools on Ubuntu servers \n";
for $line (<LISTFILE>) {
  chomp($line);
  $line2 = $line . ".*";
  $fqdn = $line . ".mydomain.ch\n";
  system("salt", "$line2", "cmd.run", "vmware-config-tools.pl -d", "--log-file=./$fqdn" );
  sleep(2);
}
close LISTFILE;
print "\n end of file reached. all is well.\n";

So, schon fertig mit den Updates.
Wenn es nicht so geht: genau nachsehen, welche Server Fehlermeldungen liefern und dort manuell vorgehen.
Typisch sind Fehlermeldungen, wenn Konfigurationsdateien von Paketen manuell angepasst wurden.

Ok, wir räume ich denn noch auf?

#!/usr/bin/perl
use IO::Handle;
# clean up of all Ubuntu server
# open file
open (LISTFILE, "all-ubuntua") or die "file not found \n";
#print "uptime of servers \n";
for $line (<LISTFILE>) {
  chomp($line);
  $line2 = $line . ".*";
  $fqdn = $line . ".mydomain.ch\n";
  system("salt", "$line2", "cmd.run", "apt-get -f install", "--log-file=./$fqdn" );
  sleep(1);
  system("salt", "$line2", "cmd.run", "apt-get -y autoremove", "--log-file=./$fqdn" );
  sleep(1);
  system("salt", "$line2", "cmd.run", "dpkg --configure -a ", "--log-file=./$fqdn" );
  sleep(1);
  print "wait 10secs for server to cool down\n";
  STDOUT->autoflush(1);
  foreach (1..10) {
    print '.';
    sleep(1);
  }
print "\n ok, next \n";
}
close LISTFILE;
print "\n end of file reached. all is well.\n";

Nun ist aufgeräumt.
Viel Erfolg!





Kommentare

Beliebte Posts aus diesem Blog

warum bloggen?

Klimaveränderung – ein Überblick