【问题标题】:Mule vs ActiveMQ for Python骡子与 Python 的 ActiveMQ
【发布时间】:2009-06-29 15:40:41
【问题描述】:

我需要管理多个服务器、网络服务、应用服务器(Apache、Tomcat)并管理它们(启动停止、安装软件)。

我想使用 Python,因为 C++ 似乎很复杂,而且对于事物任务的效率较低。我不确定要使用哪个中间件。 ActiveMQ 和 Mule 似乎是一个不错的选择,尽管它们是用 Java 编写的。我对 ActiveMQ 比较了解,而对 ESB 知之甚少。

有什么建议吗? Python 有什么选择吗?

我看到有beantalk,但是太简单和不灵活。我需要一个用于协调的消息系统,以及一种将 tar.gz 文件发送到服务器(软件包)的方法。

我是有一个 Python 原生的消息传递解决方案。

【问题讨论】:

  • 首先,您的目标(即管理服务器)和您的要求(即消息传递系统)的描述似乎不太匹配。已经有用于启动、停止和安装软件的系统。你为什么要写一个并不明显,更不用说为什么你需要一个消息系统。其次,您并没有真正解释您对消息传递系统的要求,因此任何人都很难在该主题上指导您。
  • 请说明您的目标。真正说出你想要“完成”的事情。

标签: python messaging


【解决方案1】:

管理多个远程服务器上的各种服务的示例 python“脚本”:

以下是一个组合在一起的脚本,可用于管理您可以通过 SSH 访问的服务器上的各种服务。

理想情况下,您需要运行 ssh-agent,否则您会多次输入密码。

对于需要在远程计算机上提升权限的命令,您可以看到调用了“sudo”。这意味着您需要修改每台远程计算机上的 sudoers 文件,并添加这样的条目(假设您的用户名 == deploy):

Defaults:deploy !requiretty
Defaults:deploy !authenticate

deploy ALL=\
    /sbin/service httpd status,\
    /sbin/service httpd configtest,\
    /sbin/service httpd graceful

前两行允许deploy 用户运行sudo 而无需tty 或重新输入密码——这意味着它可以直接在ssh 上运行而无需任何进一步的输入。下面是一个利用远程sudo 的python 命令示例:

CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful'))

无论如何,这不是对您问题的“直接”回答,而是说明您可以多么容易地使用 python 和其他几种技术来创建一个 100% 适合您的特定需求的系统管理工具。

顺便说一句,如果任何命令返回的退出状态 > 0,以下脚本会“大声而清晰地告诉您”,因此您可以自己分析输出。

当我正在处理的一个项目开始使用负载平衡器并且不再公平地在每台服务器上运行所有命令时,这被一起破解了。您可以修改或扩展它以使用 rsync 来部署文件,甚至可以将更新部署到您在远程服务器上托管的脚本以“完成工作”。

#!/usr/bin/python


from optparse import OptionParser
import subprocess
import sys

def die(sMessage):
        print
        print sMessage
        print
        sys.exit(2)


###################################################################################################
# Settings

# The user@host: for the SourceURLs (NO TRAILING SLASH)
RemoteUsers = [
        "deploy@ac10.example.com",
        "deploy@ac11.example.com",
        ]

###################################################################################################
# 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)

【讨论】:

  • 谢谢,正如你所说,这并不能回答我的问题。不过你的代码很有趣。
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多