我在 fabfile.py 中只有一个命令:
@role('dev')
def test():
local('...')
现在,我可以在每个命令中使用 --role=dev
,但这非常愚蠢。
我想要的是将我的项目安装在主机上一次,并具有一定的角色,然后使用它,而无需重复此参数。
最佳答案
我通常在 fabfile.py 中包含以下内容:
if not len(env.roles):
env.roles = ["test"]
这表示如果 env.roles 未定义(例如通过命令行),则在我的情况下应将其定义为“测试”。因此,在您的情况下,我将更改上述内容,以用 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”。并不是说 Fabric 不用于对本地盒子执行任何操作,而是作用于 env.roledefs 中定义的本地盒子(或多个盒子),尽管经过一些修改,它可以在本地工作也是如此。
关于python - 如何告诉 Fabric 当前站点的角色是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806992/