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

Python 如何在Fabric中动态编辑env.roledefs?,python,fabric,Python,Fabric,我已经检查过了,但它不能解决我的问题 我想做一些类似的事情: @task def setEnv(environment): if environment == 'prod': env.roledefs['nginx'] = [ 'www@tnginx01', 'www@tnginx02' ] env.roledefs['middle'] = [ 'www@tmiddle01', 'www@tmiddle02' ] elif environment

我已经检查过了,但它不能解决我的问题

我想做一些类似的事情:

@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')
但是,在文件加载到内存后,似乎不可能更改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

我的答案是从我的想法中得到启发的。

所以说得清楚,你不能设置env.roledefs['first_middle']=env.roledefs['middle'][:1],也不能设置@roles('first_middle')?是的,我可以,但这并不能解决无法在任务中编辑的env.roledefs的问题。以防万一有人找到这个答案:您可以在任务中设置/操作env.roledefs(如果您从另一个任务调用这样的任务,请不要忘记使用execute()。问题中的代码应该抛出AttributeError,env在decorator定义时没有“first_middle”(在上面的答案中,设置env.first_middle不应该缩进)。福克斯:我认为你得出了错误的结论。