Python fabric实现远程操作和部署
fabric
title是开发,但是同时要干开发测试还有运维的活 (o(╯□╰)o)
近期接手越来越多的东西,发布和运维的工作相当机械,加上频率还蛮高,导致时间浪费还是优点多。
修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D,E(1分钟),分别ssh到ABCDE五台机器,逐一重启(8-10分钟) = 13-15分钟
其中郁闷的是,每次操作都是相同的,命令一样,要命的是在多个机器上,很难在本机一个脚本搞定,主要时间都浪费在ssh,敲命令上了,写成脚本,完全可以一键执行,花两分钟看下执行结果
直到,发现了fabric这货
官方文档 入口
作用
很强大的工具
可以将自动化部署或者多机操作的命令固化到一个脚本里
和某些运维工具很像,用它主要是因为,python…..
简单好用易上手
当然,shell各种命令组合起来也可以,上古神器和现代兵器的区别
环境配置
在本机和目标机器安装对应包(注意,都要有)
sudo easy_install fabric
目前是1.8版本
安装完后,可以查看是否安装成功
[ken@~$] which fab /usr/local/bin/fab
装完之后,可以浏览下官方文档
然后,可以动手了
hello world
先进行本机简单操作,有一个初步认识,例子来源与官网
新建一个py脚本: fabfile.py
def hello():print("Hello world!")
命令行执行:
[ken@~/tmp/fab$] fab hello Hello world!Done.
注意,这里可以不用fabfile作为文件名,但是在执行时需指定文件
[ken@~/tmp/fab$] mv fabfile.py test.py fabfile.py -> test.py [ken@~/tmp/fab$] fab helloFatal error: Couldn't find any fabfiles!Remember that -f can be used to specify fabfile path, and use -h for help.Aborting. [ken@~/tmp/fab$] fab -f test.py hello Hello world!Done.
带参数:
修改fabfile.py脚本:
def hello(name, value):print("%s = %s!" % (name, value))
执行
[ken@~/tmp/fab$] fab hello:name=age,value=20 age = 20!Done. [ken@~/tmp/fab$] fab hello:age,20 age = 20!Done.
执行本机操作
简单的本地操作:
from fabric.api import local, lcddef lsfab():with lcd('~/tmp/fab'):local('ls')
结果:
[ken@~/tmp/fab$] pwd;ls /Users/ken/tmp/fab fabfile.py fabfile.pyc test.py test.pyc [ken@~/tmp/fab$] fab -f test.py lsfab [localhost] local: cd ~/tmp/fab [localhost] local: ls fabfile.py fabfile.pyc test.py test.pycDone.
实战开始:
假设,你每天要提交一份配置文件settings.py到版本库(这里没有考虑冲突的情况)
如果是手工操作:
cd /home/project/test/conf/ git add settings.py git commit -m 'daily update settings.py' git pull origin git push origin
也就是说,这几个命令你每天都要手动敲一次,所谓daily job,就是每天都要重复的,机械化的工作,让我们看看用fabric怎么实现一键搞定:(其实用shell脚本可以直接搞定,但是fab的优势不是在这 里,这里主要位后面本地+远端操作做准备,毕竟两个地方的操作写一种脚本便于维护)
from fabric.api import local, lcddef setting_ci():with lcd('/home/project/test/conf/'):local("git add settings.py")#后面你懂的,懒得敲了…..
混搭整合远端操作
这时候,假设,你要到机器A的/home/ken/project对应项目目录把配置文件更新下来
#!/usr/bin/env python# encoding: utf-8from fabric.api import local,cd,run, envenv.hosts=['user@ip:port',] #ssh要用到的参数env.password = 'pwd'def setting_ci():local('echo "add and commit settings in local"')#刚才的操作换到这里,你懂的def update_setting_remote():print "remote update"with cd('~/temp'): #cd用于进入某个目录run('ls -l | wc -l') #远程操作用rundef update():setting_ci()update_setting_remote()
然后,执行之:
[ken@~/tmp/fab$] fab -f deploy.py update [user@ip:port] Executing task 'update' [localhost] local: echo "add and commit settings in local" add and commit settings in local remote update [user@ip:port] run: ls -l | wc -l [user@ip:port] out: 12 [user@ip:port] out:Done.
注意,如果不声明env.password,执行到对应机器时会跳出要求输入密码的交互
多服务器混搭
操作多个服务器,需要配置多个host
#!/usr/bin/env python# encoding: utf-8from fabric.api import *#操作一致的服务器可以放在一组,同一组的执行同一套操作env.roledefs = {'testserver': ['user1@host1:port1',],'realserver': ['user2@host2:port2', ]}#env.password = '这里不要用这种配置了,不可能要求密码都一致的,明文编写也不合适。打通所有ssh就行了'@roles('testserver')def task1():run('ls -l | wc -l')@roles('realserver')def task2():run('ls ~/temp/ | wc -l')def dotask():execute(task1)execute(task2)
结果:
[ken@~/tmp/fab$] fab -f mult.py dotask [user1@host1:port1] Executing task 'task1' [user1@host1:port1] run: ls -l | wc -l [user1@host1:port1] out: 9 [user1@host1:port1] out:[user2@host2:port2] Executing task 'task2' [user2@host2:port2] run: ls ~/temp/ | wc -l [user2@host2:port2] out: 11 [user2@host2:port2] out:Done.
扩展
1.颜色
可以打印颜色,在查看操作结果信息的时候更为醒目和方便
from fabric.colors import *def show():print green('success')print red('fail')print yellow('yellow')#fab -f color.py show
2.错误和异常
关于错误处理
默认,一组命令,上一个命令执行失败后,不会接着往下执行
失败后也可以进行不一样的处理, 文档
目前没用到,后续用到再看了
3.密码管理
看文档
更好的密码管理方式,哥比较土,没打通,主要是服务器列表变化频繁,我的处理方式是:
3.1 host,user,port,password配置列表,所有的都写在一个文件
或者直接搞到脚本里,当然这个更........
env.hosts = ['host1','host2']# 注意: 要使env.passwords生效, host格式必须是 user@ip:port 端口号一定要显式写出来,即使是使用的默认22端口env.passwords = {'host1': "pwdofhost1",'host2': "pwdofhost2",}或者env.roledefs = {'testserver': ['host1:22', 'host2:22'],'realserver': ['host3:22', ]}# 注意: 要使env.passwords生效, host格式必须是 user@ip:port 端口号一定要显式写出来,即使是使用的默认22端口env.passwords = {'host1:22': "pwdofhost1",'host2:22': "pwdofhost2",'host3:22': "pwdofhost3",}
3.2 根据key解析成map嵌套,放到deploy中
另外命令其实也可以固化成一个cmds列表的…..
粗略就用到这些,后续有更多需求的时候再去捞文档了,话说文档里好东西真多,就是太多了,看了晕。。。
TODO:
装饰器作用? @task @parallel命令行常用: fab --help fab -l -- 显示可用的task(命令) fab -H -- 指定host,支持多host逗号分开 fab -R -- 指定role,支持多个 fab -P -- 并发数,默认是串行 fab -w -- warn_only,默认是碰到异常直接abort退出 fab -f -- 指定入口文件,fab默认入口文件是:fabfile/fabfile.py状态确认及错误处理更复杂的操作
update log
2014-10-26 fix error of local/lcd
The end!
转载于:https://blog.51cto.com/wenzengliu/1732528
相关文章:

