web-dev-qa-db-ja.com

ローカルでのファブリックスクリプトの実行

Djangoアプリがあり、展開サーバー(Cent OS 5)にアプリをインストールするファブリックスクリプトを書きました。

次に、同じファブリックスクリプトを展開サーバーでローカルに実行します。

Sshユーザーとパスワードを入力せずにそれを行う方法はありますか?

「-H localhost」だけのことですか?

ありがとう、Alex A.

41
alexarsh

はい、runの代わりにlocalメソッドを使用して、fabをローカルで実行できます。私が通常行うことは、環境をセットアップするためのメソッドがあり、実際のタスクを呼び出す前にこれらのメソッドを最初に呼び出すことです。特定の質問の例でこれを説明しましょう

fabfile.py

    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
79
Varun Katta

リモートタスクをローカルで実行するために別のトリックを使用しています:

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")
7
xuhcc

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の問題 です。

4
Pieter Ennes

まず、パスワードなしでローカルホストにsshできることを確認してください:

$ ssh-copy-id localhost

そして、あなたが言ったように、-H localhostコマンドラインオプション

3
Aníbal Rivero

ローカルマシンでsshサーバーを実行して、ローカルホストにsshできます。そして、 "-H localhost"でスクリプトを実行します。私にとっては完璧に機能します。

2

ローカルの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')
0
dbainbridge