一次运行一个主机的多个命令

时间:2013-08-15 05:20:44

标签: python deployment fabric env

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

  1. 停止服务器
  2. 复制新文件
  3. 重启服务器
  4. 如果我想部署到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")
    

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

2 个答案:

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

参考: