我想将一堆相关代码分组到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等的类。
答案 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.
你可以把它变成一个类,但我真的没有看到它告诉你真相的重点,因为每个任务都必须是它自己的类。无论如何,请告诉我。 (我保持相同的命名,我建议你改变它)