На момент написания в ветке v2 есть класс Group
который должен быть способен служить в качестве единиц, ранее известных как «роли», иначе говоря, «группа хостов, с помощью которых и с / на которых можно что-то делать».
Однако пока не существует определенного способа организации или маркировки объектов Group
; этого достаточно для случая использования чистого API продвинутыми пользователями, которые хотят использовать свой собственный способ их создания, но не хватает чего-либо для пользователей, ориентированных на CLI, или промежуточных людей, которые хотят построить что-то каркасное.
Другими словами, если вы не работаете исключительно с API, наличие объектов Group, лежащих где-то поблизости, бесполезно, если CLI или биты вызова задач не имеют возможности их найти!
В v1 роли фактически представляли собой единое плоское пространство имен, сопоставляющее простые строковые метки с тем, что было бы группами в v2, и они могли быть выбраны в CLI во время выполнения ( fab --roles=web,db
) и / или зарегистрированы как цели по умолчанию для задач ( @task('db') \n def migrate():
), как и хосты.
Пользователи определили их в env.roledefs
, простом слове; любые промежуточные и расширенные функциональные возможности связаны с их изменением, обычно во время выполнения (с помощью предварительной задачи или подпрограммы), иногда во время загрузки модуля.
Group
s и / или Connection
s.Lexicon
вместо dict
.db
, web
, lb
, но затем имя второго уровня называется prod
который всегда является объединением трех других. Я забыл, добавил ли я это в Lexicon
. Возможно, есть другие подклассы карт, которые уже делают это.if cxn in group
будет работать, даже если cxn
- отдельный объект от равного члена внутри group
.db
"@group
например @task
, а функции не являются исполняемыми единицами работы, а вместо этого выдают объекты Group.Из списка рассылки:
Мы внедрили наш собственный внутренний REST API, который динамически заполняет env.roledefs в зависимости от развертываемого проекта и сильно полагается на то, что не встраивает строки хоста в fabfile проекта или не указывает их в CLI.
Наши варианты использования:
EnvironmentDatabaseAPIClient(
'https://rest.api.url/schema/',
env.service_name,
).apply_env()
Количество серверных сред - несколько сред тестирования (некоторые из них частные, некоторые общедоступные) и несколько производственных сред (для разных клиентов). Каждая среда состоит из одного или нескольких хостов и сопоставлена роли фабрики.
Каждая служба ( env.service_name
в приведенном выше примере) имеет разный набор сред.
Также у нас есть мета-роли (группы ролей). Они имеют префикс group-
: group-production
, group-test
, group-external
, group-internal
, group-all
. Это позволяет нам выполнять развертывание на нескольких ролях сервера, не указывая их одну за другой, например group-all
развертывается для всех ролей, как производственных, так и тестовых.
У нас есть специальные задачи фабрики для печати информации о группах ролей, ролях и хостах.
Мы также сильно полагаемся на обратное сопоставление строк хоста с именами ролей (строки хостов уникальны для каждого service_name). Это используется для ведения журнала развертывания и уведомлений. По сути, мы регистрируем развертывание службы на каждом хосте и отправляем уведомление Slack, когда служба была развернута на всех хостах в роли. За это отвечает сервер EnvironmentDatabaseAPI (он ведет журналы и состояние развертывания). Это делается путем украшения задач фабрики декоратором, который отправляет env.host
, env.port
и env.service_name
(плюс информацию о фиксации) обратно на сервер API.
Мы планируем добавить аутентификацию развертывания в будущем, также очень вероятно, что будет извлекать больше переменных env
с сервера, чтобы сделать их доступными в контексте задачи.
Спасибо @ max-arnold! Я узнал многие из них из моих собственных примеров использования в прошлом. В частности, бит обратного сопоставления, как я помню, несколько раз появлялся в v1, поэтому я добавил его в список.
Чтобы Fabric v2 стала для меня полезной, мне понадобится способ указать fab
каком наборе хостов выполнять задачу.
Раньше я определял роли, а затем запускал fab -R ...
. (На самом деле роли были определены программно с использованием диапазона IP-адресов, но это не является обязательным требованием, и статический список внутри файла YAML подойдет.)
Мне не удалось найти эквивалент в Fabric v2, и мне также не удалось эмулировать эту функцию, используя:
fabric.yaml
содержащийactive_hostset: null
hostsets:
myhostset:
- ...
active_hostset = config["hostsets"][config["active_hostset"]]
в fabfile.py
env INVOKE_ACTIVE_HOSTSET=myhostset fab ...
Вместо ожидаемого списка хостов я получаю KeyError: 'active_hostset'
.
Мы сопоставляем разные наборы хостов каждой роли для каждой из наших сред в фабрике v1, и среда устанавливается путем выполнения задачи role.environment:staging
чтобы указать ее. Таким образом, эта задача влияет на хосты, используемые следующими задачами.
В версии 2 мы пытались использовать настраиваемую задачу, но проблема в том, что Executor.expand_calls
запускается до запуска нашей задачи role.environment
и поэтому ни одна из следующих задач не знает среды, чтобы динамически создавать списки своих хостов.
Создание генератора Executor.expand_calls
позволяет выполнению задачи влиять на выполнение последующих задач. Итак, мой пример выше работает, когда у нас есть пользовательский Task
который должен знать свою среду, чтобы должным образом расширять роли для хостов. например, fab role.environment dev deploy.app
- задача role.environment
теперь запускается до того, как deploy.app
раскрывается, и поэтому deploy.app
знает среду и может настраивать ее хосты, а затем расширяется в правильный набор задач.
Я прототипировал это в своих вилках:
https://github.com/pyinvoke/invoke/compare/master...rectalogic : генератор расширения
https://github.com/fabric/fabric/compare/master...rectalogic : генератор расширений
Привет, я не знаю, что случилось с этим программным обеспечением через много лет, но мне очень не хватало концепции «ролей» в [email protected] , особенно при запуске $ fab -R dev
Мы также используем роли для представления одного и того же набора операций в разных средах. Возможно, было бы полезно разделить концепцию именованной роли и именованной среды? Например, веб-роль в среде разработки.
Самый полезный комментарий
Привет, я не знаю, что случилось с этим программным обеспечением через много лет, но мне очень не хватало концепции «ролей» в [email protected] , особенно при запуске
$ fab -R dev