Ein Beispiel Python „Skript“, die verschiedene Dienste auf mehreren Remote-Servern verwaltet:
Was für ein gehackt zusammen Skript folgt, die verwendet werden können, verschiedene Dienste auf Servern zu verwalten, die Sie den SSH-Zugriff haben.
Sie möchten idealerweise einen ssh-agent ausführen lassen oder Ihre Passphrase oft eingeben.
Für Befehle, die erhöhte Rechte auf dem Remotecomputer erfordern, können Sie sehen, dass "sudo" aufgerufen wird. Dies bedeutet, dass Sie benötigen, um Ihre sudoers zu ändern, auf jedem Remote-Computer-Datei, und fügen Sie Einträge wie folgt aus (vorausgesetzt, Ihr Benutzername == deploy
):
Defaults:deploy !requiretty
Defaults:deploy !authenticate
deploy ALL=\
/sbin/service httpd status,\
/sbin/service httpd configtest,\
/sbin/service httpd graceful
Die ersten beiden Zeilen ermöglichen dem Benutzer deploy
sudo
ohne laufen zu tty oder wiederholen Sie das Passwort - was bedeutet, dass es ohne weitere Eingabe direkt über ssh ausgeführt werden kann. Hier ist ein Beispiel Python Befehl Vorteil sudo
auf einem Remote zu nehmen:
CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful'))
Wie auch immer, dies ist nicht eine „gerade“ Antwort auf Ihre Frage, sondern eine Darstellung, wie einfach Sie Python und ein paar verwenden können anderer Techniken, um ein Systemmanagement-Tool zu erstellen, das zu 100% auf Ihre spezifischen Bedürfnisse zugeschnitten ist.
Übrigens sagt das folgende Skript "deutlich und deutlich", wenn einer der Befehle einen Exit-Status> 0 zurückgegeben hat, so dass Sie die Ausgabe selbst analysieren können.
Dies wurde zusammengehackt, als ein Projekt, mit dem ich arbeitete, mit einem Load Balancer gestartet wurde und es nicht mehr notwendig war, alle Befehle auf jedem Server auszuführen. Sie können dies ändern oder erweitern, um mit rsync zu arbeiten, um Dateien zu verteilen, oder sogar Updates für die Skripte, die Sie auf den fernen Servern hosten, um die Arbeit zu erledigen.
#!/usr/bin/python
from optparse import OptionParser
import subprocess
import sys
def die(sMessage):
print
print sMessage
print
sys.exit(2)
###################################################################################################
# Settings
# The [email protected]: for the SourceURLs (NO TRAILING SLASH)
RemoteUsers = [
"[email protected]",
"[email protected]",
]
###################################################################################################
# Global Variables
# optparse.Parser instance
Parser = None
# optparse.Values instance full of command line options
Opt = None
# List of command line arguments
Arg = None
###################################################################################################
Parser = OptionParser(usage="%prog [options] [Command[, Subcommand]]")
Parser.add_option("--interactive",
dest = "Interactive",
action = "store_true",
default = False,
help = "Ask before doing each operation."
)
# Parse command line
Opt, Arg = Parser.parse_args()
def HelpAndExit():
print "This command is used to run commands on the application servers."
print
print "Usage:"
print " deploy-control [--interactive] Command"
print
print "Options:"
print " --interactive :: will ask before executing each operation"
print
print "Servers:"
for s in RemoteUsers: print " " + s
print
print "Web Server Commands:"
print " deploy-control httpd status"
print " deploy-control httpd configtest"
print " deploy-control httpd graceful"
print " deploy-control loadbalancer in"
print " deploy-control loadbalancer out"
print
print "App Server Commands:"
print " deploy-control 6x6server status"
print " deploy-control 6x6server stop"
print " deploy-control 6x6server start"
print " deploy-control 6x6server status"
print " deploy-control wb4server stop"
print " deploy-control wb4server start"
print " deploy-control wb4server restart"
print " deploy-control wb4server restart"
print
print "System Commands:"
print " deploy-control disk usage"
print " deploy-control uptime"
print
sys.exit(2)
def YesNo(sPrompt):
while True:
s = raw_input(sPrompt)
if s in ('y', 'yes'):
return True
elif s in ('n', 'no'):
return False
else:
print "Invalid input!"
# Implicitly verified below in if/else
Command = tuple(Arg)
if Command in (('help',),()):
HelpAndExit()
ResultList = []
###################################################################################################
for UH in RemoteUsers:
print "-"*80
print "Running %s command on: %s" % (Command, UH)
if Opt.Interactive and not YesNo("Do you want to run this command? "):
print "Skipping!"
print
continue
#----------------------------------------------------------------------------------------------
if Command == ('httpd', 'configtest'):
CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd configtest'))
#----------------------------------------------------------------------------------------------
elif Command == ('httpd', 'graceful'):
CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful'))
#----------------------------------------------------------------------------------------------
elif Command == ('httpd', 'status'):
CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd status'))
#----------------------------------------------------------------------------------------------
elif Command == ('loadbalancer', 'in'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/loadbalancer-in'))
#----------------------------------------------------------------------------------------------
elif Command == ('loadbalancer', 'out'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/loadbalancer-out'))
#----------------------------------------------------------------------------------------------
elif Command == ('disk', 'usage'):
CommandResult = subprocess.call(('ssh', UH, 'df -h'))
#----------------------------------------------------------------------------------------------
elif Command == ('uptime',):
CommandResult = subprocess.call(('ssh', UH, 'uptime'))
#----------------------------------------------------------------------------------------------
elif Command == ('6x6server', 'status'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/6x6server-status'))
if CommandResult > 0:
print "Servers not running!!!"
#----------------------------------------------------------------------------------------------
elif Command == ('6x6server', 'stop'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/6x6server-stop'))
#----------------------------------------------------------------------------------------------
elif Command == ('6x6server', 'start'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/6x6server-start'))
#----------------------------------------------------------------------------------------------
elif Command == ('6x6server', 'restart'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/6x6server-restart'))
#----------------------------------------------------------------------------------------------
elif Command == ('wb4server', 'status'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/wb4server-status'))
if CommandResult > 0:
print "Servers not running!!!"
#----------------------------------------------------------------------------------------------
elif Command == ('wb4server', 'stop'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/wb4server-stop'))
#----------------------------------------------------------------------------------------------
elif Command == ('wb4server', 'start'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/wb4server-start'))
#----------------------------------------------------------------------------------------------
elif Command == ('wb4server', 'restart'):
CommandResult = subprocess.call(('ssh', UH, 'bin-slave/wb4server-restart'))
#----------------------------------------------------------------------------------------------
else:
print
print "#"*80
print
print "Error: invalid command"
print
HelpAndExit()
#----------------------------------------------------------------------------------------------
ResultList.append(CommandResult)
print
###################################################################################################
if any(ResultList):
print "#"*80
print "#"*80
print "#"*80
print
print "ERRORS FOUND. SEE ABOVE"
print
sys.exit(0)
else:
print "-"*80
print
print "Looks OK!"
print
sys.exit(1)
Zum einen die Beschreibung Ihres Ziel, dh Verwaltung von Servern, und was Sie fordern, dh Messaging-Systeme, scheinen nicht sehr gut passen. Es gibt Systeme zum Starten, Stoppen und Installieren von Software bereits. Es ist nicht offensichtlich, warum Sie einen schreiben würden, und noch weniger, warum Sie ein Nachrichtensystem dafür benötigen würden. Zweitens, Sie erklären nicht wirklich Ihre Anforderungen für das Messaging-System, so dass es schwer für jeden ist, Sie zu diesem Thema zu führen. –
Bitte klären Sie Ihre Ziele. Sagen Sie wirklich, was Sie "fertig" machen wollen. – gahooa