Вот еще один шаблон "summersault", который позволяет использовать fab my_env_1 my_command
:
С этим шаблоном нам нужно только определить среду один раз, используя словарь. env_factory
создает функции на основе имен ключей ENVS
. Я помещаю ENVS
в его собственную директорию и файл secrets.config.py
, чтобы отделить конфигурацию от кода фабрики.
Недостаток в том, что, как написано, добавление декоратора @task
сломает его .
Примечания: Мы используем def func(k=k):
вместо def func():
на фабрике из-за поздней привязки . Мы получаем работающий модуль с этим решением и исправляем его для определения функции.
secrets.config.py
ENVS = {
'my_env_1': {
'HOSTS': [
'host_1',
'host_2',
],
'MY_OTHER_SETTING': 'value_1',
},
'my_env_2': {
'HOSTS': ['host_3'],
'MY_OTHER_SETTING': 'value_2'
}
}
fabfile.py
import sys
from fabric.api import env
from secrets import config
def _set_env(env_name):
# can easily customize for various use cases
selected_config = config.ENVS[env_name]
for k, v in selected_config.items():
setattr(env, k, v)
def _env_factory(env_dict):
for k in env_dict:
def func(k=k):
_set_env(k)
setattr(sys.modules[__name__], k, func)
_env_factory(config.ENVS)
def my_command():
# do work