自己写的哈希表以及解决哈希冲突
哈希表就是键值key-value对,使用hash函数让key产生哈希值,当不同的key产生相同的哈希值时就是哈希冲突了,产生哈希冲突可以使用拉链法。 hash.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include &…
Python与MySQL数据库的交互实战
作者 | Huang supreme编辑 | 郭芮图源 | 视觉中国安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链…

Hyper-V的三种网卡
External 虚拟机和物理网络、本地主机都能通信 Internal 虚拟机之间互相通信,并且虚拟机能和本机通信 Private 仅允许运行在这台物理机上的虚拟机之间互相通信

filter-mapping中的dispatcher使用
web.xml里<filter-mapping>中的<dispatcher>作用 2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即 REQUEST,FORWARD,INCLUDE和ERROR 可以在一个<filter-mapping>元素中加入任意数目…
脉冲神经网络在目标检测的首次尝试,性能堪比CNN | AAAI 2020
译者 | VincentLee来源 | 晓飞的算法工程笔记脉冲神经网络(Spiking neural network, SNN)将脉冲神经元作为计算单元,能够模仿人类大脑的信息编码和处理过程。不同于CNN使用具体的值(continuous)进行信息传递,SNN通过脉冲序列(discrete)中每个脉冲发射时…

TCMalloc:线程缓存的Malloc
转载自: http://shiningray.cn/tcmalloc-thread-caching-malloc.html作者:Sanjay Ghemawat, Paul Menage 原文 翻译:ShiningRay 动机 TCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试…

