我已经检查了这个问题,但不能解决我的问题。
我想做类似的事情:
@task
def setEnv(environment):
if environment == 'prod':
env.roledefs['nginx'] = [ 'www@tnginx01', 'www@tnginx02' ]
env.roledefs['middle'] = [ 'www@tmiddle01', 'www@tmiddle02' ]
elif environment == 'preprod':
env.roledefs['nginx'] = [ 'www@pnginx01', 'www@pnginx02' ]
env.roledefs['middle'] = [ 'www@pmiddle01', 'www@pmiddle02' ]
else:
puts(red("This environment doesn't exist. Possible values are 'preprod' and 'prod'", True))
sys.exit()
env.first_middle = env.roledefs['middle'][0]
@task
@roles(env.first_middle)
def deploy():
run('pwd')
但是,似乎无法在Fabfile加载到内存后更改env.roledefs的值。当您尝试运行时fab setEnv:prod deploy
,它将不起作用:
找不到主机。请指定(单个)主机字符串进行连接
有谁知道这是怎么做到的吗?请注意,我不能使用roledefs来表示环境。我已经使用roledefs来存储属于同一“集群”的服务器,并且每个环境都有几个群集和多个服务器。
我刚刚找到解决问题的方法。
关键是不能在Fabric任务中编辑env.roledefs。因此,对其进行代码编辑必须位于全局范围的开始。
if env.get('env') == 'prod':
env.roledefs['nginx'] = [ 'www@tnginx01', 'www@tnginx02' ]
env.roledefs['middle'] = [ 'www@tmiddle01', 'www@tmiddle02' ]
elif env.get('env') == 'preprod':
env.roledefs['nginx'] = [ 'www@pnginx01', 'www@pnginx02' ]
env.roledefs['middle'] = [ 'www@pmiddle01', 'www@pmiddle02' ]
else:
puts(red("This environment doesn't exist. Possible values are 'preprod' and 'prod'", True))
sys.exit()
env.first_middle = env.roledefs['middle'][0]
@task
@roles(env.first_middle)
def deploy():
run('pwd')
然后我像这样调用fabfile:
fab --set env=preprod deploy
我的答案受此链接启发,使我有了这个主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句