我有一个django应用程序,我编写了一个结构脚本,可以在部署服务器(Cent OS 5)上安装我的应用程序。
现在我想在部署服务器上本地运行相同的结构脚本。
有没有办法在不提供ssh用户和密码的情况下执行此操作?
我的意思是“-H localhost”?
谢谢Alex A.
答案 0 :(得分:77)
是的,您可以使用本地方法而不是运行在本地运行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')
根据环境,您可以执行以下操作
在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')