1

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

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

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

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

4

2 回答 2

2

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

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

这表示如果 env.roles 没有定义(例如通过命令行),在我的例子中它应该被定义为“测试”。因此,在您的情况下,我会更改上述内容以代替devtest因此您将拥有:

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已设置,因此将默认为“测试”。并不是说 fabric 不用于对本地盒子做任何事情,而是它作用于定义的本地盒子(或盒子),env.roledefs尽管经过一些修改,它也可以在本地工作。

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

于 2012-10-09T22:38:33.113 回答
0

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

于 2012-10-09T20:21:48.583 回答