在Fabric中调用类,然后调用类中的函数

时间:2015-10-17 05:14:01

标签: python fabric

我想将一堆相关代码分组到Fabric下的一个类中,并从命令行调用该类中定义的函数。

例如,这里有一些简化的伪代码来管理Google Compute Engine服务器。

class GoogleCloud(Task):
    def __init__(self, zone="us-east-1c"):
        credentials = GoogleCredentials.get_application_default()
        self.compute = build('compute', 'v1', credentials=credentials)
        self.project = "my_project"
        self.zone = zone

    def server_create(self, hostname):
        config = {
           'name': hostname
        }
        instance = self.compute.instances().insert(
            project=self.project,
            zone=self.zone,
            body=config).execute()

    def server_delete(self, hostname):
          return self.compute.instances().delete(
             project=self.project,
             zone=self.zone,
             instance=hostname
             ).execute()

我希望能够做的是从命令行调用server_create和server_delete,如下所示:

fab GoogleCloud.server_delete:foobar

甚至将变量传递给init和函数......

fab GoogleCloud:us-east1-b.server_create:new_server

知道怎么做到这一点?看起来它很有用,织物应该开箱即用,但我似乎无法弄清楚它可能被记录在哪里。

当然,真正的代码要复杂得多,包括适用于AmazonCloud和KvmInstance等的类。

1 个答案:

答案 0 :(得分:1)

我有一个解决方案:

旁边的fabfile.py添加__init__.py(超级重要。)

添加GoogleCloud.py

from fabric.api import task, env

env.zone = "us-east-1c"

@task
def zone(zone):
    env.zone = zone

@task
def server_create(hostname):
    print('create %s on %s' % (hostname, env.zone))

@task
def server_delete(hostname):
    print('delete %s on %s' % (hostname, env.zone))

然后你可以运行:

$ fab GoogleCloud.server_delete:hello
delete hello on us-east-1c

Done.
$ fab GoogleCloud.zone:other GoogleCloud.server_delete:hello
delete hello on other

Done.

你可以把它变成一个类,但我真的没有看到它告诉你真相的重点,因为每个任务都必须是它自己的类。无论如何,请告诉我。 (我保持相同的命名,我建议你改变它)