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

时间:2014-07-04 13:35:13

标签: python fabric

我已经检查了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时,它将无效:

  

找不到主机。请指定(单个)主机字符串进行连接

有谁知道怎么做?请注意,我不能使用roledef来表示环境。我已经使用roledef来存储属于同一个“集群”的服务器,并且每个环境都有几个带有多个服务器的集群。

1 个答案:

答案 0 :(得分:2)

我刚刚找到解决问题的方法。

关键是无法在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

我的答案受到this link的启发,这给了我这个想法。