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
Python fabric实现远程操作和部署相关推荐
- fabric批量操作远程操作主机的练习
fabric是python的一个基于命令行的自动化部署框架,用docker开了两个容器来学习fabric. #!/usr/bin/env python #-*- coding=utf-8 -*-fro ...
- Python 远程操作 Linux
使用Python 远程管理 Linux 系统 Linux 系统的 远程操作 Linux 连接 Linux 与 Windows 文件 传输 一. Windows to Linux: 二. Linux c ...
- 分享:Python fabric实践操作
Python fabric实践操作 http://my.oschina.net/guol/blog/97607
- Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件
Python 远程操作 Oracle 进行数据库备份还原 第一章:效果演示 ① 数据库恢复演示 ② 请求模拟 第二章:功能实现 ① 创建启动服务 ② 处理解析请求 ③ 处理命令 ④ 服务端数据库操作 ...
- python 远程操作Sqlite3
转自:http://hi.baidu.com/jxhtest/item/a4eff7206daa09122a0f1cca 2011-11-09 18:00 python 远程操作Sqlite3 貌似S ...
- python fabric使用
作用 很强大的工具 可以将自动化部署或者多机操作的命令固化到一个脚本里 和某些运维工具很像,用它主要是因为,Python-.. 简单好用易上手 当然,shell各种命令组合起来也可以,上古神器和现代兵 ...
- 关于python进行批量数据备份及部署
这里主要是自己工作中使用python进行备份和部署的一些介绍,其实用shell也可以实现,但是觉得略有些麻烦,于是进研究下了python,废话不多说了,直接上干货,以下是我的研究成果: 首先需要导入f ...
- python 开发个人日常操作笔记
文章目录 程序员必备储备资源网站 常见问题 1.端口占用的问题 linux windows 2.ssh redis 链接 3.ssh 服务安装配置开机自动启动 ssh指定端口链接: 6, mongo ...
- Windows Server 2019服务器远程桌面服务部署+深度学习环境配置教程
文章目录 1.安装Windows Server 2019 2.开启WLAN服务 3.固定IP地址 4.开启远程桌面服务 4.1 添加远程桌面服务 4.2 激活服务器 4.3 安装许可证 5.配置远程桌 ...
最新文章
- JavaScript学习知识点归纳
- 中国在线直播教育行业发展形势与竞争策略研究报告2022-2028年
- Java黑皮书课后题第7章:*7.33(文化:中国生肖)使用一个字符串数组存储动物名称来简化程序清单3-9的程序
- gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
- 作者:李雪梅(1984-),女,烟台中科网络技术研究所研发工程师。
- Delphi 7连接MySql 5 5 15
- VWware Vsphere 实战记录一、vsphere简介及相关名词介绍
- oracle 日期格式化_日期格式化跨年bug,是否与你不期而遇?
- MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具
- java接口返回类,Java接口和返回类型 - java
- css中用#id.class的形式定义样式,为什么这样用,不直接写成.class.代码如下:#skin_0.selected{}这种的...
- (4)数据结构-线性表补充
- consul mysql 检查_MySQL在Consul服务中的健康检查逻辑
- 北斗导航 | 基于最小二乘残差法与奇偶矢量法的RAIM算法(附代码)
- 用java语言写出青蛙的身份_第三章 JAVA 语言基础
- jwplayer html插件,jwplayer进阶HTML5
- 计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...
- mysql注入转义绕过_SQL注入防御绕过——宽字节注入
- LVGL-输入设备LV_INDEV_TYPE_POINTER类型
- NLP入门之综述阅读-自然语言处理发展及应用综述
热门文章
- Linux 服务器日志文件查找技巧精粹
- 网络系统传输负载测试
- NoSQL数据库探讨 - 为什么要用非关系数据库?
- Python之机器学习K-means算法实现
- 从Webshell到肉鸡
- 从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
- LAMP搭建phpMyadmin管理平台以及wordpress个人博客系统
- 批量修改文件权限 和所有者 chown nobody:nobody * -R chmod 775 * -R
- cookiesession的QA故事[原理篇]
- Set和存储顺序深入探讨、SortedSet排序的示例