Python自动化部署工具Fabric的简单上手指南

 更新时间:2016年04月19日 17:27:24   作者:haort  
这篇文章主要介绍了Python自动化部署工具Fabric的简单上手指南,涵盖Fabric的安装、fabric的远程操作与维护等方面,需要的朋友可以参考下

Fabric 是基于 SSH 协议的 Python 工具,相比传统的 ssh/scp 方式,用 Python 的语法写管理命令更易读也更容易扩展,管理单台或者多台机器犹如本地操作一般。

官网地址:http://fabfile.org

安装
省略python、pip管理工具安装过程

pip install fabric

验证是否安装成功
进入python编辑模式,输入代码,无错即表示成功安装

from fabric.api import local

fabric版hello world
fabric 默认文件fabfile.py,当然如果不想用这个名字,需要加-f参数

创建fabfile.py文件

vim fabrile.py

编辑代码

#coding:utf-8
from fabric.api import local#
def hello():
   # local函数用来执行本地命令
   local('echo "hello wolrd!"')

执行代码

fab hello

可以通过fab -l查看可以执行的任务,当前为hello函数
运行结果

[localhost] local: echo "hello world!"
hello world!
Done.


传统维护方法:

$ ssh x.x.x.x 'uname -a' -- 输出略

Fabric 示例:

$ cat fabfile.py
from fabric.api import run
def uname():
  run('uname -a')

$ fab -H x.x.x.x uname -- 输出略

肉眼直观看上去,貌似比 ssh 方式要写不少代码,但是基于 ssh 方式中间可控环节比较少,例如:你想判断某服务是否已经启动,没有启动则执行启动等等操作。ssh 命令式的做法稍显麻烦。(当然龌龊一点可以在被操作机器上写好一个脚本,ssh 调用这个脚本)

说几个 Fabric 的优点吧:

  • 角色定义
  • 代码易读
  • 封装了本地、远程操作(还需要自己封装system/popen/ssh操作么?)
  • 参数灵活(动态指定 host/role 等,还有并发执行 基于multiprocessing )
  • 完整的日志输出

罗列的这些,其实日常工作里基本都有类似的封装了,但是有现成的一个成熟的工具,干啥不用呢?对吧。

常用的配置:

  • env.host           -- 主机ip,当然也可以-H参数指定
  • env.password       -- 密码,打好通道的请无视
  • env.roledefs       -- 角色分组,比如:{'web': ['x', 'y'], 'db': ['z']}
  • fab -l             -- 显示可用的task(命令)
  • fab -H             -- 指定host,支持多host逗号分开
  • fab -R             -- 指定role,支持多个
  • fab -P             -- 并发数,默认是串行
  • fab -w             -- warn_only,默认是碰到异常直接abort退出
  • fab -f             -- 指定入口文件,fab默认入口文件是:fabfile/fabfile.py

更多请参考:fab --help

常用的函数:

  • local('pwd')                     -- 执行本地命令
  • lcd('/tmp')                      -- 切换本地目录
  • cd('/tmp')                       -- 切换远程目录
  • run('uname -a')                  -- 执行远程命令
  • sudo('/etc/init.d/nginx start')  -- 执行远程sudo,注意pty选项

示例1:管理远程 nginx 服务

$ cat fabfile.py
from fabric.api import *
@task
def nginx_start():
  ''' nginx start '''
sudo('/etc/init.d/nginx start')

@task
def nginx_stop():
  ''' nginx stop '''
  sudo('/etc/init.d/nginx stop')

   

$ fab --list   -- 查看可用命令
Available commands:

  nginx_start nginx start 
  nginx_stop  nginx stop

$ fab -H x.x.x.x nginx_start -- 启动 nginx

示例2:基于角色

$ cat fabfile.py
from fabric.api import *
env.roledefs = {'nginx': ['x.x.x.x', 'y.y.y.y'], 'mysql': 'z.z.z.z'}
@task
def mysql_start()
  ''' mysql start '''
  sudo('/etc/init.d/mysql start')

   

$ fab --list   -- 查看可用命令
Available commands:

  nginx_start nginx start 
  nginx_stop  nginx stop
  mysql_start mysql start

