1

我正在运行的环境要求在复制 Web 应用程序文件之前停止服务器。所以我想使用织物执行以下一组任务:

  1. 停止服务器
  2. 复制新文件
  3. 重启服务器

如果我想部署到 20 台主机,我会做这样的事情......

def deploy:
  run("server stop")
  run("rsync ...")
  run("server start")

...将有不必要的停机时间,因为首先关闭每台服务器,然后将文件同步到所有服务器,最后重新启动所有服务器。这源于“运行”命令在每个主机上执行的事实。

有没有一种优雅的方法可以在每个主机上运行多个命令?这是我正在寻找的天真的刺:

for host in env.hosts
   env.host = host
   run("server stop")
   run("rsync ...")
   run("server start")

我确实看到有能力让“运行”命令并行发生,但这并不是我想要的。

4

2 回答 2

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)
于 2013-08-17T15:06:04.557 回答
0

您可以使用多线程来执行此操作,但 Fabric 已经在并行模块中为您执行此操作。

例如:

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

参考:

于 2013-08-15T08:02:09.523 回答