在本地运行结构脚本

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

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

有没有办法做到这一点,而不提供SSH用户名和密码?

我的意思是“-H localhost”?

谢谢Alex A.

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

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

 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的回答优雅,但也许更实际的默认情况下在本地机器上运行,除非另外的环境select器给出。

 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到本地主机。 然后用“-H localhost”运行脚本。 为我完美的作品。

首先,请确保你可以不用密码ssh到你的本地主机:

$ ssh-copy-id localhost

然后像你说的那样用-H localhost命令行选项运行它

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