我在 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
已设置,因此将默认为“测试”。并不是说 fabric 不用于对本地盒子做任何事情,而是它作用于定义的本地盒子(或盒子),env.roledefs
尽管经过一些修改,它也可以在本地工作。
通常,fabric 命令用于从开发盒远程执行这些操作在测试、暂存或生产盒上,因此通过命令行指定角色并不是“非常愚蠢”,但在这种情况下是设计使然。
您可以使用env.roledefs将角色与主机组相关联。