Djangoアプリがあり、展開サーバー(Cent OS 5)にアプリをインストールするファブリックスクリプトを書きました。
次に、同じファブリックスクリプトを展開サーバーでローカルに実行します。
Sshユーザーとパスワードを入力せずにそれを行う方法はありますか?
「-H localhost」だけのことですか?
ありがとう、Alex A.
はい、runの代わりにlocalメソッドを使用して、fabをローカルで実行できます。私が通常行うことは、環境をセットアップするためのメソッドがあり、実際のタスクを呼び出す前にこれらのメソッドを最初に呼び出すことです。特定の質問の例でこれを説明しましょう
from fabric.operations import local as lrun, run
from fabric.api import task
from fabric.state import env
@task
def localhost():
env.run = lrun
env.hosts = ['localhost']
@task
def remote():
env.run = run
env.hosts = ['some.remote.Host']
@task
def install():
env.run('deploymentcmd')
そして、環境に基づいて、次のことができます
ローカルホストにインストール:
fab localhost install
リモートマシンにインストールします。
fab remote install
リモートタスクをローカルで実行するために別のトリックを使用しています:
from fabric.api import run, Sudo, local
from contextlib import contextmanager
@contextmanager
def locally():
global run
global Sudo
global local
_run, _Sudo = run, Sudo
run = Sudo = local
yield
run, Sudo = _run, _Sudo
def local_task():
with locally():
run("ls -la")
Varunの答え よりも少しエレガントではありませんが、別の環境セレクターが指定されていない限り、デフォルトでローカルマシンで実行する方が実用的かもしれません。
from fabric.api import *
# default to running on localhost
env.hosts = ["localhost"]
DEPLOYMENT_PATH = "/some/path/{}/"
def local_or_remote(*args, **kwargs):
func = local if env.Host == "localhost" else run
return func(*args, **kwargs)
@task
def live():
"""
Select live environment
"""
env.hosts = ["Host1", "Host2"]
env.path = DEPLOYMENT_PATH.format("live")
@task
def beta():
"""
Select beta environment
"""
env.hosts = ["Host1", "Host2"]
env.path = DEPLOYMENT_PATH.format("beta")
@task
def Host_info():
local_or_remote("uname -a")
次に、次のようにローカルで実行します。
fab Host_info
またはリモートで:
fab live Host_info
PS。これがこのトピックの Githubの問題 です。
まず、パスワードなしでローカルホストにsshできることを確認してください:
$ ssh-copy-id localhost
そして、あなたが言ったように、-H localhost
コマンドラインオプション
ローカルマシンでsshサーバーを実行して、ローカルホストにsshできます。そして、 "-H localhost"でスクリプトを実行します。私にとっては完璧に機能します。
ローカルのstdout/stderrをキャプチャしないことを考慮した Varunの回答 の変更バージョン。 capture = Trueを指定しないと、ローカルから結果を取得できません。
from fabric.operations import local, run
from fabric.api import task
from fabric.state import env
def local_run(*args):
return local(args[0], capture=True)
@task
def localhost():
env.run = local_run
env.hosts = ['localhost']
@task
def remote():
env.run = run
env.hosts = ['some.remote.Host']
@task
def install():
env.run('deploymentcmd')