基于fab自动化部署

fab是一个python库,强大好使,可以做很多帮助你减轻工作量的事情,比如在多台服务器上部署web项目,这里就讲讲使用它简单的方法来执行部署的过程。

关于fab的安装的基本使用,网上一搜一大把,内容都差不多,所以这里就不介绍,下载去官网:http://www.fabfile.org/

本文会涉及到以下几个内容:

  1. 自动SSH登录
  2. 运行命令
  3. 错误处理
  4. 带颜色输出

自动ssh登录

一般自动部署都不会只有一台机器,所以这里主要说多台机器,当然,一台也是一样的

首先,导入库

1 from fabric.api import *

fabric.api里封装了很多的方法,用来做一般的事情,两个方法就够了

1. run() 用于执行命令
2. cd() 用于进入目录

跑题了,基本操作用这两个就可以了,具体操作后面再讲,回到ssh登录上,我们知道,登录3要素,用户,地址和密码,所以先就定义一下。当然,不能随便定义,得按fab的方法来

1 # 定义host
2 # 方法 env.hosts = [‘[email protected]‘, ‘[email protected]‘]
3 # 示例
4 env.hosts = [‘[email protected]‘, ‘[email protected]‘]
5
6 # 设置密码
7 # 方法 env.passwords = {‘host1:22‘: ‘password1‘, ‘host2:22‘: ‘password2‘}
8 # 示例
9 env.passwords = {‘[email protected]:22‘: ‘1234565‘, ‘[email protected]‘: ‘ojoajewpb‘}

这里要特别说明一下,在passwords里host一定要带上端口,默认端口本身来讲是不用带的,但在这里,如果要让密码跟host对上,就必须带着端口号才能成功。

env.passwords用于服务器的密码不一至的情况,如果几台服务器的密码都是相同的,可以直接使用env.password = ‘123456‘

运行命令

正如前面所说,主要命令是run,它可以执行命令,如

 1 # 执行单条命令
 2 run("ls -l")
 3 run("echo ‘hello‘")
 4
 5 # 执行多条命令
 6 run("ls -l; echo ‘hello‘")
 7
 8 # 带变量的也一样,看看kill tomcat进程的命令
 9 # 获取到pid,然后执行kill命令,就这么简单
10 run("pid=`(ps -ef | grep tomcat | grep -v \"grep\") | awk ‘{print $2}‘`; kill -9 $pid")

再来说说cd命令,可能有人会说,既然run可以运行命令,那直接run("cd deploy")不就可以了嘛。事实证明,看上去对的,不一定真对,这个命令没错,是执行了,但它没进去,真的,很假,等于是告诉你:哥,我进去了哦,但没动,所以后面要做的操作,还是在当前目录下的,不信可以试

1 run(‘cd deploy‘)
2 run(‘ls -l‘)

看输出的目录是哪儿就明白了。不过虽然没进去,但如果执行run(‘cd deploy‘)时,没有deploy这个目录,程序是会报错的,有病,是不是。那要怎么做呢,这里就到cd方法出场了,不过光是它也不行,还要和with一起用:

1 with cd(‘deploy‘):
2     run(‘ls -l‘)

看看输出,是不是已经到deploy目录了,这样就可以执行艇作用于该目录的命令了

错误的处理

标准Python程序,出错程序就停止结束了,很多时间,也许并不想让它就此结束,想让它跳过继续执行后面的,那这里就要用到fab的错误处理方法了

使用错误处理,首先得告诉fab,我要进行这样的处理,它才会去处理,所以先得说一下:

1 with settings(warn_only = true):
2     pass

warn_only = true就是在告诉fab这个事情,有了这一句,后面的语句都能享受到。

再说一个,run的每一条命令都有返回,成功或失败,判断,如果失败,执行confirm方法,来提示确认要不要继续,如:

