Fabric:在目标主机上执行内联Python?

时间:2015-02-23 22:09:27

标签: python linux amazon-web-services amazon-s3 fabric

此Fabric命令适用于fab local grab_from_s3:bucket=...

def grab_from_s3(bucket, path, localfile):
    s3_connection = S3Connection()
    s3_bucket = s3_connection.get_bucket(bucket)
    s3_key = Key(s3_bucket)
    s3_key.key = path
    s3_key.get_contents_to_filename(localfile)

当然,如果我将它提供给远程目标主机,它会下载到本地主机而不是远程。 (即fab staging grab_from_s3:bucket=...)。

我希望存在其中一种可能性:

  1. 该任务可以在远程盒子上自动运行,只需编写少量编码,或
  2. 我可以通过编程方式检测目标主机是否不是本地主机,并为远程主机指定结构命令行。
  3. 我非常喜欢#1,但不清楚是否可能。关于#2的不清楚的是,现有的Fabric设施是否能够轻松实现(即检测本地/远程主机以及它们与众不同的事实)。

    我该怎么办?

2 个答案:

答案 0 :(得分:3)

Fabric不支持在远程主机上运行任意python代码。 Fabric主要通过SSH(对于远程机器)调用shell命令来运行。远程机器甚至不需要安装python来使Fabric工作。

execnet项目允许您像想象的那样通过网络运行python代码,您可以运行相同的代码而无需在本地和远程进行修改。

最简单的解决方案可能是将相同的结构代码部署到本地主机和远程主机,然后让本地任务远程运行S3下载任务(通过shell命令)。

您将遇到的一个问题(使用execnet并在远程计算机上运行fab任务)是您需要在远程计算机上安装boto。不确定你是否已经有了这个设置。

另一种选择是在远程主机上运行命令行工具,如s3cmdofficial AWS command line client via fabric。

答案 1 :(得分:2)

在本地主机上使用Fabric在远程主机上运行Fabric,这将允许您在远程主机上执行Python命令。由于Fabric配置可能非常复杂,因此以下是不需要修改即可在您的环境中使用的代码段。例如,运行Fabric的命令在各种平台上可能会有所不同。

在fabfile中定义一个函数来执行所需的Python代码:

def local_grab_from_s3():
    bucket = "my_bucket"
    path = "my_path"
    localfile = "local_filename"

    s3_connection = S3Connection()
    s3_bucket = s3_connection.get_bucket(bucket)
    s3_key = Key(s3_bucket)
    s3_key.key = path
    s3_key.get_contents_to_filename(localfile)

定义另一个函数调用远程主机上的第一个函数:

def grab_from_s3():
    cmd("fab local_grab_from_s3")

在本地主机的命令行上,运行fab -H remote_host grab_from_s3