fabric 自动化部署
fabric
项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上。
修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D,E(1分钟),分别ssh到ABCDE五台机器,逐一重启(8-10分钟) = 13-15分钟
其中郁闷的是,每次操作都是相同的,命令一样,要命的是在多个机器上,很难在本机一个脚本搞定,主要时间都浪费在ssh,敲命令上了,写成脚本,完全可以一键执行,花两分钟看下执行结果。
安装
pip install fabric
入门示例
#fabfile.py
from fabric.api import run def host_type():
run('uname -s')
启动
itcast@ubuntu:~/tmp/fab$ fab -H 127.0.0.1 host_type
[127.0.0.1] Executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] Login password for 'itcast':
[127.0.0.1] out: Linux
[127.0.0.1] out: Done.
Disconnecting from 127.0.0.1... done.
itcast@ubuntu:~/tmp/fab$ fab -H 127.0.0.1 host_type
[127.0.0.1] Executing task 'host_type'
[127.0.0.1] run: uname -s
[127.0.0.1] Login password for 'itcast':
[127.0.0.1] out: Linux
[127.0.0.1] out:
fabric常用参数
- -l : 显示定义好的任务函数名
- -f : 指定fab入口文件,默认入口文件名为fabfile.py
- -H : 指定目标主机,多台主机用","号分割
fabric常用API
- local : 执行本地命令,如:local('uname -s')
- lcd : 切换本地目录,如:lcd('/home')
- cd : 切换远程目录,如:cd('/etc')
- run : 执行远程命令,如:run('free -m')
- sudo : sudo方式执行远程命令,如:sudo('touch /abc')
- put : 上传本地文件到远程主机,如:put('/hello', '/home/itcast/hello')
- get : 从远程主机下载文件到本地,如:get('/home/python/world', '/home/itcast/world')
- reboot : 重启远程主机,如:reboot()
- @task : 函数装饰器,标识的函数为fab可调用的,非标记的对fab不可见,纯业务逻辑
- @runs_once : 函数装饰器,标识的函数只会执行一次,不受多台主机影响
fabric全局属性设定
- env.host : 定义目标主机,如:env.host=['192.168.17.192', '192.168.17.193']
- env.user : 定义用户名,如:env.user="root"
- env.port : 定义目标主机端口,默认为22,如:env.port="22"
- env.password : 定义密码,如:env.password="chuanzhi"
- env.passwords : 不同的主机不同的密码,如:env.passwords={'itcast@192.168.17.192:22':'chuanzhi', 'itcast@192.168.17.193:22':'python'}
示例1:动态获取远程目录列表
from fabric.api import * env.hosts=['192.168.17.192', '192.168.17.193']
#env.password='python'
env.passwords = {
'itcast@192.168.17.192:22':'python',
'itcast@192.168.17.193:22':'python',
} @runs_once
def input_raw():
return prompt("please input directory name:", default="/home") def workask(dirname):
run('ls -l ' + dirname) @task
def go():
print('start ...')
getdirname = input_raw()
workask(getdirname)
print('end ...')
示例2:上传文件并执行
from fabric.api import * env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python' @task
@runs_once
def tar_task():
with lcd('/home/itcast/testdemo'):
local('tar zcvf demo.tar.gz demo.py') @task
def put_task():
run('mkdir -p /home/itcast/testdemo')
with cd('/home/itcast/testdemo'):
put('/home/itcast/testdemo/demo.tar.gz', '/home/itcast/testdemo/demo.tar.gz') @task
def check_task():
lmd5 = local('md5sum /home/itcast/testdemo/demo.tar.gz', capture=True).split(' ')[0]
rmd5 = run('md5sum /home/itcast/testdemo/demo.tar.gz').split(' ')[0]
if lmd5 == rmd5:
print('OK ...')
else:
print('ERROR ...') @task
def run_task():
with cd('/home/itcast/testdemo'):
run('tar zxvf demo.tar.gz')
run('python demo.py') @task
def go():
tar_task()
put_task()
check_task()
run_task()
代码自动化部署
from fabric.api import * env.user = 'itcast'
env.hosts = ['192.168.17.192', '192.168.17.193']
env.password = 'python' @runs_once
@task
def local_update():
with lcd("/home/itcast/tmp/itcasthello"):
local("git add -A")
local("git commit -m 'update'")
local("git pull origin master")
local("git push origin master") @task
def remote_update():
with cd("/home/itcast/tmp/itcasthello"):
run("git checkout master")
run("git pull origin master") @task
def deploy():
local_update()
remote_update()
fabric 自动化部署的更多相关文章
- fabric自动化部署django
使用fabric部署django应用 使用fabric部署django应用 本文是我的网站易读中文网自动化部署的脚本实现,以下代码在ubuntu和debian中测试通过 由于网站使用的是python技 ...
- 使用 Fabric 自动化部署 Django 项目
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在上一篇教程中,我们通过手工方式将代码部署到了服务器.整个过程涉及到十几条命令,输了 ...
- 用 Fabric 实现自动化部署
自动化部署代码 http://liyangliang.me/posts/2015/06/deploy-applications-using-fabric/ http://fabric-docs-cn. ...
- Django 1.6 最佳实践: django项目的服务器自动化部署(转)
原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器 ...
- 使用Fabric自动化你的任务
Fabric是一个Python库,可以通过SSH在多个host上批量执行任务.你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行.这些功能非常适合应用的自动化部署 ...
- Linux 自动化部署
1.pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Py ...
- 转:使用Fabric自动化你的任务
转:http://www.cnblogs.com/holbrook/archive/2012/03/05/2380398.html fabric是什么? Fabric是一个Python库,可以通过SS ...
- [转]使用Fabric自动化你的任务
fabric是什么? Fabric是一个Python库,可以通过SSH在多个host上批量执行任务.你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行.这些功能非 ...
- Python学习笔记—自动化部署【新手必学】
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:唯恋殊雨 目录 pexpect fabric pexpect P ...
随机推荐
- Python 自用代码(某方标准类网页源代码清洗)
用于mongodb中“标准”数据的清洗,数据为网页源代码,须从中提取: 标准名称,标准外文名称,标准编号,发布单位,发布日期,状态,实施日期,开本页数,采用关系,中图分类号,中国标准分类号,国际标准分 ...
- HDU 4008 Parent and son LCA+树形dp
题意: 给定case数 给定n个点的树,m个询问 以下n-1行给出树边 m个询问 x y 问:以x为根.y子树下 y的最小点标的儿子节点 和子孙节点 思路: 用son[u][0] 表示u的最小儿子 s ...
- LintCode - Merge Two Sorted List
LintCode - Merge Two Sorted Lists LintCode - Merge Two Sorted Lists Web Link Description Code - C Ti ...
- 淘宝JAVA中间件Diamond详解(二)---原理介绍
转:http://blog.csdn.net/anhuidelinger/article/details/70314744 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本 ...
- 用C++实现Huffman文件编码和解码(2 总结)
这个是代码是昨天写完的,一开始的时候还出了点小bug,这个bug在晚上去吃饭的路上想明白的,回来更改之后运行立刻完成最后一步,大获成功. 简单说下huffman编码和文件压缩主要的技术. Huffma ...
- Windows正在使用无法停止通用卷怎么办
最后解决方案1: 1.双击任务栏上的安全删除硬件图标 2.按下Ctrl + Alt + Del 组合键调出"任务管理器": 3.结束其中的explorer.exe进程,此时桌面上的 ...
- css - inline\inline-block\block
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux——配置使用github
前一段时间在windows下配置了github的环境,参考“TortoiseGit连接github.com”一文,现在学习在linux下编程,在网上找了点资料,配置在linux下使用github,将过 ...
- 小程序app is not defined
错误记录: 小程序丨 报错:app is not defined; 解决方案: Js头部添加:var app = getApp(); 返回按钮: wx.navigateBack(); 转发 ...
- (一)Activiti之——简介、插件安装及BPMN元素
1. 工作流概念 工作流(Workflow):就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...