Выполнение вложенных вызовов для «выполнения» с помощью библиотеки Python Fabric - PullRequest
9 голосов
/ 19 января 2012

Fabric Python предоставляет возможность вызывать функции матрицы вне утилиты fab, используя функцию execute.Контекстуальная проблема возникает, когда функция execute вызывается внутри другой функции, которая была вызвана с использованием execute.Fabric теряет контекст внешнего выполнения, когда внутренний выполняется, и никогда не восстанавливает его.Например:

env.roledefs = {
    'webservers': ['web1','web2'],
    'load_balancer': ['lb1']
}

@roles('webserver')
def deploy_code():
    #ship over tar.gz of code to unpack.
    ...
    execute(remove_webserver_from_load_balancer, sHost=env.host_string)
    ...
    #shutdown webserver, unpack files, and restart web server
    ...
    execute(add_webserver_to_load_balancer, sHost=env.host_string)

@roles('load_balancer')
def remove_webserver_from_load_balancer(sHost=None):
   ssh("remove_host %s" % sHost)

execute(deploy_code)

После первого вызова execute Fabric полностью теряет свой контекст и выполняет все дальнейшие команды в функции deploy_code с host_string='lb1' вместо 'web1'. Как я могу заставить его запомнить это?

Я придумал этот хак, но чувствую, что он может сломаться в будущих выпусках:

 with settings(**env):
     execute(remove_webserver_from_load_balancer, sHost=env.host_string)

Это эффективносохраняет все состояние и восстанавливает его после вызова, но выглядит как непреднамеренное использование функции.Есть ли лучший способ сообщить Fabric, что он находится во вложенном выполнении, и использовать стек настроек или эквивалентный метод для запоминания состояния?

Спасибо!

1 Ответ

1 голос
/ 17 апреля 2012

Вы не используете ткань правильно.Как вы бы просто позвонили fab deploy_code вместо того, чтобы запускать fabfile, как будто это python.Я бы посоветовал пройти курс обучения, чтобы лучше понять, как структурировать ваш файл.

В любом случае, вы можете посмотреть здесь , чтобы узнать, как использовать execute() и здесь для более подробной информации.

У вас есть опечатка, в которой вы удалили 's' из роли веб-сервера.Который может объяснить, что у вас нет хорошей строки хоста, когда вы хотите использовать ее во втором задании.

Но кроме этого, вы также можете установить роли и хосты в самой команде execute ().

...