Автономный материал для ткани?

Можно ли сделать fabfile автономным?
Я не очень люблю работать с внешним инструментом «fab». Если мне удастся создать автономный файл fabfile, я могу запустить файл из IDE (Eclipse / Pydev), легко отладить его, использовать конфигурации проекта и пути и т. Д.
Почему это не работает:

from fabric.api import run def host_type(): run('uname -s') if __name__ == '__main__': host_type() 

10 Solutions collect form web for “Автономный материал для ткани?”

В итоге я нашел решение (и это действительно просто!).
В моем fabfile я добавил:

 from fabric.main import main if __name__ == '__main__': import sys sys.argv = ['fab', '-f', __file__, 'update_server'] main() 

Надеюсь, это поможет людям …

Если я правильно помню, я не мог заставить API Fabric делать то, что я хотел. Я решил полностью отказаться от дополнительного слоя и напрямую использовать Paramiko (базовую библиотеку SSH, используемую Fabric):

 import os import paramiko ssh = paramiko.SSHClient() ssh.load_system_host_keys() ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('hostname.example.com', 22, 'username', 'password') ssh.save_host_keys(os.path.expanduser('~/.ssh/known_hosts')) stdin, stdout, stderr = ssh.exec_command('uname -s') print stdout.read() 

Хотя есть еще несколько шагов, делая это таким образом, вы можете напрямую использовать уровень SSH, в отличие от использования subprocess для развертывания другого экземпляра Python или определения API-интерфейса Fabric. У меня есть несколько проектов, как web, так и консоль, используя Paramiko таким образом, и у меня не было слишком много проблем.

Парамико широко задокументирован .

Это не очень хорошее решение, но будет работать:

 import subprocess def hello(): print 'Hello' if __name__ == '__main__': subprocess.call(['fab', '-f', __file__, 'hello']) 

Я точно настроил приведенный выше пример на прошлые аргументы argv, которые вы, возможно, захотите передать локальным командам, и укажите необязательный список default_commands вместо имени жесткой кодированной команды. Обратите внимание: имя файла должно иметь расширение .py или fab, которое не будет определять его как файл fab!

 #!/usr/bin/env python from fabric.api import local default_commands = ['hello', ] def hello(): print ('hello world') def hostname(): local('hostname') if __name__ == '__main__': import sys from fabric.main import main sys.argv = ['fab', '-f', __file__,] + default_commands + sys.argv[1:] main() 

docs.fabfile.org/en/1.4.0/usage/library.html

«Как упоминается в этом разделе, ключ – это просто, что run, sudo и другие операции видны только в одном месте при подключении: env.host_string. Все остальные механизмы для настройки хостов интерпретируются при помощи инструмента fab при его запуске и «Неважно, как работать в библиотеке».

Я искал эту проблему, когда нашел это. Кроме того, во время просмотра я вспоминаю упоминание о том, что при использовании в fabfile изменения env не должны быть в том же определении, что и run, sudo. Кто знает, действует ли это при использовании в «библиотечном» режиме.

EDIT: Вот пример указанной реализации

 from fabric.api import env, run def main(): run("uname -a") def setup(): env.host_string = "me@remoteHost" if __name__ == '__main__': setup() main() 
 # thanks to aaron, extending his code a little more # here is a little bit more of a graceful solution than running subprocess.call, and specifying multiple hosts from fabric.api import env, run def main(): run("uname -a") def setup(): env.hosts = ['host0','host1'] if __name__ == '__main__': setup() for host in env.hosts: env.host_string = host main() 

Начиная с версии 1.5.0, есть лучший способ сделать это, чем возиться с argv.

 import fabric.main def main(): fabric.main.main(fabfile_locations=[__file__]) if __name__ == "__main__": main() 

Это также можно использовать в качестве консольного скрипта в setup.py

Добавьте это в нижнюю часть вашего файла fab.

 if __name__ == '__main__': from fabric.main import main import sys sys.argv = ['fab', '-f', __file__] + sys.argv[1:] main() 

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

 if __name__ == '__main__': # imports for standalone mode only import sys, fabric.main # show available commands by default if not sys.argv[1:]: sys.argv.append('--list') fabric.main.main(fabfile_locations=[__file__]) 

Я нашел решение косвенно в файле прогона, который был переименован, кроме файла fabfile.py и без пароля ssh

 def deploy(): ... if __name__ == '__main__': from fabric import execute execute(deploy) 

Этот способ также работает, если ваш файл не имеет расширения .py .

  • Есть ли реализация «ожидать» или ожидающая библиотека, которая работает в python3?
  • Как я могу собирать выходные данные задачи и печатать сводку для нескольких хостов?
  • Как настроить Pycharm для отладки Fabric fabfile в Windows?
  • Ограничения пула
  • пароль ткани
  • Создание вложенных вызовов для «выполнения» с помощью библиотеки Fabric Python
  • Fabfiles с аргументами командной строки
  • Не удается заставить пример сеанса экрана экрана Fabric работать
  •  
    Interesting Posts for Van-Lav

    Как я могу получить публичный IP-адрес с помощью python2.7?

    Помощь по установке cx_Oracle

    Создание перестановок списка с повторяющимися элементами

    Как скопировать все свойства объекта на другой объект в Python?

    Настройка django с помощью uwsgi и nginx

    IndexError: индекс индекса вне диапазона и python

    Экстраполяция с «ближайшим» методом в Python

    Как подключаемый модуль может улучшить JavaScript?

    Как разбить данные на 3 набора (поезд, валидация и тест)?

    Как исправить libpapi.so. * Не удается открыть файл общих объектов при запуске (py) COMPS с трассировкой?

    Список таблиц, db-схемы, дампа и т. Д. С использованием API-интерфейса Python sqlite3

    Распространение независимого пути libpython

    Фильтрация кадра данных pandas с использованием значений из dict

    Использование классов / статических методов в качестве значений параметров по умолчанию в методах одного и того же класса

    есть функция md5 decrypt в python?

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