1 # 导入confirm
2 from fabric.contrib.console import confirm
3
4 res = run(‘cd deploy‘) # 没有deploy这个目录
5 if res.failed and not confirm("cd deploy failed, Continue?"):
6     abort(‘Abort‘)

运行上面的程序,res就会得到返回,这时候用res.failed来判断是否失败,如果失败,执行comfirm等待确认,如果选择N,执行abort终止程序

带颜色输出

这个其没什么用,只是想让输出漂亮一点,所以就说一下,方法很简单,使用colors包

1 # 导入包
2 from fabric.colors import *
3
4 print green(‘green txt‘)
5 print red(‘red txt‘)
6 print yellow(‘yellow txt‘)

太简单了

看一个完整一点的示例

应用场景:
共有4台服务器,要做Java Spring项目部署,服务器使用的tomcat
1. 登录第一台服务器
2. 进入jar包的目录
3. 使用git拉取新的jar包
4. 停止tomcat
5. 删除web目录,有可能多个
6. 将jar包拷到服务目录中,有可能性于多个不同的目录
7. 启动tomcat

登录下一台服务器循环

 1 # -*- coding:utf-8 -*-
 2 from fabric.api import *
 3 from fabric.contrib.console import confirm
 4 from fabric.colors import *
 5
 6 env.hosts = [‘host1‘, ‘host2‘, ‘host3‘, ‘host4‘]
 7 env.passwords = {‘host1:22‘: ‘password1‘, ‘host2:22‘: ‘password2‘, ‘host3:22‘: ‘password3‘, ‘host4:22‘: ‘password4‘}
 8
 9 def getRedMessage(txt, t):