$ fab -R nginx nginx_start -- 启动 nginx
$ fab -R mysql mysql_start -- 启动 mysql

示例3:混合本地和远程操作

$ cat fabfile
def hello():
  ''' test hello '''
  with lcd('/tmp'): # 切换到 /tmp 目录下
    local('svn co http://xxx xxx') # check 代码到本地
    local('tar czf xxx.tar.gz xxx/') # 压缩本地包
    put('xxx.tar.gz', '/tmp') # 上传压缩包到远程 /tmp 目录下
  with cd('/tmp'):  # 切换到远程 /tmp 目录
    run('tar zxf xxx.tar.gz') # 远程解压

是不是看上去都是像本地一样?对吧。

示例4:多个目标服务器
相同密码或者手动输入:

env.hosts = ['root@ip1:22',root@ip2:22]

不同密码或者不想手动输入(此方法也可定义不角色一组服务器):

#coding:utf-8
from fabric.api import local,cd,put,lcd,env,run,execute,roles
env.roledefs = {
 'role1':['root@ip1:22',],
 'role2':['root@ip2:22',]
}
env.passwords={
 'root@ip1:22':'pwd1',
 'root@ip2:22':'pwd2'
}
@roles('role1')
def role1():
 with cd('/tmp'):
   run('ls -l')
@roles('role2')
def role2():
 with cd('/tmp'):
   run('ls')
def task():
 execute(role1)
 execute(role2)

相关文章

  • 使用Python读写及压缩和解压缩文件的示例

    使用Python读写及压缩和解压缩文件的示例

    Python的os模块中提供了基本的文件读写方法,而zipfile模块则针对文件的压缩和解压缩操作,这里我们就来看一下使用Python读写及压缩和解压缩文件的示例:
    2016-07-07
  • Django数据库迁移报错InconsistentMigrationHistory

    Django数据库迁移报错InconsistentMigrationHistory

    最近在使用Django,学习了一下Django数据库迁移,在执行迁移命令时,突然报错,本文就总结了一下原因,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Python 使用 Redis 作为缓存的操作方法

    Python 使用 Redis 作为缓存的操作方法

    在现代Web应用和数据密集型服务中,使用Redis作为缓存可以提升性能和响应速度,Redis是一个高性能的内存中数据结构存储系统,支持多种数据结构如字符串、哈希、列表等,并提供持久性和分布式支持,本文给大家介绍Python 使用 Redis 作为缓存的操作方法,感兴趣的朋友一起看看吧
    2024-10-10
  • Python中的哈希算法模块hashlib详解

    Python中的哈希算法模块hashlib详解

    这篇文章主要介绍了Python中的哈希算法模块hashlib详解,hashlib模块实现了多种哈希算法,包括MD5以及SHA家族的算法,通过algorithms_guaranteed可以查看hashlib中封装的所有算法,需要的朋友可以参考下
    2023-08-08
  • pyqt远程批量执行Linux命令程序的方法

    pyqt远程批量执行Linux命令程序的方法

    今天小编就为大家分享一篇pyqt远程批量执行Linux命令程序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • 对python append 与浅拷贝的实例讲解

    对python append 与浅拷贝的实例讲解

    今天小编就为大家分享一篇对python append 与浅拷贝的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 使用Python来批量检测并删除Word文档中的宏

    使用Python来批量检测并删除Word文档中的宏

    Word文档作为最常用的电子文档格式之一,经常被用来作为内容分享工具,在网络中或设备之间进行传输,其安全性也需要受到关注,宏是可嵌入Word文档中的一种VBA迷你程序,本文将介绍如何使用Python来批量检测并删除Word文档中的宏,保护计算机的安全,需要的朋友可以参考下
    2024-07-07
  • 零基础学习python偏函数语法的推导方法步骤

    零基础学习python偏函数语法的推导方法步骤

    这篇文章主要介绍了零基础学习python偏函数语法的推导方法步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Python实现为pdf添加水印功能

    Python实现为pdf添加水印功能

    这篇文章主要介绍了Python实现给普通PDF添加水印的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 最简单的matplotlib安装教程(小白)

    最简单的matplotlib安装教程(小白)

    这篇文章主要介绍了最简单的matplotlib安装教程(小白),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论