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
版权声明:本文为sellsa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。