10     return "[%s] faield, Continue?" % txt if t == ‘msg‘ else "Aborting at [%s]" % txt
11
12 def gitPull():
13
14     actionName = "get pull"
15
16     res = run(‘git pull origin master‘)
17     if res.failed and not confirm(getRedMessage(actionName, ‘msg‘)):
18         abort(getRedMessage(actionName, ‘abort‘))
19
20 def copyFile():
21
22     actionName = "copy file"
23
24     res = run(‘cp -rf jar/* /jardir/; cp -rf war/* /warjar/‘)
25     if res.failed and not confirm(getRedMessage(actionName, ‘msg‘)):
26         abort(getRedMessage(actionName, ‘abort‘))
27
28 def delWeb():
29
30     actionName = "delete web"
31
32     res = run(‘rm -rf /webapps/*‘)
33     if res.failed and not confirm(getRedMessage(actionName, ‘msg‘)):
34         abort(getRedMessage(actionName, ‘abort‘))
35
36 def stopTomcat():
37
38     actionName = "stop tomcat"
39
40     res = run("pid=`(ps -ef | grep tomcat | grep -v \"grep\") | awk ‘{print $2}‘`; kill -9 $pid")
41     if res.failed and not confirm(getRedMessage(actionName, ‘msg‘)):
42         abort(getRedMessage(actionName, ‘abort‘))
43
44 def startTomcat():
45
46     action = "start tomcat"
47
48     res = run("/sh/start.sh")
49     if res.failed and not confirm(getRedMessage(actionName, ‘msg‘)):
50         abort(getRedMessage(actionName, ‘abort‘))
51
52 def doploy():
53
54     with settings(warn_only = true):
55         with cd(‘cd deploy‘):
56             res = run(‘ls -l‘)
57             if res.failed and not confirm(getRedMessage(‘cd deploy‘, ‘msg‘)):
58                 abort(getRedMessage(‘cd deploy‘, ‘abort‘))
59
60             gitPull()
61
62             stopTomcat()
63
64             delWeb()
65
66             copyFile()
67
68             startTomcat()

将上面的代码保存为fabfile.py文件,只有这个文件名,fab默认才能找到它,不然就要使用参数-f来加载文件名,在终端里运行:

fab deploy

好了,fab还有很多方法可以实现一些更加方便的操作,没事可以翻翻Docs,http://docs.fabfile.org/en/latest/tutorial.html

时间: 2024-08-04 10:43:12

基于fab自动化部署的相关文章

基于ansible自动化部署nginx+mysl+php分离来实现lnmp

实验说明: 服务角色 IP 系统 需安装 主控机 192.168.24.128 centos7 ansible A受控机 192.168.24.130 centos7 nginx B受控机 192.168.24.131 centos7 mysql C受控机 192.168.24.132 centos7 php-fpm 实验需求: 在主控机上使用自动化运维工具ansible在A受控机上安装nginx,在B受控机上安装mysql,在C受控机上安装php-fpm,实现lnmp构架 实验步骤 在主控机上

gitlab+jenkins自动化部署

基于gitlab和jenkins的自动化部署 Gitlab基于Jenkins自动化部署教程: https://blog.csdn.net/aaaaaab_/article/details/82012044 https://www.cnblogs.com/dengbingbing/p/10448185.html GitLab是一个代码仓库,用来管理代码. Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务.所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenki

基于fabric和hg的自动化部署

自动化部署 fabric是个很好用的自动化部署工具,虽然功能比起puppet,saltstack之类要弱一些,但胜在用python,而且免安装服务端. 当然你要说docker更好我也同意,然而我是经常使用FreeBSD的,而且还有一些32位的低配系统,并不适合用docker.更不用说虚拟机了. 自动化部署的目的主要是简化手工部署的麻烦,包括初次安装部署和代码修改后的更新部署.初始部署主要是安装基础环境,初始化数据库等.更新部署则更麻烦一些,需要修改基础环境配置,变更数据库结构等.相比之下代码发布

基于Jenkins,docker实现自动化部署(持续交付)

前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此,传统的人工部署已经心有余而力不足.持续集成,持续部署,持续交互对于微服务开发来说,是提高团队整体效率不可或缺的一环.合理的使用CI,CD能够极大的提高了生产效率,也提高了产品的交互质量.本文不对三个概念做过多的介绍,有兴趣可以读读这篇文章:The Product Managers' Guide to

基于Jenkins Pipeline自动化部署

最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么优秀,那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并且实现多分支构建,还实现了所有项目共享一个Pipeline脚本. 使用Jenkins前的一些设置 为了

基于Jenkins+Gitlab的自动化部署实战

故事背景 一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到2~3人,此时随着公司的发展,项目会逐渐增多.前期部署项目可能都是手动的, 俗称"人肉部署",这简直是无比的痛苦,不能忍受的.这样开发的时间也会耽误,运维的时间也会耽误,全都浪费在这些重复性的工作上面,毫无价值可言, 这时候运维终于忍受不了,上了脚本.但是慢慢的发现项目依旧在增长,脚本每次还要更改给开发,效率低下,后来测试环境以及开发环境直接上了jeknins, 每台开发机器是jeknins agent端,自此

Linux基于PXE实现系统自动化部署

一.前言: 通常为计算机安装操作系统的方式主要是,光盘安装和U盘安装:在企业生产环境中,会需要对多台客户机或服务器安装Linux操作系统,如果还用常规的方法去安装,费时又费力:PXE批量部署系统即可高效完成此类工作. 二.原理: 使用光盘(镜像)安装Linux操作系统过程:POST(加电自检)-->引导序列(通过BISO发现引导CD-ROM或U盘)--Bootloader(kernel+ramdisk)-->anaconda(安装程序) 1.自动化部署服务器所需环境: PXE:Preboot

python 自动化部署工具Fabric简介

自动化部署工具Fabric简介 Fabric就是一个帮助我们在上线时减少重复/繁琐操作的自动化部署利器,对于缺乏成熟运维平台的众多小公司的运维或开发人员来说,掌握这个工具是有必要的. 1. Fabric是什么 Fabric官方文档的描述如下:      Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or sy

MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

Technorati 标签: 那你魔鬼 一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读