Python的自动化部署模块Fabric的安装及使用指南


Posted in Python onJanuary 19, 2016

fabric是python2.5或者更高的库,可以通过ssh在多个host上批量执行任务.完成系统管理任务.它提供一套基本操作在本地和远程执行shell命令,或者上传下载文件,辅助提供用户输入或终止执行.

下面安装fabric模块有2种方法:

1.使用easy_install(下面是debain5环境)

root@10.1.6.200:pshell# apt-get install python-dev (安装Python头文件)
 
root@10.1.6.200:pshell# apt-get install python-setuptools (安装easy_install)
 
root@10.1.6.200:pshell# wget http://peak.telecommunity.com/dist/ez_setup.py
 
root@10.1.6.200:pshell# python ez_setup.py
 
root@10.1.6.200:pshell# easy_install fabric
Searching for fabric
Reading http://pypi.python.org/simple/fabric/
Best match: Fabric 1.6.1
Downloading http://pypi.python.org/packages/source/F/Fabric/Fabric-1.6.1.tar.gz#md5=c318ac3f7011ede0be1ca9a20f435735
Processing Fabric-1.6.1.tar.gz
Running Fabric-1.6.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-CVuLrs/Fabric-1.6.1/egg-dist-tmp-ZFNoWY
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no previously-included files matching '*.pyc' found under directory 'tests'
warning: no previously-included files matching '*.pyo' found under directory 'tests'
zip_safe flag not set; analyzing archive contents...
fabric.version: module references __file__
Adding Fabric 1.6.1 to easy-install.pth file
Installing fab script to /usr/bin
....
Installed /usr/lib/python2.5/site-packages/pycrypto-2.6-py2.5-linux-x86_64.egg
Finished processing dependencies for fabric

2.使用pip(下面使用的是debian7环境)

apt-get install python-pip
pip install fabric
apt-get install python-paramiko

导入模块未报错说明安装成功.

实例:

1.在调用fabric的时候使用命令行参数,-H 指定哪台主机

root@10.1.6.201:python# cat fabfile4.py

#!/usr/bin/env python
#coding=utf-8
from fabric.api import *
 
def printMem():
   cmd_output = run('free -m')
   print cmd_output
root@10.1.6.201:python# fab -H root@10.1.1.45 printMem -f fabfile4.py
[root@10.1.1.45] Executing task 'printMem'
[root@10.1.1.45] run: free -m
[root@10.1.1.45] Login password for 'root': #提示输入密码
[root@10.1.1.45] out:       total    used    free   shared  buffers   cached
[root@10.1.1.45] out: Mem:     1005    968     37     0     36    831
[root@10.1.1.45] out: -/+ buffers/cache:    100    904
[root@10.1.1.45] out: Swap:     1913     0    1913
[root@10.1.1.45] out:

 

total    used    free   shared  buffers   cached
Mem:     1005    968     37     0     36    831
-/+ buffers/cache:    100    904
Swap:     1913     0    1913
 
Done.
Disconnecting from 10.1.1.45:22000... done.

2.以上我们需要输入密码才能完成操作,怎样自动执行呢?可以在fabfile4文件中配置HOST.也就是环境变量.

root@10.1.6.201:python# vim fabfile.py
#!/usr/bin/env python
#coding=utf-8
from fabric.api import *
from fabric.context_managers import *
 
env.host_string = '10.1.1.45'
env.port = '22000'       #默认端口22,默认登录用户root
env.password='passwd'
 
def test1():
  with cd('/home'):
    run('ls -l')
 
test1()
root@10.1.6.201:python# python fabfile.py  #脚本执行
[10.1.1.45] run: ls -l
[10.1.1.45] out: total 8
[10.1.1.45] out: drwxr-xr-x 2 debian debian 4096 2012-08-27 11:54 debian
[10.1.1.45] out: drwxr-xr-x 2 root  nogroup 4096 2013-05-22 18:07 ftp
[10.1.1.45] out:
root@10.1.6.201:python# vim fabfile1.py
#!/usr/bin/env python
#coding=utf-8
from fabric.api import *
from fabric.context_managers import *
 
env.hosts = ['10.1.6.200','10.1.1.45']
env.port = '22000'
env.password='passwd'
 
def test1():
  with cd('/home'): #更改目录
    run('ls -l')
root@10.1.6.201:python# fab test1 -f fabfile.py #使用fab指定任务执行,注意文件后默认跟fabfile.py
[10.1.6.200] Executing task 'test1'
[10.1.6.200] run: ls -l
[10.1.6.200] out: total 24
[10.1.6.200] out: drwxr-xr-x 2 davehe davehe 4096 2013-02-27 10:00 davehe
[10.1.6.200] out: -rw-r--r-- 1 root  root  1990 2013-02-27 09:55 davehe.tar.gz
[10.1.6.200] out: -rw-r--r-- 1 root  root  396 2013-05-17 18:27 rsync_log_130517
[10.1.6.200] out: -rw-r--r-- 1 root  root  7916 2013-05-20 21:04 rsync_log_130520
[10.1.6.200] out: drwxr-xr-x 2 taomee taomee 4096 2013-01-29 04:27 taomee
[10.1.6.200] out: 
 
[10.1.1.45] Executing task 'test1'
[10.1.1.45] run: ls -l
[10.1.1.45] out: total 8
[10.1.1.45] out: drwxr-xr-x 2 debian debian 4096 2012-08-27 11:54 debian
[10.1.1.45] out: drwxr-xr-x 2 root  nogroup 4096 2013-05-22 18:07 ftp
[10.1.1.45] out: 
 
 
Done.
Disconnecting from 10.1.1.45:22000... done.
Disconnecting from 10.1.6.200:22000... done.

