我在fabfile.py中只有一个命令:
@role('dev')
def test():
local('...')
现在,我可以在每个命令中使用--role=dev
,但这非常愚蠢。
我想要的是在一个主机中安装我的项目一次,具有一定的角色,然后在不重复此参数的情况下使用它。
答案 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将角色与主机组相关联。