如何告诉Fabric当前站点有哪些角色?

时间:2012-10-09 19:25:43

标签: python fabric

我在fabfile.py中只有一个命令:

@role('dev')
def test():
    local('...')

现在,我可以在每个命令中使用--role=dev,但这非常愚蠢。

我想要的是在一个主机中安装我的项目一次,具有一定的角色,然后在不重复此参数的情况下使用它。

2 个答案:

答案 0 :(得分:2)

我通常在fabfile.py中包含以下内容:

if not len(env.roles):
    env.roles = ["test"]

这表示如果没有定义env.roles(例如通过命令行),在我的情况下它应该被定义为“test”。因此,在您的情况下,我会改变上述内容,将dev替换为test,因此您可以:

if not len(env.roles):
    env.roles = ["dev"]

通过这样做,你应该发现你得到了你正在寻找的行为,同时如果你愿意在未来的任何时候提供覆盖的能力。

编辑:我正在编辑这个包含一个小例子fabfile.py和使用说明。

env.roledefs = {
    'test': ['test.fabexample.com'],
    'stage': ['stage.fabexample.com'],
    'prod': ['web01.fabexample.com', 'web02.fabexample.com', 'web03.fabexample.com'],
}
# default role will be test
env.roles = ['test']

def git_pull():
    run("git pull")

def deploy():
    target = "/opt/apps/FOO"
    with cd(target):
        git_pull()
    sudo("service apache2 restart")

现在这个fabfile将允许我将代码部署到任何三个不同的环境:“test”,“stage”或“prod”。我通过命令行选择要部署到的环境:

fab -R stage deploy

,或者

fab --role=stage deploy

如果我指定角色结构,由于设置了env.roles,它将默认为'test'。并非该结构不用于对本地框执行任何操作,而是根据env.roledefs中定义的本地框(或框)进行操作,尽管经过一些修改后,它也可以在本地工作。

通常,从开发框中使用fabric命令在测试,登台或生产框上远程执行这些操作,因此通过命令行指定角色不是“非常愚蠢”,但在这种情况下是设计的。

答案 1 :(得分:0)

您可以使用env.roledefs将角色与主机组相关联。