gpt4 book ai didi

python - 如何在Fabric中动态编辑env.roledefs?

转载 作者:行者123 更新时间:2023-12-01 05:08:52 24 4
gpt4 key购买 nike

我查过this question但这并不能解决我的问题。

我想做这样的事情:

@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 时,它将不起作用:

No hosts found. Please specify (single) host string for connection

有人知道该怎么做吗?请注意,我无法使用 roledef 来表示环境。我已经使用 roledef 来存储属于同一“集群”的服务器,并且每个环境都有多个包含多个服务器的集群。

最佳答案

我刚刚找到了问题的解决方案。

关键是 env.roledefs 无法在 Fabric 任务中进行编辑。因此,编辑它的代码必须位于全局范围内的开头。

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

我的回答灵感来自this link这给了我这个想法。

关于python - 如何在Fabric中动态编辑env.roledefs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24575590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com