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实现远程操作和部署相关推荐

  1. fabric批量操作远程操作主机的练习

    fabric是python的一个基于命令行的自动化部署框架,用docker开了两个容器来学习fabric. #!/usr/bin/env python #-*- coding=utf-8 -*-fro ...

  2. Python 远程操作 Linux

    使用Python 远程管理 Linux 系统 Linux 系统的 远程操作 Linux 连接 Linux 与 Windows 文件 传输 一. Windows to Linux: 二. Linux c ...

  3. 分享:Python fabric实践操作

    Python fabric实践操作 http://my.oschina.net/guol/blog/97607

  4. Python远程操作Oracle实现一键备份还原数据库演示,利用socket进行imp、exp一键导入导出oracle数据库dmp文件

    Python 远程操作 Oracle 进行数据库备份还原 第一章:效果演示 ① 数据库恢复演示 ② 请求模拟 第二章:功能实现 ① 创建启动服务 ② 处理解析请求 ③ 处理命令 ④ 服务端数据库操作 ...

  5. python 远程操作Sqlite3

    转自:http://hi.baidu.com/jxhtest/item/a4eff7206daa09122a0f1cca 2011-11-09 18:00 python 远程操作Sqlite3 貌似S ...

  6. python fabric使用

    作用 很强大的工具 可以将自动化部署或者多机操作的命令固化到一个脚本里 和某些运维工具很像,用它主要是因为,Python-.. 简单好用易上手 当然,shell各种命令组合起来也可以,上古神器和现代兵 ...

  7. 关于python进行批量数据备份及部署

    这里主要是自己工作中使用python进行备份和部署的一些介绍,其实用shell也可以实现,但是觉得略有些麻烦,于是进研究下了python,废话不多说了,直接上干货,以下是我的研究成果: 首先需要导入f ...

  8. python 开发个人日常操作笔记

    文章目录 程序员必备储备资源网站 常见问题 1.端口占用的问题 linux windows 2.ssh redis 链接 3.ssh 服务安装配置开机自动启动 ssh指定端口链接: 6, mongo ...

  9. Windows Server 2019服务器远程桌面服务部署+深度学习环境配置教程

    文章目录 1.安装Windows Server 2019 2.开启WLAN服务 3.固定IP地址 4.开启远程桌面服务 4.1 添加远程桌面服务 4.2 激活服务器 4.3 安装许可证 5.配置远程桌 ...

最新文章

  1. JavaScript学习知识点归纳
  2. 中国在线直播教育行业发展形势与竞争策略研究报告2022-2028年
  3. Java黑皮书课后题第7章:*7.33(文化:中国生肖)使用一个字符串数组存储动物名称来简化程序清单3-9的程序
  4. gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
  5. 作者:李雪梅(1984-),女,烟台中科网络技术研究所研发工程师。
  6. Delphi 7连接MySql 5 5 15
  7. VWware Vsphere 实战记录一、vsphere简介及相关名词介绍
  8. oracle 日期格式化_日期格式化跨年bug,是否与你不期而遇?
  9. MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具
  10. java接口返回类,Java接口和返回类型 - java
  11. css中用#id.class的形式定义样式,为什么这样用,不直接写成.class.代码如下:#skin_0.selected{}这种的...
  12. (4)数据结构-线性表补充
  13. consul mysql 检查_MySQL在Consul服务中的健康检查逻辑
  14. 北斗导航 | 基于最小二乘残差法与奇偶矢量法的RAIM算法(附代码)
  15. 用java语言写出青蛙的身份_第三章 JAVA 语言基础
  16. jwplayer html插件,jwplayer进阶HTML5
  17. 计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...
  18. mysql注入转义绕过_SQL注入防御绕过——宽字节注入
  19. LVGL-输入设备LV_INDEV_TYPE_POINTER类型
  20. NLP入门之综述阅读-自然语言处理发展及应用综述

热门文章

  1. Linux 服务器日志文件查找技巧精粹
  2. 网络系统传输负载测试
  3. NoSQL数据库探讨 - 为什么要用非关系数据库?
  4. Python之机器学习K-means算法实现
  5. 从Webshell到肉鸡
  6. 从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD
  7. LAMP搭建phpMyadmin管理平台以及wordpress个人博客系统
  8. 批量修改文件权限 和所有者 chown nobody:nobody * -R chmod 775 * -R
  9. cookiesession的QA故事[原理篇]
  10. Set和存储顺序深入探讨、SortedSet排序的示例