@ Крис, причина такого поведения в том, что список хостов составлен за до , вызывается функция задачи.Таким образом, даже если вы изменяете env.hosts
внутри функции, уже слишком поздно, чтобы она имела какой-либо эффект.
В то время как команда fab setenv:foo mycmd:bar
привела бы к тому, что вы ожидали:
$ fab setenv:foo mycmd:bar
[myhost] Executing task 'mycmd'
['myhost']
[myhost] run: ls
Это то же самое, что и принятый ответ, но из-за способа определения setenv
необходим аргумент.
Другой пример:
from fabric.api import env, run, local, cd
env.hosts = ['other_host']
def setenv(foo):
env.hosts = ['myhost']
def mycmd(foo):
setenv(foo)
print('env.hosts inside mycmd: %s' % env.hosts)
run('ls')
Вывод этого:
$ fab mycmd:bar
[other_host] Executing task 'mycmd'
env.hosts inside mycmd: ['myhost']
[other_host] run: ls
Fatal error: Name lookup failed for other_host
Underlying exception:
(8, 'nodename nor servname provided, or not known')
Aborting.
Как видите, список хостов уже установлен на ['other_host', ]
, когда фабрика начинает выполнять mycmd
.