I have checked this question but it doesn't answer to my problem.
I would like to do something like:
@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')
But it seems that it's not possible to change the value of env.roledefs after the Fabfile has been loaded into memory.
When you try to run fab setEnv:prod deploy
, it won't work:
No hosts found. Please specify (single) host string for connection
Does anyone know how to do that? Note that I cannot use roledefs to represent environments. I already use roledefs to store servers belonging to a same 'cluster', and each environment has several clusters with several servers.