web-dev-qa-db-ja.com

ファブリック2でローカルコマンドを実行するにはどうすればよいですか?

追加の接続を確立せずに、Fabricを使用してローカルでコマンドを実行したい。

fabric 2でこれを行うにはどうすればよいですか? ... documentation は、例を示すのに欠けているようです。

17
sorin

ファブリック2でlocalコマンドを削除するという設計上の決定はPITA IMHOですが、Contextの代わりにInvokeのConnectionを使用してシミュレーションすることができました。

from fabric import Connection
from invoke.context import Context

@task
def hostname(c):
    c.run('hostname')

@task
def test(c):
    conn = Connection('user@Host')
    hostname(conn)
    local_ctx = Context(c.config)  # can be passed into @task;
                                   # Connection is a subclass of Context
    hostname(local_ctx)
4
phoibos

run、Sudo、およびlocalは同じように実行されます。

from fabric import Connection                                                                                  

cn = Connection('[email protected]')    # presumes ssh keys were exchanged                                        

cn.run('ls -al')     # assuming ssh to linux server - as scott                  
cn.Sudo('whoami')    # as root                                                  
cn.local('echo ---------- now from local')                                      
cn.local('dir /w')   # assuming client is windows                               
0
DataBlox

Connection.localで問題が発生したため、@ TheRealChx101のコメントを回答者として追加しています。すべての環境変数がptyに入ったわけではないため、一部のスクリプトが正しく機能しませんでした。

import from invoke run as localスタンザ(Fabricの代わりにInvokeのローカル)を使用すると、すべてが正常に機能しました。

0
RickyA