目录

Python 自动化部署工具 Fabric 简介

Install

准备

python 3.5

pip 3.5

安装

1
sudo pip3.5 install fabric

常用命令

1
2
3
4
5
6
7
8
fab ...     # 执行
fab --help
fab -l      # 显示可用的task(命令)
fab -H      # 指定host,支持多个host,以逗号分开
fab -R      # 指定role,支持多个role
fab -P      # 并发数,默认串行
fab -w      # warn_only,默认遇到异常直接abort退出
fab -f      # 指定入口文件,默认fabfile.py

常用函数

1
2
3
4
5
6
7
lcd('/tmp')         # 切换本地目录
cd('/tmp')          # 切换远程目录

local('pwd')        # 执行本地命令
run('uname -a')     # 执行远程命令

sudo('/etc/init.d/nginx start')     # 执行远程sudo

远程服务器定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
host1 = 'user@192.168.1.1:22'
host2 = 'user@192.168.1.2:22'
host3 = 'user@192.168.1.3:22'

env.hosts = [ host1, host2, host3 ]

env.passwords = {
    host1: "pwd_of_host1",
    host2: "pwd_of_host2",
    host3: "pwd_of_host3",
}

或者

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
env.roledefs = {
    'nginx_user': [host1, host2],
    'mysql_user': [host3]
}

env.passwords = {
    host1: "pwd_of_host1",
    host2: "pwd_of_host2",
    host3: "pwd_of_host3",
}

ssh keyfile

1
2
3
4
env.key_filename = ['/opt/fab/server_key']
env.user = 'tomcat'
env.password = '111111'
env.port = '2862'

目录的切换

1
2
3
4
with cd('/opt/tomcat')	# 远程
    run('set -m ;  ./bin/startup.sh')
with lcd('/opt/tomcat') # 本地
    run('pwd')

上传下载文件

1
2
get('/remote/path/','/local/path/')
put('/local/path/','/remote/path')

使用的是sftp协议

判断文件或目录是否存在

1
2
3
4
5
6
from fabric.contrib.files import exists
    
if exists('/opt/tomcat/logs/catalina.out'):
    print 'catalina.out exist'    
else:
    print 'catalina.out not exist'

DEMO

在本地打包maven项目,并上传到服务器部署。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from fabric.api import *
import time

env.hosts = ['root@192.168.0.1:22']  # ip 端口
env.password = 'password'  # 密码


# local() 执行本地命令
def mvn_pack():
    print("------------------------------------ 开始打包项目 ------------------------------------")
    with lcd("/Users/elong/IdeaProjects/****/"):  # 进入本地目录
        local("mvn clean")
        local("mvn package")


# run() 执行远程服务器的命令
def put_pack():
    print("------------------------------------ 备份服务器原项目 ------------------------------------")
    run("mv ... ..." + time.strftime("%m%d", time.localtime()))
    print("------------------------------------ 开始上传项目包 ------------------------------------")
    put("本地路径", "远程路径")
    print("------------------------------------ 重启Tomcat并打印日志 ------------------------------------")
    run("set -m ; /etc/init.d/tomcat restart")
    time.sleep(2)
    run("tail -f /home/tomcat/logs/catalina.out")


def start():
    mvn_pack()
    put_pack()

使用自动部署,可以省去每天重复的事情,只需要看下日志是否启动成功即可,提高了生产效率。也可配合Jenkins实现可视化的自动部署、持续集成等工作。

参考文章

http://blog.csdn.net/sijiazhaiyuan/article/details/23884873