【问题标题】:Run multiple commands one host at a time一次在一台主机上运行多个命令
【发布时间】:2013-08-15 05:20:44
【问题描述】:

我运行的环境要求在复制 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")

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

【问题讨论】:

    标签: python deployment fabric env


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      您可以使用多线程来执行此操作,但 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'])
      

      参考:

      【讨论】:

        猜你喜欢
        • 2020-07-05
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2018-06-27
        • 2018-03-21
        相关资源
        最近更新 更多