今年央视的春晚能给人带来惊喜吗?
已经好多年还没看完中央电视台的春节联欢晚会自己就睡着了,说实在的,现在央视春节联欢晚会的节目总是让人期待后感到相当的平淡乏味,有些搞笑节目庸俗的让人笑不出来,绝大多数的节目都显得非常的人工,全然不能激发出观…

将baidu地图中的baidu logo去掉
Web 最简单方法,将logo的css样式改为display:none即可 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>移除百度地图LOGO和版权信息</title><script type"text/javascript" src"htt…

Linux环境网络库
安装libevent 官网:http://libevent.org/ 书籍:http://www.wangafu.net/~nickm/libevent-book/ Libevent参考手册翻译:http://blog.csdn.net/laoyi19861011/article/category/831215 Libevent参考手册翻译增加:http://blog.sina.co…
万人马拉松赛事,人脸识别系统如何快速、准确完成校验?
作者 | 阿里文娱技术专家墨贤出品 | AI科技大本营(ID:rgznai100)大麦的人脸闸机在2019年杭州马拉松上成功的完成了刷脸入场功能的首秀,相比传统的马拉松入场核验方案在入场体验和入场效率上都有了很大的提升,下面介绍一下大麦的人…

Collection集合List、Set
Collection集合,用来保存一组数据的数据结构。 Collection是一个接口,定义了所有集合都应该包含的特征和行为 Collection派生出了两类集合 List和Set List接口:List集合的特征是元素是可重复且有序 Set接口:Set集合的特征是元素是…
如何用Jupyter Notebook制作新冠病毒疫情追踪器?
出品 | AI科技大本营(ID:rgznai100)新冠肺炎已在全球范围内爆发。为了解全球疫情分布情况,有技术人员使用Jupyter Notebook绘制了两种疫情的等值线地图(choropleth chart)和散点图。前者显示了一个国家/地区的疫情扩散…

关于Aptana studio工具
今天,使用了Aptana studio这个工具,界面类似于Myeclipse因使用MyEclipse比较顺手,这个工具上手还挺容易的。而且比Dreamweaver好用多了,有代码提示的工具,再加上工具不大,耗内存较小。挺喜欢这个工具的。写…

再谈JSON -json定义及数据类型
再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析。使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑,比方说,什么情况下我们须要去将字符串转换为json对象。什么情况下就不须要转换。通过hql和sql查询返回…

Linux软连接和硬链接
1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】 硬连接指通过索引节点来进行连接。在Linux的…

学语言不是写程序!
这是发到我邮箱里面的一封信,嗯,类似的信有好几封,春节期间呢,我主要陪笑笑,呵呵,不办公,就一直压着没有回答,有点delay了,现在给这几位同学抱个歉哈,对不住了…
“AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作
2020年春节,注定将刻进每个人的记忆。面对突如其来的新型冠状病毒感染的肺炎疫情,除了一线医护人员的日夜奋战,“人工智能”也在特殊时期走向前沿,接受了抗疫洗礼。 3月13日,今年第一期百度大脑开放日首次通过直播的形…

