zoukankan      html  css  js  c++  java
  • 轻量级自动化运维工具Fabric的安装与实践

    一、背景环境

    在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具。

    这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事的最爱。

    为了方便自动化运维,经常会将Fabric部署在跳板机上。之所以部署跳板机是基于几点考虑的:

    1.1基于安全的考虑,只有跳板机上开放了公网IP和SSH Key登录,其他内部的业务机默认只允许内网登录,公网IP地址不对外开放。

    1.2为了方便自动化运维部署,跳板机上做了免密码登录,可以直接通过SSH命令操作其他业务机器。

    1.3设置了权限控制权限,跳板机上部署了几套key,分别对应于不同的权限分配,可以给公司的同事不同的私钥登录跳板机

    Fabric是基于Python实现的ssh命令行工具,简化了ssh的应用程序部署及系统管理任务,它为系统提供了基础的操作组件,可以实现本地或远程Shell命令,包括文件上传、下载、脚本执行及完整执行日志输出等功能。

    二、Fabric的安装

    安装Fabric时,可以选择采用Python的pip、easy_install及源码安装方式,这些方式能够很方便的解决包依赖关系。

    大家可以根据系统环境自行选择最优的安装方法,如果选择pip或easy_install安装方式,若是使用系统最小化安装,注意提前安装gcc、gcc+、make这些基础开发包和python-pip):

    yum -y install make gcc gcc++ python-devel python-pip
    

    pip是安装python包的工具,提供了安装包、列出已经安装的包、升级包及卸载包的功能,可以通过pip工具直接安装Fabric。

    使用pip 安装 Fabric的命令:

    pip install fabric

    这是推荐使用源码安装的方式:

    yum -y install python-setuptools
    cd /usr/local/src
    wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.3.0.tar.gz --no-check-certificate
    tar -xvf Fabric-1.3.0.tar.gz 
    cd Fabric-1.3.0
    python setup.py install
    

      

    下载完成后,安装相关的软件包。

    然后解压源码包,使用Python命令运行安装脚本,进行安装。

    等待安装命令运行完毕后,就可以去验证了。

    这里使用IPython进行验证,在交互解释器下,输入import fabric 查看是否导入模块成功,若无报错则表示fabric当前已经安装成功。

    三、Fabric核心API

    3.1 Fabric的核心API主要有7类:

    带颜色的输出类(color output)、上下文管理类(context managers)、装饰器类(decorators)、网络类(network)、操作类(operations)、任务类(tasks)、工具类(utils)。

    Fabric提供了一组操作简单但功能强大的fabric.api命令集,简单地调用这些API就能完成大部分应用场景的需求,Fabric支持的常用命令及说明如下。

    local:执行本地命令,如local ('uname -s')。

    lcd:切换本地目录,如lcd ('/home')。

    cd:切换远程目录,如cd ('/data/logs/')。

    run:执行远程命令,如run ('free -m')。

    sudo:以sudo方式执行远程命令,如sudo ('/etc/init.d/httpd start')。

    put:上传本地文件到远程主机,如put ('/home/user.info','/data/user.info')。

    get:从远程主机下载文件到本地,如get ('/home/user.info','/data/user.info')。

    prompt:获得用户输入信息,如prompt ('please input user password:')。

    confirm:获得提示信息确认,如confirm ('Test failed,Continue[Y/N]')。

    reboot:重启远程主机,如reboot ()。

    @task:函数修饰符。新版本的Fabric对面向对象的特性和命名空间有很好的支持。面向对象的继承和多态特性,对代码的复用极其重要。新版本的Fabric定义了常规的模块级别的函数,并带有装饰器@task,这会直接将该函数转化为task子类。该函数名会被作为任务名,后面会举例说明@task的用法。

    @runs_once:函数修饰符。标识此修饰符的函数只会执行一次,不受多台主机影响。

    3.2 下面来看看@task的用法,它可以为任务添加别名,命令如下:

    from fabric.api import task

    @task(alias='dwm')

    def deploy_with_migrations():

        pass

    用fab命令打印指定文件中存在的命令,如下:

    fab -f /home/yhc/test.py --list

    命令显示结果如下所示:

    Available commands:

    deploy_with_migrations

        dwm

    还可以通过@task来设置默认的任务,比如deploy(部署)一个子模块,命令如下:

    from fabric.api import task

    @task

    def migrate():

        pass

    @task

    def push()

        pass

    @task

    def provision():

        pass

     

    @task(default=True)

    def full_deploy():

        provision()

        push()

        migrate()

     

    fab -f /home/yhc/test.py --list

    结果如下所示:

    Available commands:

        deploy

        deploy.full_deploy

        deploy.migrate

        deploy.provision

        deploy.push

    也可以通过@task以类的形式定义任务,例如:

    from fabric.api import task

    from fabric.tasks import Task

    class MyTask(Task):

        name = "deploy"

        def run(self, environment, domain="whatever.com"):

            run("git clone foo")

            sudo("service apache2 restart")

    instance = MyTask()

    下面采用@task方式的代码跟上面的代码效果是一样的:

    from fabric.api import task

    from fabric.tasks import Task

    @task

    def deploy(environment, domain="whatever.com"):

        run("git clone foo")

        sudo("service apache2 restart")

    大家可以对比看看,是不是采用@task函数修饰器的方式更为简洁和直观呢?

    关于@task修饰器的用法和其他fabric.api命令,请参考Fabric官方文档http://fabric-chs.readthedocs.org/zh_CN/chs/tutorial.html。

    3.3这里举个例子说明一下@runs_once用法,源码文件/home/yhc/test.py文件内容如下所示:

    #!/usr/bin/python

    # -*- coding: utf-8 -*-

    from fabric.api import *

    from fabric.colors import *

     

    env.user = "root" #定义用户名,env对象的作用是定义Fabric指定文件的全局设定

    env.password = "redhat" #定义密码

    env.hosts = ['192.168.1.204','192.168.1.205']

    #定义目标主机

     

    @runs_once

    #当有多台主机时只执行一次

    def local_task(): #本地任务函数

        local("hostname")

        print red("hello,world")

        #打印红色字体的结果

    def remote_task(): #远程任务函数

        with cd("/usr/local/src"):

           run("ls -lF | grep /$")

    #with是Python中更优雅的语法,可以很好地处理上下文环境产生的异常,这里用了with以后相当于实现了"cd /var/www/html && ls -lsart"的效果。

    通过fab命令调用local_task本地任务函数,命令如下:

    fab -f test.py local_task

    结果如下所示:

    [192.168.1.204] Executing task 'local_task'

    [localhost] local: hostname

    client.cn7788.com

    My hostname is client.cn7788.com

    Hello,world!

    Done.

    上述命令显示的虽然不是本机的IP地址,但实际上并没有在主机192.168.1.204上面执行命令,而是在本地主机client.cn7788.com(IP为192.168.1.206的机器)上执行了命令,并以红色字体显示了 “hello,world”和“My hostname is client.cn7788.com”。

    调用remote_task远程函数显示结果,分别在204和205的机器上打印/usr/local/src/下面存在的目录,结果如下:

    [192.168.1.204] Executing task 'remote_task'

    [192.168.1.204] run: ls -lF | grep /$

    [192.168.1.204] out: drwxr-xr-x. 2 root root    4096 Nov 22 00:01 download/

    [192.168.1.204] out: drwxr-xr-x. 9  501 games   4096 Nov 19 04:44 Fabric-1.3.0/

    [192.168.1.204] out: drwxr-xr-x. 2 root root    4096 Nov 22 00:01 object/

     

    [192.168.1.205] Executing task 'remote_task'

    [192.168.1.205] run: ls -lF | grep /$

    [192.168.1.205] out: drwxr-xr-x. 2 root root  4096 Nov 22 04:58 mysql/

    [192.168.1.205] out: drwxr-xr-x. 2 root root  4096 Nov 22 04:58 puppet/

    [192.168.1.205] out: drwxr-xr-x. 2 root root  4096 Nov 22 04:58 soft/

    [192.168.1.205] out: drwxr-xr-x. 2 root root  4096 Nov  3 07:56 test/

    Done.

    Disconnecting from 192.168.1.204... done.

    Disconnecting from 192.168.1.205... done.

  • 相关阅读:
    图解攻略:轻松在苹果Macbook Air上装Win7
    Redis的安装与idea中的使用
    CAD中如何裁剪需要的区域
    Layui 使用问题汇总
    Instant Run 的操作影响到了代码,导致Android App启动闪退的问题
    Android studio百度地图demo出现230错误,key校验失败
    「小程序JAVA实战」小程序注册界面的开发(29)
    「小程序JAVA实战」小程序和后台api通信(28)
    「小程序JAVA实战」小程序多媒体组件(27)
    「小程序JAVA实战」小程序导航组件(26)
  • 原文地址:https://www.cnblogs.com/yihr/p/10726587.html
Copyright © 2011-2022 走看看