fabric 发布项目

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 更多Fabric的介绍和使用教程,可以访问 官方教程地址 一. Hello, Fabric首先用vim fabfi...
    TyiMan阅读 7,179评论 2 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • fabric学习和实验 安装package:virtualenv [root@BIGDATA1 pip-9.0.1...
    jianwbj阅读 773评论 0 0
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,127评论 2 34
  • 感情有时候来得很简单,比如一句话,一条短信,或是一次偶然的聊天。只是你自己不知道,然后日久生情,随着时间推移,可能...
    安痞儿阅读 179评论 0 1