POJ 2778 AC自己主动机+矩阵幂 不错的题
http://poj.org/problem?id2778 有空再又一次做下,对状态图的理解非常重要 题解: http://blog.csdn.net/morgan_xww/article/details/7834801 另外做了矩阵幂的模板: //ac.sz是矩阵的大小 void mulmtr(long long x[MAXNODE][MAXNODE],long l…

Libevent调用
1.最基本的打印libevent版本 #include <event.h> #include <stdio.h>int main() {const char *version event_get_version();printf("%s\n",version);return 0; }# gcc getVersion.c -o getVersion -levent 参考:https://github.com/mike-zh…
如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!
作者 | CloudFactory译者 | 天道酬勤 责编 | 徐威龙出品 | AI科技大本营(ID:rgznai100)高效的机器学习模型需要高质量的数据。训练你的机器学习模型并不是过程中的单个有限阶段。即使将其部署到生产环境中,也可能需要稳定的新训练数据流来确保…

占失物,笔记本电脑电池
公历:2009年3月18日18时11分 农历: 农历己丑年(牛)二月廿二 节气: 2009年3月5日19时2分惊蛰年建:己丑 月建:丁卯 日建:壬戌 时建:己酉 断:玄武中值天地合,故能寻到,在西方,又为长生之地,故为住…

Scala Learn 1 Basic
Chap 0 前言 focus on: Scala 的语法十分简洁Scala 运行在虚拟机之上, 可以使用 java 的海量类库和工具Scala 拥抱函数式编程的同时,并没有废弃面向对象Scala 既有动态语言那样的灵活简洁,同时有保留了静态类型检查的安全与执行效率Scala 既能处理脚本化…

linux下使用NetBeans调试libevent库
1.安装libevent 参考:http://blog.csdn.net/unix21/article/details/8679269 libevent安装在usr/local/libevent下 2.安装netBeans http://www.netbeans.org 3.配置netBeans 1)打开项目的属性选项,选择包含目录,把/usr//local/libevent/…

批量删除指定文件
Linux下的解决方法: # Linux Batch Delete find /home/data/-name ab.doc-exec rm -f {} \;注:最后反斜杠前有一空格,最后一个是分号。Windows下的解决方法:rem Windows Batch Delete 1: DEL /Q /S D:\home\data\*.class 2: FOR /R D…
百万人学AI:CSDN重磅共建人工智能技术新生态
站在AI发展的新十年起点上,CSDN将发挥开发者优势,与中国AI各行业和企业共建“百万人学AI”新技术生态。 作者 | CSDN新媒体事业部 8年前,现图灵奖得主Hinton团队在ImageNet竞赛中首次使用深度学习完胜Google等其它团队,顿时让工…

Android Property Animation属性动画:scale缩放动画(4)
Android Property Animation属性动画:scale缩放动画(4) 和之前我写的附录文章1,2,3相似,本文将接着使用Android Property Animation属性动画实现一个缩放的动画。代码部分和文章1,2,3中的代码大同小异&am…

结构体的两种声明方式:堆上和栈上以及在双链表的应用
在看《算法精解:C语言描述》的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的。 但是,对于链表的初始化却不一样 1.《算法精解:C语言描述》风格 /************************************************************************…

COM 组件设计与应用(六)——用 ATL 写第一个组件(vc.net)
一、前言 1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对。2、这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外ÿ…

《评人工智能如何走向新阶段》后记(再续19)
由AI科技大本营下载自视觉中国304. 也来讨论构建模拟人类思维过程的认知计算机制,好像这个问题迄今尚未获得解决。 我们先从输入的信息类型说起:一类是语言输入(包括词、句、文本),第二类是图像输入(包括图…