简介
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
