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

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

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

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

自动ssh登录

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

首先,导入库

 from fabric.api import *

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

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

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

 # 定义host
# 方法 env.hosts = ['user@host1', 'user@host2']
# 示例
env.hosts = ['onlyfu@unjs.dinlei.com', 'root@unjs.dinlei.com'] # 设置密码
# 方法 env.passwords = {'host1:22': 'password1', 'host2:22': 'password2'}
# 示例
env.passwords = {'onlyfu@unjs.dinlei.com:22': '', 'root@unjs.dinlei.com': 'ojoajewpb'}

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

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

运行命令

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

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

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

 run('cd deploy')
run('ls -l')

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

 with cd('deploy'):
run('ls -l')

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

错误的处理

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

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

 with settings(warn_only = true):
pass

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

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

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

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

带颜色输出

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

 # 导入包
from fabric.colors import * print green('green txt')
print red('red txt')
print yellow('yellow txt')

太简单了

看一个完整一点的示例

应用场景:
共有4台服务器,要做Java Spring项目部署,服务器使用的tomcat
1. 登录第一台服务器
2. 进入jar包的目录
3. 使用git拉取新的jar包
4. 停止tomcat
5. 删除web目录,有可能多个
6. 将jar包拷到服务目录中,有可能性于多个不同的目录
7. 启动tomcat 登录下一台服务器循环
# -*- coding:utf- -*-
from fabric.api import *
from fabric.contrib.console import confirm
from fabric.colors import * env.hosts = ['host1', 'host2', 'host3', 'host4']
env.passwords = {'host1:22': 'password1', 'host2:22': 'password2', 'host3:22': 'password3', 'host4:22': 'password4'} def getRedMessage(txt, t):
return "[%s] faield, Continue?" % txt if t == 'msg' else "Aborting at [%s]" % txt def gitPull(): actionName = "get pull" res = run('git pull origin master')
if res.failed and not confirm(getRedMessage(actionName, 'msg')):
abort(getRedMessage(actionName, 'abort')) def copyFile(): actionName = "copy file" res = run('cp -rf jar/* /jardir/; cp -rf war/* /warjar/')
if res.failed and not confirm(getRedMessage(actionName, 'msg')):
abort(getRedMessage(actionName, 'abort')) def delWeb(): actionName = "delete web" res = run('rm -rf /webapps/*')
if res.failed and not confirm(getRedMessage(actionName, 'msg')):
abort(getRedMessage(actionName, 'abort')) def stopTomcat(): actionName = "stop tomcat" res = run("pid=`(ps -ef | grep tomcat | grep -v \"grep\") | awk '{print $2}'`; kill -9 $pid")
if res.failed and not confirm(getRedMessage(actionName, 'msg')):
abort(getRedMessage(actionName, 'abort')) def startTomcat(): action = "start tomcat" res = run("set -m; /sh/start.sh") # 启动另外的程序,需加上set -m;因为如果不加,启动会随着python进程的结束而结束,达不到启动的目的。关于set -m,可以去查查资料
if res.failed and not confirm(getRedMessage(actionName, 'msg')):
abort(getRedMessage(actionName, 'abort')) def doploy(): with settings(warn_only = true):
with cd('cd deploy'):
res = run('ls -l')
if res.failed and not confirm(getRedMessage('cd deploy', 'msg')):
abort(getRedMessage('cd deploy', 'abort')) gitPull() stopTomcat() delWeb() copyFile() startTomcat()

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

fab deploy

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

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

  1. 基于saltstack自动化部署高可用kubernetes集群

    SaltStack自动化部署HA-Kubernetes 本项目在GitHub上,会不定期更新,大家也可以提交ISSUE,地址为:https://github.com/skymyyang/salt-k8 ...

  2. [转]基于AWS的自动化部署实践

    作者 徐桂林 发布于 2014年1月22日 -------------------------------------------------------------------- 1. 背景 在过去 ...

  3. 基于AWS的自动化部署实践

    过年前,我给InfoQ写了篇文章详细介绍我们团队在过去4年基于AWS的自动化部署实践.文章包括了:为什么选择AWS.AWS上自动化部署的优势和挑战.我们的解决方案,以及和AWS DevOps方案(Op ...

  4. node项目自动化部署--基于Jenkins,Docker,Github(1)安装Jenkins

    前言 每次项目代码更新后都要重新部署,如果只有一台服务器还好. 但是如果是分布式系统,动不动就很多台服务器,所以代码的自动部署就显得十分重要了. 这里用几篇文章来记录一下如何使用Jenkins,Doc ...

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

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  6. 基于Jenkins,docker实现自动化部署(持续交互)【转】

      前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致.基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化.因此 ...

  7. 博客 | 基于Travis CI实现Hexo在Github和Coding的同步自动化部署

    文章目录 完成Hexo主题安装和配置 基于Travis CI实现同步部署 参考内容 相关链接 待补充 完成Hexo主题安装和配置 如果您还没有安装Hexo环境,请参考Hexo文档安装,也给出这样两篇博 ...

  8. 基于 Jenkins Pipeline 自动化部署

    最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置 ...

  9. PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版)

    PHP 基于 Jenkins ansible 动态选择版本进行自动化部署与回滚(第二版) 先看流程图: 大概介绍一下: 版本选择使用jenkins 中的 git parameter 插件实现 回滚方式 ...

随机推荐

  1. [转]TextView maxWidth maxLength maxEms 区别

    maxWidth=”80dp” 限制TextView最大宽度.必须与layout_width=”wrap_content”搭配使用,当指定layout_width为其他值时,maxWidth会失效. ...

  2. go:defer

    defer:延迟. 假设有调用函数A.被调用函数B,其关系如下: func A(){//调用函数 ... defer B()//被调用函数 ... return//B将延迟到return前执行 } * ...

  3. tp5 中 model 的查询方法

    实例化模型后调用查询方法,可以写任何想要的查询(推荐) public function select(){ $user = model('User'); $data = $user -> ) - ...

  4. 同步异步,阻塞非阻塞 和nginx的IO模型

    同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...

  5. UE移植到SAE云平台

    应用架在新浪的SAE上,而同时功能中又需要用上编辑器,鉴于百度的UEditor功能强大,可定制,文档全,所以理所当然的用它.而新浪把本地文件的IO操作禁止了,使得UEdiotr的图片上传.附件和在线涂 ...

  6. [Java 基础]sun.misc.Unsafe

    使用Unsafe可以干一些好事. Unsafe对象初始化 如果你的代码属于trusted的,可以直接使用下面的方式: public static Unsafe getUnsafe() { Class ...

  7. 8-05分支结构CASE..END

    语法: CASE WHEN  条件1 THEN 结果1 WHEN  条件2  THEN 结果2 ...ELSE  其他结果 END 执行顺序: 条件1成立执行结果1 条件2成立执行结果2 如果所有WH ...

  8. 常见开发需求之js处理url汉字编码中的乱码

    需求及解决    两个页面传值的需求是很常见的,angular中有很多常见的方法用于传值,而且都不会受到字符编码的影响,而采用传统的url中拼字符串进行传值的操作,如果拼串中涉及到中文字符,我们就要考 ...

  9. Vitamio

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  10. Listview的使用

    最近一个多月忙着使用新的技术来做项目,现在项目上线了,嗯,发现android有些生疏了,所以今天特地写了这一篇博客来相信的讲解一些基础知识,同事呢,也可以让我温故知新一下.进入正题. 什么是listv ...