我正在运行的环境要求在复制Web应用程序文件之前停止服务器。所以我想使用fabric执行以下任务:
如果我想部署到20台主机,我会做这样的事情......
def deploy:
run("server stop")
run("rsync ...")
run("server start")
...当每个服务器首次关闭时会出现不必要的停机时间,然后文件会同步到所有服务器,最后所有服务器都会重新启动。这源于在每个主机上执行“run”命令的事实。
是否有一种优雅的方法可以在每台主机上运行多个命令?这是我正在寻找的天真的东西:
for host in env.hosts
env.host = host
run("server stop")
run("rsync ...")
run("server start")
我确实看到有能力让“运行”命令并行发生,但这并不是我正在寻找的。 p>
答案 0 :(得分:1)
我认为你的第一个例子应该做你想做的事。
这将首先在服务器A上运行所有三个命令,然后在服务器B上运行,依此类推......
def deploy():
run("server stop")
run("rsync ...")
run("server start")
如果你想停止所有服务器,然后更新所有服务器,最后重新启动它们,你可以写:
def stop_server():
run("server stop")
def update_server():
run("rsync ...")
def start_server():
run("server start")
@runs_once
def deploy():
execute(stop_server)
execute(update_server)
execute(start_server)
答案 1 :(得分:0)
您可以使用多线程执行此操作,但是Fabric已经在并行模块中为您执行此操作。
e.g:
from time import sleep
from fabric.api import parallel, run, execute
@parallel
def parallel_ls():
run("ls /")
sleep(5)
if __name__ == '__main__':
execute(parallel_ls, hosts=['127.0.0.1', 'localhost'])