python fabric实现远程操作和部署

博客迁往:新地址 (点击直达)

新博客使用markdown维护,线下有版本号库,自己写的所以会定时更新同步,同一时候提供更好的导航和阅读体验

csdn对markdown支持不好,所以旧版不会花时间进行同步修订,抱歉

-----------------------------------------------


fabric

title是开发,可是同一时候要干开发測试还有运维的活……为毛 task*3 不是 salary * 3 (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.6版本号(或者用pip install,一样的)

安装完后,能够查看是否成功安装

[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 localdef lsfab():local('cd ~/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 localdef setting_ci():local("cd /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,runenv.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,运行到相应机器时会跳出要求输入密码的交互

多server混搭

操作多个server,须要配置多个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.password管理

看文档

更好的password管理方式,哥比較土,没打通,主要是server列表变化频繁,我的处理方式是:

1.host,user,port,password配置列表,全部的都写在一个文件


或者直接搞到脚本里,当然这个更........

env.hosts = [

'host1',

'host2'


]
env.passwords = { 
'host1': "pwdofhost1",
'host2': "pwdofhost2",

}

 或者

 

env.roledefs = {
'testserver': ['host1', 'host2'],
'realserver': ['host3', ]
}
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
'host3': "pwdofhost3", 
} 



2.依据key解析成map嵌套,放到deploy中

另外命令事实上也能够固化成一个cmds列表的…..

初略就用到这些,兴许有很多其它需求的时候再去捞文档了,话说文档里好东西真多,就是太多了,看了晕。。。

The end!

To be continue….

wklken

Email: wklken@yeah.net

Blog: http://www.wklken.com

2013-03-25

转载请注明出处,谢谢

转载于:https://www.cnblogs.com/yxwkf/p/3901322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Windows]python+PyQT+Eric安装配置

From: http://www.cnblogs.com/lhj588/archive/2011/10/05/2198472.html 一、大纲内容: 1、预备PC环境: 2、预备安装程序: 2、1、下载Python3.2 2、2、下载PyQt4 2、3、下载Eric5 3、安装配置步骤: 3、1、安装Pyhon3.2 3、2、安装Py…

CSS之BFC

1.BFC(Block Formatting Context)是Web页面中盒模型布局的CSS渲染模式。它的定位体系属于常规文档流 2.创建一个BFC 一个新的BFC可以通过给容器添加任何一个触发BFC的CSS样式,如overflow: scroll, overflow: hidden, display: flex, float: left,或者 display: tabl…

[导入]WINRAR 命令行语法[转载]

WINRAR 命令行语法 [ 2006-10-13 23:33:44 | 作者: 碳酸氢钠 ] Font Size: Large | Medium | Small 语法:RAR <命令> [-<开关>] <压缩包> <文件列表...> [<文件...>] [<解压缩路径\>]命令行选项(命令及开关)提供 RAR 创建及管理控制压缩包…

【计算机网络】端口和进程的区别

端口和进程的区别 用一个例子说明二者的区别 现在有一个手机&#xff0c;这个手机好比一个和外界通信的端口。 你现在想给你女朋友打电话&#xff0c;可是手机被占用了&#xff0c;你就开始大喊&#xff0c;谁拿了我的手机&#xff08;翻译一下就是&#xff1a;哪个进程占用…

[python]如何清屏?也就是实现clear?

import os os.system( cls ) 由此也可见,想要执行任何一条系统命令,都只需要执行os.system( COMMAND )就行了. 因此&#xff0c;在windows命令提示符下清屏就是&#xff1a;os.system("cls") 在linux终端下清屏就用&#xff1a;os.system("clear")

javascript学习系列(10):数组中的slice方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说s…

【官方文档】《暗黑世界V1.4》API说明!

指令号说明账号注册 100{username str 用户名password str 密码}返回信息{result bool 指令调用是否成功message str 指令调用返回的信息}账号登陆 101请求信息{username str 用户名password str 密码}返回信息{result bool …

SpringSide示例之HelloWorld

SpringSide是个什么东西呢&#xff1f;这么说吧&#xff0c;就是“采众家之长”的一个一站式框架&#xff0c;它吸取了开源界许多优秀组件的精华部分&#xff0c;非常简约的一个东西&#xff0c;具体就不多介绍了&#xff0c;自己可以参考官方文档。下面来看看运用这个框架实现…

CSS之viewports剖析

1.设备的pixels和CSS的pixels 首先你应当理解CSS的pixels&#xff0c;以及它和设备的pixels的区别 我们姑且认定设备的pixels为标准的pixels宽度。这些pixels决定了你工作所用的那些设备上正式的分辨率。在大多数情况下&#xff0c;能够从screen.width/height上取出具体值 如…

9个好用的搜索小技巧

百度一下&#xff0c;你就知道。搜索是我们常用的工具&#xff0c;怎么又快又准的搜索出想要的结果是现代人必备的技能&#xff0c;下面就教你9个好用的搜索小技巧吧 1 . 完全匹配搜索。 在查询词的外边加上双引号“”。 如 “北京地坛” &#xff0c;注意引号是不分中英文的…

raw_input() 与 input() __ Python

>>> input ("my age is : ") my age is :23 23 >>> raw_input("my age is : ") my age is : 23 23 有什么不一样&#xff1f;再看一个例子 >>> age input(" how old r u ?") how old r u ?23 >>> p…

javascript学习系列(11):数组中的findIndex方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说f…

系统监控

SAP系统监控在生产系统中&#xff0c;我们要根据实际需要来进行实时监控系统&#xff0c;目的是为了保证系统的平稳运行在ERP系统中&#xff0c;我们的生产系统会部署在各个服务器节点上&#xff0c;每台服务器对应的客户端节点又有很多个尤其是在系统压力比较大的时候&#xf…

PKU 1061 青蛙的约会

/*扩展欧几里德求模线性方程 感谢logic_space的指正*/#include <iostream>#defineabs(a) ((a)<0?-(a):(a))usingnamespacestd; __int64 exGCD(__int64 a, __int64 b, __int64 &x, __int64 &y) { if(b 0) { x 1; y 0; return…

小程序根据手机机型设置自定义底部导航距离

需求: iponeX 以上机型,手机底部有弧度,自己写的导航栏会被遮住, 需要判断手机机型,做兼容设置. 解决: //app.js App({/*** 当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;*/onLaunch: function() {var that this;//获取手机型号…

CSS之基于视窗单位的排版

1.使用视窗单位进行排版 这里还有一个为什么要考虑使用视窗单位进行排版的原因 - 根据客户端的浏览器&#xff0c;视窗单位会自动重新计算。这就意味着我们不需要显式声明媒体查询的字体大小 实例1&#xff1a;让我们用一个例子清楚地说明这一点 考虑下面的代码&#xff0c;…

C++ STL 遍历 map 的时候如何删除其中的 element

首先看一段他人的一段文章&#xff1a;from: http://www.cnblogs.com/super119/archive/2011/10/11/2207541.html 我们通过map的erase(iterator it)方法删除元素的时候&#xff0c;如果此时erase处于遍历map的代码中&#xff0c;那么调用erase就需要小心一些。因为erase会导致…

React开发(111):写注释的方法

放上去会显示(method) Template.getDictionary(): void

数据库范式(1NF 2NF 3NF BCNF)详解

数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xff0c;不会发生插入&#xff08;insert&#xff09;、删除&#xff08;delete&#xff09;和更新&#xff08;update&#xff09;操作异常。反之则是…

小程序页面跳转的几个方法和区别

目前小程序的几个页面跳转方式的主要区别就两点&#xff1a; 1.是否可以返回上一个页面2.目标页面是否是tabBar 两个通用属性 1.限制&#xff1a;目前页面路径最多只能十层。2.分类&#xff1a;wx.navigateTo 和 wx.redirectTo不允许跳转到 tabbar 页面&#xff0c;只能用 w…