本地和远程平台上的Python结构部署

本地和远程平台上的Python结构部署,python,fabric,Python,Fabric,我使用fabric来自动化我在本地机器或远程服务器上运行的许多任务 所有任务都是单独完成的。但我想要的是有一个新的任务,在本地机器上做一些工作(构建映像,并上传),在服务器上做一些工作(重新加载服务器) 如果我手动运行这些命令,它们将正常工作: fab build_file fab remote deploy_file 以下是一个输出: > fab remote deploy_file [localhost] Executing task 'remote' [docker.me] Exe

我使用fabric来自动化我在本地机器或远程服务器上运行的许多任务

所有任务都是单独完成的。但我想要的是有一个新的任务,在本地机器上做一些工作(构建映像,并上传),在服务器上做一些工作(重新加载服务器)

如果我手动运行这些命令,它们将正常工作:

fab build_file
fab remote deploy_file
以下是一个输出:

> fab remote deploy_file
[localhost] Executing task 'remote'
[docker.me] Executing task 'deploy_file'
[docker.me] run: echo 'reload image'
[docker.me] out: reload image
[docker.me] out:


Done.
Disconnecting from docker.me... done.
但如果我尝试将本地和远程任务结合起来,我会得到:

> fab do_all
[localhost] Executing task 'do_all'
[localhost] local: echo 'make image'
make image
[localhost] local: echo 'upload image'
upload image
[localhost] run: echo 'reload image'

Fatal error: Low level socket error connecting to host localhost on port 22: Connection refused (tried 1 time)

Underlying exception:
    Connection refused

Aborting.
有没有办法在单个Uber任务中同时执行本地和远程任务

My fabfile.py:

from fabric.api import *

env.run = local
env.hosts = ['localhost']

@task
def remote():
    env.run = run
    env.hosts = ["docker.me"]

@task
def build_file():
    env.run("echo 'make image'")
    env.run("echo 'upload image'")


@task
def deploy_file():
    env.run("echo 'reload image'")


@task
def do_all():
    build_file()
    remote()
    deploy_file()

我可能没抓住重点,但你为什么不干脆做点这样的事呢

from fabric.api import *

env.hosts = ['docker.me']

@task
def all():
    local("echo 'make image'")
    local("echo 'upload image'")
    run("echo 'reload image'")
编辑:

我明白了。你的代码基本上没问题。只有一个小细节。使用以下代码,您应该可以:

from fabric.api import *

env.run = local
env.hosts = ["docker.me"] # change this!

@task
def remote():
    env.run = run

@task
def build_file():
    env.run("echo 'make image'")
    env.run("echo 'upload image'")

@task
def deploy_file():
    env.run("echo 'reload image'")

@task
def do_all():
    build_file()
    remote()
    deploy_file()

谢谢你的回答。原因是我想在本地服务器上运行相同的东西或删除服务器。fab remote xxx上的模式非常方便。我可以通过在任务之前放置一个遥控器,在本地或远程运行一些东西。您建议的只能在本地运行。使用函数remote()的目的是动态设置主机。您已经将所有内容硬编码到了远程主机,但没有做到这一点。:-)@戴维德汉,我刚刚找到了解决你问题的办法。答案可能是使用fabric的
execute
。例如,见。这是你想要的吗?