Skip to main content

Fabric 并发方式执行项目部署命令

Fabric 并发方式执行项目部署命令

Fabric 并发方式执行项目部署命令

最近做运维工作,遇到项目部署的问题,不过通过python库fabric也是可以解决问题的

而且还是很方便,大概的方式如下

强调下,这里使用的是fabric 2这个版本

原理也是简单就是,fabric提供了ThreadingGroup这个类,网上很少有人用吧,google很久才找到

先看下以前的并行的方式,是如何执行项目部署命令的

代码如下

import getpass
from fabric import Connection, task
from invoke import Responder

hosts = [
    # service online machine
    '127.0.0.1',  # web1
    '127.0.0.2',  # web2
    '127.0.0.3',  # web3
]

user = input('Input username:')
auth_pass = getpass.getpass('Input password:')
sudo_pass = Responder(
    pattern=r'\[sudo\] password',
    response=auth_pass + '\n',
)


@task
def deploy_series(c):
    for host in hosts:
        conn = Connection('%[email protected]%s' % (user, host),
                          connect_kwargs={'password': auth_pass})
        command = 'ls -al /'
        res = conn.run(command, pty=True, watchers=[sudo_pass])
        print(res)

示例代码简单的执行了ls -al /命令

上面的方式就是一台跟着一台机器的进行命令的执行,总的时间是没台机器执行完的时间总和,着实有点慢,影响代码上线的效率

下面看下并行的方式,并发的方式是如何运行的

代码如下

import getpass
from fabric import Connection, task
from invoke import Responder
from fabric import SerialGroup, ThreadingGroup
from fabric.exceptions import GroupException

hosts = [
    # service online machine
    '127.0.0.1',  # web1
    '127.0.0.2',  # web2
    '127.0.0.3',  # web3
]

user = input('Input username:')
auth_pass = getpass.getpass('Input password:')
sudo_pass = Responder(
    pattern=r'\[sudo\] password',
    response=auth_pass + '\n',
)

@task
def deploy_parallel(c):
    g = ThreadingGroup(*hosts,
                       user=user,
                       connect_kwargs={'password': auth_pass})
    try:
        command = 'ls -al /'
        res = g.run(command, pty=True, watchers=[sudo_pass])
        print(res)
    except GroupException as e:
        for c, r in e.result.items():
            print(c)
            print(r)

同样的也只是执行命令而已

但是执行的顺序是并发的方式,总的执行时间是执行时间最长的那台机器的时间,很大程度提高了上线代码的执行效率。

 

版权声明

版权声明

张大鹏 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(https://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:https://www.walkerfree.com/article/201