2014-01-22 21 views
1

我新的Python和织物。我们目前使用Capistrano的,并有一个类似的设置:样品织物(fabfile)共享共同的逻辑,并允许多个项目/环境

/api-b2b 
    - Capfile (with generic deployment/setup info) 
    /int - target host config (like ip, access etc.) 
    /prod - target host config (like ip, access etc.) 
    /dev - target host config (like ip, access etc.) 
/api-b2c 
    /int 
    /prod 
    /dev 
/application1 
    /int 
    /prod 
    /dev 
/application2 
    /int 
    /prod 
    /dev 

我们不快乐与Capistrano的处理我们的Java应用程序 - 面料看起来像一个更好的(简单)的替代方案。

所有的例子fabfiles到目前为止,我看到的都是在“相对简单”,他们只处理了不同主机上一个应用程序。我希望看到一些代码,其中不同的应用程序/主机由相同的结构文件/基础结构(如继承等)处理,以共享相同的逻辑,用于诸如git处理,目录创建,符号链接等常见任务。我希望你明白我的意思。我希望整个逻辑是相同的,只是应用程序配置是不同的(git repo,目标目录)。所有剩下的就是翻过的应用程序相同的(同一台服务器布局...)

我希望能够进入这样的事情

$ cd api-b2b 
$ fab env_prod deploy 
$ cd api-b2c 
$ fab env_prod deploy 

$ fab env_prod deploy:app=api=b2b 
$ fab env_prod deploy:app=api=b2c 

任何帮助(和指针来样的文件)的高度赞赏

欢呼声 烫发

回答

4

如果您真的想在您的结构代码中重用,最稳健的方法是重构共同点并使其成为python模块。有像fabtoolscusine这样的模块是很好的例子,它可以做什么。

如果你正在寻找有多个项目,有几个方式来实现这一结果。假设你正在使用一个fabfile目录(而不是一个fabfile.py),你将会有这样的结构。

/fabfile 
    __init__.py 
    b2b.py 
    b2c.py 

假设你有:

# b2b.py/b2c.py 
from fabric.api import * 

@task 
def deploy(): 
    # b2b/b2c logic 
    pass 

当您运行fab -l(带一个空__init__.py),你会看到:

Available commands: 

    b2b.deploy 
    b2c.deploy 

为了更接近你在找什么对,你可以动态查找,从一个参数,部署目标要运行:

# __init__.py 
from fabric.api import * 
import b2b 
import b2c 

@task 
def deploy(api): 
    globals()[api].deploy() 

这意味着,在命令行上,我可以运行fab deploy:api=b2bfab deploy:api=b2c或。


编辑1月27日

指定一个或机器来运行使用@task@role装饰,或设置可通过-H-R交换机命令行上实现一个任务结构环境(env.hosts和env.roles)。结构文档在execution model上提供了大量示例,向您显示所有细节。

根据api和目标环境,主机列表的一种方法是根据您的应用程序(可能不是最佳方式,取决于您的应用程序)。dynamicallyalter主机根据api和目标环境列出。

# __init__.py 
from fabric.api import * 
import b2b 
import b2c 

@task 
def deploy(api, target='test'): 
    func = globals()[api].deploy 
    hosts = globals()[api].deploy_hosts(target) 
    execute(func, hosts=hosts) 

而且现在b2b.pyb2c.py文件看起来像:

# b2b.py/b2c.py 
@task 
def deploy(): 
    # b2b/b2c logic 
    pass 

def deploy_hosts(target): 
    return { 
     'test' : ['localhost'], 
     'prod' : ['localhost'], 
     'int' : ['localhost'], 
    }[target] 
+0

嘿安德鲁,感谢您的回答。在这种情况下,int/prod/dev在哪里?我想要做类似这样的事情:fab env_prod deploy:app = api-b2b – Marcel

+0

@Marcel - 是int/prod/dev主机或角色还是更复杂的东西? –

+0

到底他们只是不同的目标主机。他们都共享相同的目录布局等。 – Marcel