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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
老生常谈Python基础之字符编码
Jun 14 Python
python实现发送邮件功能
Jul 22 Python
itchat接口使用示例
Oct 23 Python
django中SMTP发送邮件配置详解
Jul 19 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
django重新生成数据库中的某张表方法
Aug 28 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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 静态化实现代码
2009/03/20 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
php与js的区别是什么
2013/08/05 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
web打印小结
2017/01/11 Javascript
js实现日历的简单算法
2017/01/24 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
JavaScript如何操作css
2020/10/24 Javascript
python快速排序代码实例
2013/11/21 Python
Python函数参数类型*、**的区别
2015/04/11 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
销售心得体会
2014/01/02 职场文书
最美护士演讲稿
2014/08/27 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
行政介绍信范文
2015/05/04 职场文书
董存瑞观后感
2015/06/11 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang
python中tkinter复选框使用操作
2021/11/11 Python
golang的文件创建及读写操作
2022/04/14 Golang