Fabric自动化运维工具

简介

Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础大操作组件,可以实现本地或远程shell命令,包括:命令执行、文件上传、下载及完整执行日志输出等功能。Fabric在Paramiko的基础上做了更高一层的封装,操作起来会更加简单。

安装Fabric

安装pip命令
yum -y install epel-release
yum install python-pip
pip install --upgrade pip(升级)

安装依赖包
yum install -y openssl openssl-devel gcc gcc-c++ python-devel

安装Fabric
pip install fabric

命令说明

格式
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...]...

常用参数
-l  显示定义好的任务函数名
-f  指定fab入口文件,默认入口文件名为fabfile.py
-g 指定网关(中转)设备,比如堡垒机环境,填写堡垒机ip即可
-H 指定目标主机,多台主机用","号分隔
-P 以异步并行方式运行多主机任务,默认是串行运行
-p 远程帐号的密码,fab执行时默认使用root账户
-R 指定roel(角色),以角色名区分不同业务组设备
-t 设置设备连接超时时间(秒)
-T 设置远程主机命令执行超时时间(秒)
-w 当命令执行失败,发出警告,而非默认中止任务

示例

编写一个fabfile.py文件
fab命令操作
上面实例也可以写成一行代码

fabfile文件编写

fab命令是结合fabfile.py文件(其他文件通过-f filename参数来引用)来搭配使用的。fab的部分命令行参数还能通过相应的方法来代替,如:
fabfile之env对象
env对象的最用是定义fabfile的全局设定,就像上面的举例,下面对个属性进行说明:
env.hosts:           定义目标主机,可以用IP或主机名表示,以python的列表形式定义。如env.hosts=["192.168.88.2", "192.168.88.3"]
env.exclude_hosts:    排除指定主机,如env.exclude_hosts=['192.168.88.2']
env.user              定义用户名,如env.user='root'
env.port              定义端口,默认为22,如env.port='22'
env.password          定义密码,如env.password='123.com'
env.passwords         定义多个密码,不同主机对应不同密码,如:env.passwords={'root@192.168.88.2:22':'123.com', 'root@192.168.88.2:22':'123456'}
env.gateway           定义网关(中转,堡垒机)ip,如env.gateway='192.168.88.10'
env.roledefs          定义角色组,比如web组合db组主机区分开来env_roledefs={'webserver':['192.168.88.2', '192.168.88.3'], 'dbserver':['192.168.88.4']}
env.deploy_release_dir 自定义全局变量,格式:env. + '变量名', 如env.age,  env.sex等
env.roledefs的使用方法实例

 Fabric常用API

local   执行本地命令,如local('uname -s')
lcd     切换本地目录,如lcd('/home')
cd      切换远程目录
run     执行远程命令
sudo  sudo   方式执行远程命令,如sudo('/etc/init.d/httpd start')
put          上传本地文件到远程主机,如put('/home/user.info', '/data/user.info')
get          从远程主机下载文件到本地,如get('/data/user.info', '/home/user.info')
prompt       获得用户输入信息,如prompt('please input user password:')
confirm      获得提示信息确认,如confirm('Test faild, Continue[Y/N]?')
reboot       重启远程主机,如reboot()

@task        函数装饰符,标识的函数为fab可调用,非标记对fab不可见,纯业务逻辑
@runs_once   函数装饰符,标识的函数只会执行一次,不受多台主机影响

Fabric应用示例说明

查看本地与远程主机信息
本示例调用local方法执行本地命令,添加@runs_once修饰符保证任务函数只执行一次,调用run方法执行远程命令
动态获取远程目录列表
本例调用@task修饰符标志入口函数go()对外部可见,配合@runs_once修饰符接收用户输入,最后调用worktask()函数实现远程命令
查看定义的函数名
执行
测试发现:
①设置了默认值,不输入就是以默认值为准,如果不设置默认值,那么dirname就是空的,ls -l的就是你登录用户的家目录
②对于写在go函数的内容,有多少主机就会循环多少次,它是以主机为循环的
③这个脚本是对于所有主机列出同一个目录,对于不同的主机选择不同的目录,可以简单的修改为:

文件打包校验(把context_manages 改为context_managers)

这样我们可以分开执行,也可以执行go函数达到一键执行的目的

网关模式文件上传与执行

本例通过定义env.gateway网关模式,即熟称的中转、堡垒机环境。通过网关对其他主机进行文件上传和执行
堡垒机环境:
192.168.88.1(Fabric) ------------->192.168.88.2---------------->192.168.88.3
                                                        (堡垒机) ---------------->192.168.88.4
之前看到上面的脚本不是很理解,感觉192.168.88.2是多余的。其实这种想法是错误的。上面脚本的目的是把88.1里面的文件包通过88.2中转 来传输到88.3、88.4并执行。并不是88.2直接传输到88.3、88.4。那么这样做有什么作用呢?我通过实验:88.3和88.4开启防火墙丢弃88.1所
有的包,但是接收88.2的包,这种情况下,价值就体现出来了。88.1并不能联通88.3,88.4。但是作为堡垒机88.2可以。如果我们不用网关模式
是不能够完成88.1直接传输文件到88.2,88.3,也不能够执行远程命令。

生产案例--代码包发布管理

生产案例--分发SSH key

 
 
 
posted @ 2017-04-19 14:29  sellsa  阅读(1648)  评论(0编辑  收藏