9

fabfileをスタンドアロンにすることは可能ですか?
私は外部ツール「fab」を実行するのがあまり好きではありません。fabfileをスタンドアロンにすることができれば、(Eclipse / Pydev)IDE内からファイルを実行し、簡単にデバッグしたり、プロジェクト構成やパスなどを使用したりできます。
なぜこれが機能しないのですか。

from fabric.api import run

def host_type():
    run('uname -s')

if __name__ == '__main__':
    host_type()    
4

10 に答える 10

14

私は最終的に解決策を見つけました(そしてそれは本当に簡単です!)。
私のfabfileに、次のように追加しました。

from fabric.main import main

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

これが人々に役立つことを願っています...

于 2011-06-19T08:58:56.503 に答える
3

正しく思い出せば、FabricAPIに自分のやりたいことを実行させることもできませんでした。余分なレイヤーを完全に放棄し、Paramiko(Fabricで使用される基盤となるSSHライブラリ)を直接使用することにしました。

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()

さらにいくつかの手順が必要ですが、この方法で行うと、subprocess別のPythonインスタンスを起動したり、Fabric APIを理解したりするのではなく、SSHレイヤーを直接活用できます。このようにParamikoを使用するWebとコンソールの両方のプロジェクトがいくつかありますが、それほど問題はありません。

Paramikoは広範囲にわたって文書化されています

于 2010-07-19T07:26:43.340 に答える
2

上記の例を微調整して、ローカルコマンドに渡し、ハードコードされたコマンド名の代わりにオプションのdefault_commandsリストを指定したいargv引数を通過させました。ファイル名には.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()
于 2012-01-12T17:01:08.567 に答える
2

これは本当に良い解決策ではありませんが、機能します:

import subprocess

def hello():
    print 'Hello'

if __name__ == '__main__':
    subprocess.call(['fab', '-f', __file__, 'hello'])
于 2010-07-19T06:39:52.323 に答える
2

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

「そのセクションで述べているように、重要なのは、run、sudo、およびその他の操作が接続時に1か所でのみ表示されることです:env.host_string。ホストを設定するための他のすべてのメカニズムは、実行時にfabツールによって解釈されます。ライブラリとして実行する場合は関係ありません。」

私がこれを見つけたとき、私はこれと同じ問題を見ていました。また、見ているうちに、fabfileで使用する場合、envの変更をrun、sudoと同じdefに含めるべきではないことを思い出します。「ライブラリ」モードで使用した場合でも、これが適用されるかどうかは誰にもわかりません。

編集:これは前述の実装の例です

from fabric.api import env, run

def main():
    run("uname -a")

def setup():
    env.host_string = "me@remoteHost"

if __name__ == '__main__':
    setup()
    main()
于 2012-02-23T05:36:51.833 に答える
2
# 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()
于 2012-05-25T22:42:46.727 に答える
2

1.5.0以降、argvをいじるよりも、これを行うためのより良い方法があります。

import fabric.main

def main():
    fabric.main.main(fabfile_locations=[__file__])

if __name__ == "__main__":
    main()

これは、setup.pyのコンソールスクリプトとしても利用できます。

于 2013-08-22T00:59:41.393 に答える
1

これをfabファイルの最後に追加します。

if __name__ == '__main__':
  from fabric.main import main
  import sys

  sys.argv = ['fab', '-f', __file__] + sys.argv[1:]

  main()
于 2013-01-12T00:50:39.133 に答える
0

これはGregの回答を修正したもので、デフォルトの動作を変更して、大量のファブリックオプションを一覧表示する代わりに、使用可能なコマンドを表示します。

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__])
于 2014-04-21T10:26:33.727 に答える
0

fabfile.pyとパスワードなしのssh以外の名前に変更されたファブリックファイルの実行で間接的に解決策を見つけました

def deploy():
    ...

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

この方法は、ファイルに拡張子がない場合にも機能し.pyます。

于 2015-10-01T08:34:32.117 に答える