2016-12-22 8 views
1

У меня есть задача, украшенная @roles, что я иногда хотел бы запускать на одном хосте (для развертывания канарейки-тестирования).Как выполнить задачу с заданной ролью в ролях на одном хосте

from fabric.api import * 

env.roledefs = { 
    'web-workers': ['[email protected]', '[email protected]'], 
    'some-other-role': ['[email protected]'], 
} 

@task 
@roles('web-workers') 
def bogomips(): 
    run('uptime') 

В docs for @roles говорится, что:

... запрещая переопределение в командной строке, my_func будет выполняться против хозяев, перечисленных [в роли] ...

Но я не могу получить упомянутые здесь функции «переопределения», которые были здесь упомянуты, чтобы работать ... Я пробовал:

$ fab bogomips -H [email protected] 
$ fab bogomips -R some-other-role 

, но он всегда выполняется на всей роли, упомянутой в декораторе ...

Что мне здесь не хватает? Как я могу переопределить, где запущена задача @roles?

+0

Для чего это стоит, я сталкиваюсь с таким же поведением. Кажется, что игнорируется флаг '--roles', когда задача украшена ролями ('...'). Например, попробуйте свой код с '--roles = NOT_A_ROLE', и он должен работать без каких-либо ошибок. Удалите декоратор '@roles ('...') из задачи, и он выкинет ошибку (роль не существует). Но, по крайней мере, флаг роли, похоже, работает в этом сценарии. Определенно это не похоже на поведение, описанное в документах. – YellowShark

ответ

2

Это на самом деле предполагаемое поведение, в соответствии с Execution model's Order of Precedence, и есть немного другой синтаксис, который вы должны использовать в этом сценарии.

Так вот команда, которая не работает:

$ fab bogomips -R some-other-role # fabric ignores the -R values! 

А вот версия, которая делает работу:

$ fab bogomips:roles=some-other-role 

Вот вопрос: #308: @roles and @hosts decorators ignore command line options

И документы: http://docs.fabfile.org/en/1.0.0/usage/execution.html#order-of-precedence

  • Персоны, списки хостов командной строки (fab mytask: host = host1) переопределяют абсолютно все остальное.
  • Перечисление узлов, заданных декоратором (@hosts ('host1')) переопределяет переменные env.
  • Списки хостов, указанные в глобальном масштабе, установленные в файле fabfile (env.hosts = ['host1']) могут переопределять такие списки, заданные в командной строке, но только если вы не будете осторожны (или хотите их).
  • Введенные в глобальном масштабе списки хостов, установленные в командной строке (--hosts = host1), будут инициализировать переменные env, но это все.