在本地运行Fabric脚本

时间:2011-07-17 16:35:28

标签: django fabric

我有一个django应用程序,我编写了一个结构脚本,可以在部署服务器(Cent OS 5)上安装我的应用程序。

现在我想在部署服务器上本地运行相同的结构脚本。

有没有办法在不提供ssh用户和密码的情况下执行此操作?

我的意思是“-H localhost”?

谢谢Alex A.

6 个答案:

答案 0 :(得分:77)

是的,您可以使用本地方法而不是运行在本地运行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')

根据环境,您可以执行以下操作

在localhost上安装:

    fab localhost install

在远程计算机上安装:

    fab remote install

答案 1 :(得分:7)

我正在使用另一种技巧在本地执行远程任务:

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

答案 2 :(得分:4)

稍微不如Varun's answer那么优雅,但是默认在本地机器上运行可能更实用,除非给出另一个环境选择器。

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 issue

答案 3 :(得分:3)

首先,确保您可以在没有密码的情况下进入本地主机:

$ ssh-copy-id localhost

然后按照你所说的那样使用-H localhost命令行选项

运行它

答案 4 :(得分:2)

您可以在本地计算机上运行ssh服务器,以便能够ssh到localhost。然后使用" -H localhost"运行脚本。适合我。

答案 5 :(得分:0)

Varun's answer的修改版本,考虑到本地不捕获stdout / stderr。如果不指定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')