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