美文网首页
fabric 发布项目

fabric 发布项目

作者: bdslinux | 来源:发表于2016-02-05 12:37 被阅读1566次
    image

    fabric 介绍

    • Fabic是一个python(2.5-2.7)库,用于简化使用ssh的应用程序部署,或系统管理任务
    • 它提供的操作包括: 执行本地或者远程shell命令,上传/下载文件,以及其他辅助的功能,如提示用户输入,中止执行等
      Github主页: http://github.com/fabric/fabric

    fabric的安装

    shell 脚本实现

    #!/bin/bash 
    Install() { 
            yum install python-setuptools python-devel -y
            easy_install  pip
            pip  -v uninstall  pycrypto  
            pip  -v  install   pycrypto  --upgrade 
            pip   install  fabric
    } 
    Install
    [  $? -eq 0 ]  &&  fab -V  || echo "Install fabric error!"
    

    常用的fabric接口

    • local : 执行本地命令,如local('uname -s')
    • lcd: 切换本地目录, 如lcd('/home') ,进入到home目录下
    • cd: 切换远程的目录, 如cd('/tmp')
    • run: 执行远程命令, 如run('free -m')
    • sudo: 以sudo的方式执行远程命令,如:sudo(/etc/init.d/httpd start)
    • put: 上传本地文件到远程主机,put('/etc/fstab','/tmp/fstab.info')
    • get: 从远程主机下载本地文件到主机 ,get('/etc/fatab','/tmp/fstab.info')
    • prompt:获得用户输入信息交互式,prompt('plese input user password:')
    • confirm: 获得提示信息确认,confirm('please continue[y/n]')
    • reboot: 重启远程主机reboot()
    • colors: 输入颜色用的

    常用的命令

    • -l: 显示定义好的任务函数名字
    • -f: 指定fab入口的文件,默入口文件名为fabile.py
    • -g: 指定网关设备,比如堡垒机环境,填写堡垒机ip即可
    • -H:指定目标主机, 多台主机用''号分隔
    • -P:以异步并行方式运行多个主机任务,默认为串行运行
    • -R:指定role角色,以角色名字区分不同业务组设备
    • -T: 设定远程主机命令执行超时时间
    • -t: 设定设备的连接超时时间
    • -w: 当命令执行时效,发出警告,而非默认终止任务

    常用的装饰器

    • @runs_once: 函数修饰符,标识符的函数只会执行一次,不受多台主机的影响
    • @task: 函数修饰符,标识符的函数为fab可调用,非标记的fab不可见,纯属业务逻辑
    • @hosts: 定义按照主机来执行如hosts('user1@hostname','user2@hostname')
    • @roles: 函数修饰符,定义按照角色分组来执行,如@roles('web','db')
    • @parallel 和@serial: 任务并行或串行执行,如果任务同时被 serial 和 parallel 装饰器装饰,parallel 的优先级更高。
    • @with_setting(warn_only=True): warn_only表示是否当在远程机器上执行命令,出现错误时,fabric是否退出。将整个函数封装起来,其效果类似于执行在 settings 上下文管理器中。如果你想要修改函数的设置,但不愿改动其缩进时,它会很有用。

    fabric env 环境变量

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

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

    • env.all_hosts:Default 为 [],由 fab 设置的当前正在执行命令的主机列表。仅用于显示信息。

    • env.exclude_hosts : Default 为 [],指定一个主机串列表, fab 执行期间会跳过列表中的主机。例:env.exclude_hosts = [ '192.168.1.102' ]

    • env.port:定义目标主机端口,默认为22。例:env.port = '80'。

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

    • env.passwords:与 password 功能 一样,区别在于不同主机不同密码的应用场景,需要注意的是,配置passweords时需要配置用户,主机,端口等信息。例:

    • env.passwords = {
      'root@192.168.1.104:22':'123',
      'root@192.168.1.86:22':'789',
      'root@222.24.51.147:22':'345643',
      }

    • env.parallel :全局并行参数,例 env.parallel = True 。
      </code>

    fabric 的简单使用(-)

    Fabric工具提供了一个简单的构建工具fab,其作为Fabric程序的命令行入口,提供了丰富的参数调用。

    fab 默认会读取当前目录叫做fabfile.py名字的文件,这个是默认的, 如果当前目录没有,就去上级目录
    也就是父目录中去找这个文件

    [root@bdstravel fabric]# cat fabfile.py
    #!/usr/bin/env python 
    
    def hello():
            print("hello world")
    [root@bdstravel fabric]# fab hello 
    hello world
    
    Done.
    [root@bdstravel fabric]# 
    

    如果不想以fabfile.py 命名文件的话 ,比如fuck.py 执行的时候如下

    [root@bdstravel fabric]# cat fuck.py
    #!/usr/bin/env python 
    def  fuck():
            print("hello world")
    [root@bdstravel fabric]# fab -f fuck.py fuck 
    hello world
    
    Done.
    
    @task  #如果定义了task,那么其他的任务也要定以,否则-l的时候任务不显示,提示variable comment 
    def mod():                 #本地任务函数
            with lcd('/tmp'):  #‘with’的作用是让后面的表达式语句继承当前状态,即实现‘cd('/tmp') && ls’ 的效果
                    run('echo "budongshu" > bds.tmp') 
                    run('ls')
    [root@bdstravel fabric]# fab -f hostinfo.py mod
    [127.0.0.1] Executing task 'mod'
    [127.0.0.1] run: echo "budongshu" > bds.tmp
    [127.0.0.1] run: ls
    [127.0.0.1] out: anaconda-ks.cfg  deploy_git.sh        fabric       install.log.syslog  nohup.out
    [127.0.0.1] out: bds.tmp                 dnspod_load_agent.sh  install.log  nginx-1.8.0.tar.gz  shadowsocks-libev
    [127.0.0.1] out: 
    
    Done.
    

    fabric 的 简单实用(二)

    [root@bdstravel fabric]# cat hostinfo.py
    #!/usr/bin/env python 
    
    from fabric.api import * 
    from fabric.colors import * 
    import os 
    
    env.user = 'root' 
    env.hosts = ['127.0.0.1'] 
    env.port = '22'
    def hname():
            print('print hostname....') 
            local('hostname')
     
    [root@bdstravel fabric]# fab -f hostinfo.py -l
    Available commands:
    
        hname
    
    [root@bdstravel fabric]# fab -f hostinfo.py hname
    [127.0.0.1] Executing task 'hname'
    print hostname....
    [localhost] local: hostname
    bdstravel
    
    Done.
    

    fabric 简单实用进阶

    不想打印过程

    [root@bdstravel fabric]# cat hostinfo.py
    #!/usr/bin/env python 
    
    from fabric.api import * 
    from fabric.colors import * 
    import os 
    
    env.user = 'root' 
    env.hosts = ['127.0.0.1'] 
    env.port = '22'
    def hname():
            print(red('print hostname....')) 
            with settings(hide('running'), warn_only=True):
                    local('hostname')
    
    
    [root@bdstravel fabric]# fab -f hostinfo.py hname
    [127.0.0.1] Executing task 'hname'
    print hostname....        #打印输出的是红色
    bdstravel
    
    Done.
    

    对上一步操作做出判断

    [root@bdstravel fabric]# cat hostinfo.py
    #!/usr/bin/env python 
    #coding:utf-8
    from fabric.api import * 
    from fabric.colors import * 
    import os 
    env.user = 'root' 
    env.hosts = ['127.0.0.1'] 
    env.port = '22'
    def hname():
            print(red('print hostname....')) 
            with settings(hide('running'), warn_only=True):
                    res = local('hostname')
                    if res.return_code == 0: 
                            print (red('-'*30)) 
                            print (green('打印成功')) 
                            print (red('-'*30))
                    else: 
                            print (blue('#'* 30 )) 
                            print (red('打印失败')) 
                            print (blue('#'* 30 ))
    
    [root@bdstravel fabric]# vim hostinfo.py          
    [root@bdstravel fabric]# fab -f hostinfo.py  hname
    [127.0.0.1] Executing task 'hname'
    print hostname....
    bdstravel
    ------------------------------
    打印成功
    ------------------------------
    
    Done
    

    res = local('hostname') 修改为 res = local(red('hostname')) 就是为了让他报出一个错误

    [root@bdstravel fabric]# fab -f hostinfo.py  hname
    [127.0.0.1] Executing task 'hname'
    print hostname....
    /bin/sh: hostname: command not found
    
    Warning: local() encountered an error (return code 127) while executing 'hostname'
    
    ##############################
    打印失败
    ##############################
    
    Done.
    

    fabric部署lnmp

    #!/usr/bin/env python 
    #coding:utf-8
    
    from fabric.colors import *
    from fabric.api import *
    """
    自动化部署lnmp环境 
    """
    env.roledefs = {
            'web':['128.199.177.154']
            'db':['127.0.0.1']
    }
    env.passwords = {
            'root@128.199.177.154:22':'centos',
            'root@127.0.0.1:22':'centos'
    }
    @roles('web')
    def webtask():                                  #部署nginx php php-fpm等环境
            print('install nginx php php-fpm...')
            with settings(warn_only=True):
                    run('yum install nginx -y')
                    run('yum install php-fpm php-mysql php-mbstring php-xml php-mcrypt php-gd -y')
                    run('chkconfig --levels 35 php-fpm on')
                    run('chkconfig --levels 35 nginx on')
    @roles('db')
    def dbtask():                                   #部署mysql环境
            print(yellow('install mysql...'))
            with settings(warn_only=True):
                    run('yum install mysql-server -y')
                    run('chkconfig --levels 35 on')
    @roles('web','db')
    def default_task():
            print(yellow('install epel ntp ...'))
            with settings(warn_only=True):
                    run('wget -P   /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-6.repo')
                    run('yum install ntp')
    def deploy():                                     #部署入口
            execute(default_task)
            execute(webtask)
            execute(dbtask)
    

    相关文章

      网友评论

          本文标题:fabric 发布项目

          本文链接:https://www.haomeiwen.com/subject/njoekttx.html