2015-10-17 28 views
0

我想將一堆相關的代碼組合到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 

甚至傳遞變量到兩個初始化和功能...

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

任何想法如何做到這一點?織物應該支持開箱即可使用,但我似乎無法弄清楚它可能會記錄在哪裏。

當然,真正的代碼要複雜得多,用類AmazonCloud和KvmInstance等

+0

Fabric支持[namespaces](http://docs.fabfile.org/en/1.10/usage/tasks.html#namespaces)。您可以將您的任務類移至單獨的子模塊。 – approxiblue

回答

1

我對你的解決方案:

旁邊的fabfile.py添加__init__.py(SUPER重要。)

添加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. 

你可以讓它成爲一個班級,但我真的沒有看到它的要點告訴你真相,因爲每個任務都必須是它自己的班級。無論如何,讓我知道。 (我保持與你有相同的命名,我建議你改變它)