Действительно ли возможно сделать fabfile автономное?
Я не очень люблю выполнение внешнего 'потрясающего' инструмента. Если мне удается получить fabfile автономное, я могу петлять из (Eclipse / Pydev) IDE, легко отладить его, использовать конфигурации проекта и пути и т.д.
Почему не делает этой работы:
from fabric.api import run
def host_type():
run('uname -s')
if __name__ == '__main__':
host_type()
Это не очень хорошее решение, но будет работать:
import subprocess
def hello():
print 'Hello'
if __name__ == '__main__':
subprocess.call(['fab', '-f', __file__, 'hello'])
Если я правильно помню, я также не мог заставить Fabric API делать то, что я хотел. Я решил полностью отказаться от дополнительного слоя и использовать 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
для spwan другого экземпляра Python или выяснения API Fabric. У меня есть несколько проектов, как веб-, так и консольных, использующих Paramiko таким образом, и у меня не было слишком много проблем.
Paramiko имеет обширную документацию.