Как узнать текущую роль в Python Fabric

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

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

def restart(): if (SERVERTYPE == "APACHE"): sudo("apache2ctl graceful",pty=True) elif (SERVERTYPE == "APE"): sudo("supervisorctl reload",pty=True) 

Я взломал это с помощью таких функций, как этот:

 def apache(): global SERVERTYPE SERVERTYPE = "APACHE" env.hosts = ['xxx.xxx.com'] 

Но это, очевидно, не очень элегантно, и я только что открыл роли, поэтому мой вопрос:

Как определить, к какой роли принадлежит текущий экземпляр?

 env.roledefs = { 'apache': ['xxx.xxx.com'], 'APE': ['yyy.xxx.com'], } 

Благодаря!

  • Как скопировать каталог на удаленную машину с помощью Fabric?
  • Python Fabric: как отвечать на ввод с клавиатуры?
  • Как создать новый файл на удаленном узле в базе данных (средство развертывания python)?
  • Переключение пользователя в Fabric
  • Использование Python Fabric без инструмента командной строки (fab)
  • Команда запуска Python Fabric возвращает «binascii.Error: неправильное заполнение»
  • запустите фоновый процесс с помощью nohup, используя ткань
  • Передача параметра в задание на ткань
  • 4 Solutions collect form web for “Как узнать текущую роль в Python Fabric”

    Обновление : просто проверили исходный код, и кажется, что это уже было доступно уже в 1.4.2!

    update 2 : Это не работает при использовании декоратора @roles (в 1.5.3)! Он работает только при указании ролей с использованием флага командной строки -R .

    Для ткани 1.5.3 текущие роли доступны непосредственно в `fabric.api.env.roles '. Например:

     import fabric.api as fab fab.env.roledefs['staging'] = ['bbs-evolution.ipsw.dt.ept.lu'] fab.env.roledefs['prod'] = ['bbs-arbiter.ipsw.dt.ept.lu'] @fab.task def testrole(): print fab.env.roles 

    Тестовый выход на консоли:

     › fab -R staging testrole [bbs-evolution.ipsw.dt.ept.lu] Executing task 'testrole' ['staging'] Done. 

    Или:

     › fab -R staging,prod testrole [bbs-evolution.ipsw.dt.ept.lu] Executing task 'testrole' ['staging', 'prod'] [bbs-arbiter.ipsw.dt.ept.lu] Executing task 'testrole' ['staging', 'prod'] Done. 

    При этом мы можем сделать простой тест в задаче на ткань:

     @fab.task def testrole(): if 'prod' in fab.env.roles: do_production_stuff() elif 'staging' in fab.env.roles: do_staging_stuff() else: raise ValueError('No valid role specified!') 

    Для всех остальных когда-либо с этим вопросом, вот мое решение:

    Ключом было найти env.host_string.

    Вот как я перезапускаю разные типы серверов с помощью одной команды:

     env.roledefs = { 'apache': ['xxx.xxx.com'], 'APE': ['yyy.xxx.com'] } def apache(): env.roles = ['apache'] ... def restart(): if env.host_string in env.roledefs['apache']: sudo("apache2ctl graceful", pty=True) elif env.host_string in env.roledefs['APE']: sudo ("supervisorctl reload", pty=True) 

    наслаждаться!

    Я не тестировал его, но мог бы работать:

     def _get_current_role(): for role in env.roledefs.keys(): if env.host_string in env.roledefs[role]: return role return None 

    env.roles предоставит вам роли, указанные флагом -R или жестко закодированные в самом скрипте. Он не будет содержать роли, указанные для каждой задачи, с помощью командной строки или с @roles декоратора @roles . В настоящее время нет способа получить такую ​​информацию.

    Следующий выпуск ткани (вероятно, 1.9) предоставит атрибут env.effective_roles именно с тем, что вы хотите – роли, которые используются для выполняемой в настоящее время задачи. Код для этого уже был объединен с мастером.

    Посмотрите на эту проблему .

    Python - лучший язык программирования в мире.