简介
Fabric是基于Python实现的SSH命令行工具,简化了SSHDE应用程序部署及系统管理任务,它提供了系统基础大操作组件,可实现本地或远程shell命令,包括:命令执行、文件上传下载,完整执行日志输出等功能。Farbric在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命令操作
上面的实例也可以写成一行代码
fabgile文件的编写
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