Fabric:Python远程部署工具

发布时间:2019-06-24 15:53:34编辑:auto阅读(1322)

    关于Fabric


    Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。

    Fabric通过把大量频繁使用的SSH操作写入到一个脚本中(fabric.py),来远程执行一些应用部署或者系统维护的任务。Fabric是类似paramiko的一个库,是对paramiko的再次封装,所以比使用paramiko更简单。

    Fabric的优点:

    1. 角色定义

    2. 代码易读

    3. 封装了本地、远程操作

    4. 参数灵活,能偶动态指定host/role等,还有并发执行(基于multiprocessing)

    5. 完整的日志输出


    安装Fabric


    Fabric的安装很简单,可以直接使用pip或者easy_install安装到当前Python环境中,或者下载最新的源码使用"python setup.py xxx"的方式来安装:

    #pip install fabric


    使用Fabric


    1 Fabric通过命令行工具fab来执行定义在fabfile.py中的任务,常用的配置和函数如下


    1. 常用的fab命令选项和参数:

    -l    显示可用的task

    -H    指定host,多个host用逗号分开

    -R    指定role,多个role用逗号分开

    -P    并分数,默认是串行

    -w    warn_only,默认为遇到异常直接放弃执行并退出

    -f    指定入口文件,fab默认入口文件是:fabfile/fabfile.py


    2. fabfile.py文件中常用配置和函数:

    env.host        主机ip,也可以使用fab选项-H参数来指定

    env.password    SSH密码,若已经设置好无密码登录,则可以忽略

    env.roledefs    角色分组,如:{'web': ['x', 'y'], 'db': ['z']}

    local('pwd')    执行本地命令

    lcd('/tmp')        切换本地目录

    cd('/tmp')        切换远程目录

    run('uname -s')        执行远程命令

    sudo('service httpd restart')    执行远程sudo,注意pty选项


    2 任务函数


    Fabric中的任务就是一个个Python函数,通过将上述的函数封装到某一个函数中来执行相应的任务

    示例:

    #cat fabfile.py

    from fabric.api import run

    def host_type():

       run('uname -s')


    def hello(name="jayzhou"):

       print("Hello %s!" % name)


    def combine(name="jayzhou"):

       hello(name)

       host_type()

    在执行任务的时候,可以通过fab的命令行参数为任务函数传递参数:

    #fab hello:name=Rango


    3. 管理远程服务


    1. 获取远程服务器版本信息

    #cat fabfile.py

    from fabric.api import env

    from fabric.api import cd

    from fabric.api import run

    from fabric.api import local

    from fabric.api import get

    from fabric.api import put


    env.hosts = ['192.168.56.101', '192.168.56.102']

    env.user = 'root'

    env.password = "password"


    def get_version():

       local('cat /etc/issue')

       run('cat /etc/issue')

       with cd('/root/'):

           put('/home/rango/test.txt', 'test.txt', mode=0755)

           get('hello_world.txt')

       run('ls')


    def get_host_name():

       run('hostname')

    运行:

    #fab -f fabfile.py get_version


    2. 管理远程httpd服务:

    #cat fabfile.py

    from fabric.api import *

    env.hosts = ['192.168.56.101', '192.168.56.102']

    env.user = 'root'

    env.password = "password"


    @task

    def httpd_start():

       ''' httpd start '''

       sudo('service httpd start')


    @task

    def httpd_stop():

       ''' httpd stop '''

       sudo('service httpd stop')

    查看可用命令:

    #fab -f fabfile.py --list

    Available commands:

       httpd_start  httpd start
       httpd_stop   httpd stop

    执行:

    #fab -f fabfile.py httpd_start


    3. 基于角色

    #cat fabfile.py

    #!/usr/bin/env python
    #coding:utf-8

    from fabric.api import *
    env.roledefs = {'httpd': ['192.168.56.101', '192.168.56.102'], 'mysql': '192.168.56.103'}

    @task
    def mysql_start():
       '''mysql start'''
       sudo('/etc/init.d/mysql start')

    @task
    def httpd_start():
       '''httpd start'''
       sudo('/etc/init.d/httpd start')

    @task
    def httpd_stop():
       '''httpd stop'''
       sudo('/etc/init.d/httpd stop')

    查看可用命令:

    #fab -f fabfile.py --list

    Available commands:

       httpd_start  httpd start
       httpd_stop   httpd stop
       mysql_start  mysql start

    执行:

    #fab -f fabfile.py -R httpd httpd_start
    #fab -f fabfile.py -R mysql mysql_start


    4. 直接使用Fabric库

    #cat fabfile.py

    #!/usr/bin/env python
    #coding:utf-8

    from fabric.state import env, connections
    from fabric.tasks import execute
    from fabric.api import run

    env.user = 'root'
    env.password = 'password'
    hosts = ['192.168.56.101', '192.168.56.102']

    def myls(path):
       run('ls %s' % path)

    execute(myls, path='/root/', hosts=hosts)

    for key in connections.keys():
       connections[key].close()
       del connections[key]

    在这一段代码中使用env来获取和设置环境参数,使用execute执行自定义的函数,然后使用connections来管理连接。其中execute通过传递参数可以在fab命令中指定目录。

    执行:

    #fab -f fabfile.py myls:path=/root

                                                                                                                                   ——游响云停



关键字

上一篇: python-logging

下一篇: python备份mysql数据库