3.使用get/put.利用sftp协议上传下载文件

root@10.1.6.201:python# cat fabfile1.py

 

#!/usr/bin/env python
#coding=utf-8
from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
 
env.hosts = ['10.1.1.45']
env.port = '22000'
env.password='passwd'
 
def test1():
  print(red("i'm 201"))
  local('ls -l /tmp')
 
def test2():
  print (green("i'm get file 45 to 186"))
  get('/home/ftp/a.txt','/tmp/') #下载
#  put('/tmp/','/home/ftp/') #上传
  local('ls -l /tmp')  #local运行本地命令
 
 
def final():
  execute(test1)
  execute(test2)

 

root@10.1.6.201:python# fab final -f fabfile1.py
[10.1.1.45] Executing task 'final'
[10.1.1.45] Executing task 'test1'
i'm 201
[localhost] local: ls -l /tmp
total 31684
drwxr-xr-x 2 root root   4096 May 13 22:08 bin
drwxr-xr-x 3 root root   4096 May 13 22:08 conf
drwxr-xr-x 6 root root   4096 May 13 22:08 etc
-rwxr-xr-x 1 root root   6797 May 13 22:08 init
-rw-r--r-- 1 root root 32400896 May 13 22:07 initrd.img-3.2.0-4-amd64
drwxr-xr-x 6 root root   4096 May 13 22:08 lib
drwxr-xr-x 2 root root   4096 May 13 22:08 lib64
drwxr-xr-x 2 root root   4096 May 13 22:08 run
drwxr-xr-x 2 root root   4096 May 13 22:08 sbin
drwxr-xr-x 6 root root   4096 May 13 22:08 scripts
[10.1.1.45] Executing task 'test2'
i'm get file 45 to 186
[10.1.1.45] download: /tmp/a.txt <- /home/ftp/a.txt
[localhost] local: ls -l /tmp
total 31688
-rw-r--r-- 1 root root    6 May 29 22:29 a.txt
drwxr-xr-x 2 root root   4096 May 13 22:08 bin
drwxr-xr-x 3 root root   4096 May 13 22:08 conf
drwxr-xr-x 6 root root   4096 May 13 22:08 etc
-rwxr-xr-x 1 root root   6797 May 13 22:08 init
-rw-r--r-- 1 root root 32400896 May 13 22:07 initrd.img-3.2.0-4-amd64
drwxr-xr-x 6 root root   4096 May 13 22:08 lib
drwxr-xr-x 2 root root   4096 May 13 22:08 lib64
drwxr-xr-x 2 root root   4096 May 13 22:08 run
drwxr-xr-x 2 root root   4096 May 13 22:08 sbin
drwxr-xr-x 6 root root   4096 May 13 22:08 scripts
 
Done.
Disconnecting from 10.1.1.45:22000... done.

上面实例中只列举了几个常用的farbic环境变量.如env.hosts,env.password等,可以不需要交互输入密码.

以下还有常用环境变量以供参考:

  • exclude_hosts:指定一个主机列表,在fab执行时,忽略列表中的机器
  • user:ssh使用哪个用户登录远程主机
  • hosts :全局的host列表
  • host_string :当fabric连接远程机器执行run、put时,设置的user/host/port等
  • password:默认ssh连接远程主机密码,也可以是sudo提示输入密码
  • password:一个字典供内部使用,为每台主机host设置密码,key是主机,value值存放密码
  • port:设置默认端口
  • roledefs:使用字典定义角色名字对应的主机ip
  • roles:一个全局的role列表
from fabric.api import run, roles
 
env.roledefs = {
  'db': ['db1', 'db2'],
  'web': ['web1', 'web2', 'web3'],
}
 
@roles('db')
def migrate():
  # Database stuff here.
  pass
 
@roles('web')
def update():
  # Code updates here.
  pass

fab也可以使用命令设置环境变量,常用命令

  • -f FABFILE, --fabfile=FABFILE  默认fabfile.py
  • -H HOSTS, --hosts=HOSTS     env.hosts=hosts
  • -p PASSWORD, --password=PASSWORD  env.password
  • -R ROLES, --roles=ROLES   env.roles
Python 相关文章推荐
python实现根据月份和日期得到星座的方法
Mar 27 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
Python每天必学之bytes字节
Jan 28 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
Python线性方程组求解运算示例
Jan 17 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python File(文件) 方法整理
Feb 18 Python
Python实现某论坛自动签到功能
Aug 20 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
Python编程中time模块的一些关键用法解析
Jan 19 #Python
Python编程中的文件读写及相关的文件对象方法讲解
Jan 19 #Python
Python使用os模块和fileinput模块来操作文件目录
Jan 19 #Python
举例讲解Python面相对象编程中对象的属性与类的方法
Jan 19 #Python
python结合API实现即时天气信息
Jan 19 #Python
Python+django实现文件下载
Jan 17 #Python
Python+django实现文件上传
Jan 17 #Python
You might like
用PHP函数解决SQL injection
2006/12/09 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python的几种开发工具介绍
2007/03/07 Python
python函数形参用法实例分析
2015/08/04 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python计算auc指标实例
2017/07/13 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
会计实习生自我鉴定
2013/12/12 职场文书
意向书范文
2014/03/31 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
职代会闭幕词
2015/01/28 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js