python实现SSH命令行: Fabric的使用
发布日期:2021-06-30 19:41:36 浏览次数:3 分类:技术文章

本文共 3690 字,大约阅读时间需要 12 分钟。

前言

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

Fabric官网:

安装

pip install fabric

注: Fabric依赖第三方的setuptools、Crypto、paramiko包的支持

官网提供了一个简单的入门示例:
/home/test/fabric/fabfile.py

使用

命令格式如下

fab [options]  [:arg1, arg2=val2,host=foo,hosts='h1;h2',... ]...

fab命令引用默认文件名为fabfile.py

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

fab -p Knfdkzo35(密码) -H 192.168.1.21,192.168.1.22 -- 'uname -s'

全局属性

env对象的作用是定义fabfile的全局设定,包括主机、用户、密码、角色等

env.host,定义目标主机,如env.hosts=[‘192.168.1.21’,‘192.168.1.22’]
env.use,定义用户,如env.use="root"
env.port,定义目标主机端口,默认是22,如env.port="22"
env.password,定义密码,如env.password='gjakgoe4S'
env.passwords,与password功能一样,区别在于不同主机不同密码的应用场景

env.passwords = {	'root@192.168.1.21:22': 'HSk4j4o2L',	'root@192.168.1.21:23': 'Bsj3KsqG',}

env.gateway,定义网关IP,如env.gateway='192.168.1.23'

env. + “变量名”, 如env.age,env.sex
env.roledefs,定义角色分组,如

env.roledefs = {	'webservers': ['192.168.1.21','192.168.1.22'],	'dbservers': ['192.168.1.25','192.168.1.26']}

通过@roles(‘xxxx’)修饰符的形式,角色修饰符下面的任务函数为其作用域

@roles('webservers')dev webtask():	run('etc/init.d/nginx start')	@roles('dbservers')dev dbtask():	run('etc/init.d/mysql start')	@roles('webservers', 'dbservers')dev publictask():	run('uptime')dev deploy():	excute(webtask)	excute(dbtask)	excute(publictask)

在命令行执行fab deploy就可以实现不同角色执行不同的任务函数了

常用API

local,执行本地命令,如 local('uname -s')

lcd,切换本地目录,如lcd('/home')
cd,切换远程目录,如cd('/data/logs')
run,执行远程命令,如run('free -m')
sudo,以sudo方式执行远程命令
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 failed. Continue[Y/N]?")
reboot,重启远程主机
@task,函数修饰符,标识的函数为fab可调用
@runs_once,函数修饰符。标识的函数只会执行一次,不受多台主机影响

示例

1 查看本地与远程主机信息

【home/test/fabric/simple1.py】

#!/usr/bin/env pythonfrom fabric.api import *env.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncedef local_task():	local('uname -a')def remote_task():	with cd("/data/logs"): # "with"的作用是让后面的表达式的语句继承当前状态		run("ls -l")

执行

fab -f simple1.py local_task
fab -f simple1.py remote_task

2 动态获取远程目录列表

【home/test/fabric/simple2.py】

#!/usr/bin/env pythonfrom fabric.api import *env.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncdef input_raw():	return prompt("please input directory name:", default="/home")def worktask(dirname):	run("ls -l " + dirname)@task def go():	getdirname = input_raw()	worktask(getdirname)

执行

fab -f simple2.py go

3 文件打包、上传与校验

【home/test/fabric/simple3.py】

#!/usr/bin/env pythonfrom fabric.api import *from fabric.context_managers import *from fabric.contrib.console import confirmenv.user = 'root'env.hosts = ['192.168.1.21','192.168.1.22']env.password = 'DnkIoH3k0'@runs_oncedef tar_task():	with lcd("/data/logs"):		local("tar -czf access.tar.gz access.log")def put_task():	run("mkdir -p /data/logs")	with cd("/data/logs"):		with settings(warn_only=True):			result = put("/data/logs/access.tar.gz", "/data/logs/access.tar.gz")		if result.failed and not confirm("put file failed, Continue[Y/N]?"):			abort("Aborting file put task!")def check_task():	with settings(warn_only=True):		lmd5=local("md5sum /data/logs/access.tar.gz", capture=True).split(' ')[0]		rmd5=run("md5sum /data/logs/access.tar.gz").split(' ')[0]	if lmd5 == rmd5:		print("OK")	else:		print("ERROR")@taskdef go():	tar_task()	put_task()	check_task()

执行

fab -f simple3.py go

转载地址:https://linxinfa.blog.csdn.net/article/details/89787696 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Unity升级Android SDK遇到的问题
下一篇:使用apktool工具反编译apk时遇到could not decode arsc file的解决办法

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年05月02日 02时48分37秒