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 相关文章推荐
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
使用Python对Csv文件操作实例代码
May 12 Python
python图像常规操作
Nov 11 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
详解如何设置Python环境变量?
May 13 Python
关于pytorch中网络loss传播和参数更新的理解
Aug 20 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
python实现文法左递归的消除方法
May 22 Python
Python 创建守护进程的示例
Sep 29 Python
详解python polyscope库的安装和例程
Nov 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
php简单实现MVC
2015/02/05 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
python strip()函数 介绍
2013/05/24 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
掌上明珠Java程序员面试总结
2016/02/23 面试题
2014年党员自我评议总结
2014/09/23 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
在人间读书笔记
2015/06/30 职场文书
Java spring定时任务详解
2021/10/05 Java/Android