Linux系统自动化运维(Python版)(微课版)-项目6_第1页
Linux系统自动化运维(Python版)(微课版)-项目6_第2页
Linux系统自动化运维(Python版)(微课版)-项目6_第3页
Linux系统自动化运维(Python版)(微课版)-项目6_第4页
Linux系统自动化运维(Python版)(微课版)-项目6_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux系统自动化运维(Python版)(微课版)工业和信息化精品系列教材项目6

远程管理和批量运维服务器人民邮电出版社能力CAPACITY要求了解SSH远程管理功能,学会使用Paramiko库编程实现SSH客户端。熟悉Fabric库的用法,学会使用Fabric库编程实现源代码批量部署。学会使用Fabric库编程实现多服务器的系统集中监控。学会使用Fabric库编程实现程序批量部署。任务6.2使用Fabric库批量管理和运维服务器任务6.1使用Paramiko库远程管理服务器任务6.1使用Paramiko库远程管理服务器任务说明01OPTION02OPTION03OPTION了解SSH协议了解Paramiko库及其基本用法学会使用Paramiko库编程实现以密钥认证方式登录服务器04OPTION学会使用Paramiko库编程实现文件传输任务6.1使用Paramiko库远程管理服务器相关知识6.1.1SSH协议SSH基于成熟的公钥加密体系,将所有传输的数据进行加密,保证数据在传输时不被恶意破坏、泄露和篡改。SSH使用多种加密和认证方式,解决传输中数据加密和身份认证的问题,能有效防止网络嗅探和IP地址欺骗等攻击。SSH用户认证方式密码认证密钥认证Linux平台广泛使用开源的OpenSSH程序实现SSH协议。任务6.1使用Paramiko库远程管理服务器相关知识6.1.2Paramiko库简介Paramiko库实现SSH协议建立远程安全连接远程命令执行远程文件传输SSH代理安装Paramiko库pipinstallparamiko任务6.1使用Paramiko库远程管理服务器相关知识6.1.2Paramiko库简介Paramiko库的核心类Channel:用于实现SSH通道,建立安全的SSH传输通道。SSHClient:用于实现SSH客户端,以便与SSH服务器建立会话。Message:用于实现SSH2消息(字节流形式)。Packetizer:用于实现基本的SSH数据包协议。Transport:用于实现会话之间的流隧道(通道)。任务6.1使用Paramiko库远程管理服务器相关知识6.1.3使用SSHClient类建立SSH连接SSHClient类的常用方法connect()——用于实现远程服务器的连接与认证set_missing_host_key_policy()——设置服务器公钥未被记录到known_hosts文件时的应对策略

exec_command()——在成功连接到服务器之后远程执行命令open_sftp()——用于在当前SSH会话的基础上创建一个SFTP会话任务6.1使用Paramiko库远程管理服务器相关知识6.1.3使用SSHClient类建立SSH连接SSHClient类的用法示例importparamiko#创建SSH对象ssh=paramiko.SSHClient()#允许连接未在know_hosts文件中列出的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接服务器ssh.connect(hostname='0',port=22,username='root',password='abc123')#执行命令stdin,stdout,stderr=ssh.exec_command('ls-ltr/etc')#获取命令执行结果res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())任务6.1使用Paramiko库远程管理服务器相关知识6.1.3使用SSHClient类建立SSH连接SSHClient类的用法示例#再执行另一条命令并获取命令执行结果stdin,stdout,stderr=ssh.exec_command('df')res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())#关闭连接ssh.close()任务6.1使用Paramiko库远程管理服务器相关知识6.1.4使用Transport类控制SSH连接importparamiko#创建Transport对象transport=paramiko.Transport(('0',22))#建立SSH连接transport.connect(username='gly',password='abc123')#创建SSHClient对象并将其_transport变量指定为上述Transport对象ssh=paramiko.SSHClient()ssh._transport=transport#使用SSHClient对象的方法进行远程操作stdin,stdout,stderr=ssh.exec_command('ls-ltr/etc')print(stdout.read().decode())#可以创建SFTPClient对象,继续利用Transport对象及其连接执行文件传输操作#关闭Transport对象及其连接transport.close()任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.1搭建多服务器实验环境Linux服务器配置修改服务器的主机名和IP地址主机名IP地址操作系统SSH服务器centossrv-a0CentOSStream8安装并启用centossrv-b1CentOSStream8安装并启用ubuntusrv-a0UbuntuServer20.04安装并启用任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.2基于密钥认证连接远程服务器配置SSH密钥(1)在SSH服务器端启用密钥认证。(2)在客户端生成密钥。(3)将公钥提供给SSH服务器。(4)连接远程服务器进行测试。任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.2基于密钥认证连接远程服务器编写Python程序importparamiko#获取私钥private_key=paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')#创建SSH对象ssh=paramiko.SSHClient()#允许连接不在know_hosts文件中列出的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接服务器,这里指定用户名和私钥ssh.connect(hostname='0',port=22,username='root',pkey=private_key)#执行命令stdin,stdout,stderr=ssh.exec_command('df')#获取命令执行结果res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())#关闭连接ssh.close()任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.3在远程服务器上执行sudo命令#使用非root账户连接服务器ssh.connect('0',port=22,username='gly',password='abc123')#执行sudo命令时加上-S选项stdin,stdout,stderr=ssh.exec_command('sudo-Scat/etc/shadow')#通过标准输入提供用户密码,注意\n表示回车换行stdin.write('abc123\n')#刷新标准输入的内部缓冲区,将其中内容立即提供给标准输入stdin.flush()res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.4实现交互式操作的远程伪终端importparamikoimportsysimportsocketimportselect#创建SSH对象并连接服务器ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect('0',port=22,username='root',password='abc123')#启动交互式Shell会话返回一个新的通道channel=ssh.invoke_shell()任务6.1使用Paramiko库远程管理服务器任务实现任务6.1.4实现交互式操作的远程伪终端#通过循环监控用户输入和服务器的回显数据whileTrue:

readable,writeable,error=select.select([channel,sys.stdin,],[],[],1)#如果服务器有数据返回(通常是命令执行结果),则在终端进行显示

ifchannelinreadable:try:data=channel.recv(1024) #获取服务器的回显数据data=str(data,encoding='utf-8')#将字节转换为字符串

iflen(data)==0:print('\r\n***EOF\r\n')breaksys.stdout.write(data) #写入标准输出的缓冲区

sys.stdout.flush() #刷新缓冲区,将缓冲区内容显示出来

exceptsocket.timeout:pass#如果用户在终端输入内容(通常是Shell命令),则将内容发送到服务器

ifsys.stdininreadable:input=sys.stdin.readline()channel.sendall(input)#关闭通道和连接channel.close()ssh.close()任务6.2使用Fabric库批量管理和运维服务器任务6.1使用Paramiko库远程管理服务器任务6.2使用Fabric库批量管理和运维服务器任务说明01OPTION02OPTION03OPTION了解Fabric库及其基本用法了解远程执行sudo命令的解决方案掌握基于Fabric库的源代码批量部署程序编写方法04OPTION05OPTION掌握Fabric库的系统集中监控程序编写方法掌握Fabric库的程序批量自动部署程序编写方法任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.1Fabric库简介特点提供丰富的SSH交互接口。集成系统基础操作组件以简化程序部署和系统管理运维操作。用来在远程服务器上自动化、流水化地执行Shell命令。安装Fabric2最新版。pipinstallfabric使用Fabric库实现自动化部署和运维的基本步骤(1)在远程服务器测试要执行任务的Shell命令或脚本,尽可能地采用非交互式。(2)使用Fabric库编写执行自动化任务的Python程序。(3)运行程序进行测试,确定是否达到目标。任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.2Connection类的基本用法使用Connection类建立连接

__init__(host,user=None,port=None,config=None,gateway=None,forward_agent=None,connect_timeout=None,connect_kwargs=None,inline_ssh_env=None)Connection类的常用方法方法功能open()打开连接run()在远程服务器上执行命令sudo()以sudo方式在远程服务器上执行命令put()将本地文件上传到远程服务器get()从服务器上下载文件local()在本地系统上执行Shell命令,该方法实际上是invoke.run()close()关闭连接任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.2Connection类的基本用法连接服务器并执行命令fromfabricimportConnectionhost='0'user='root'password='abc123'#实例化Connection类以建立SSH连接c=Connection(host=host,user=user,connect_kwargs={'password':'abc123'})#在远程系统上运行命令(用run()方法),并获得返回结果result=c.run('uname-r')#显示执行命令返回的结果print(result.stdout.strip())#继续执行命令c.run('df')#切换当前目录连续执行多条命令withc.cd('/home'):c.run("mkdir-ptestdir")c.run("touchtestfile")c.run("ls-l")#自动切换回之前的目录c.run("pwd")c.close()任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.3为sudo命令自动提供密码使用invoke模块的Responder对象提供sudo密码frominvokeimportResponderfromfabricimportConnectionc=Connection('gly@0',connect_kwargs={'password':'abc123'})user='gly'password='abc123'sudopass=Responder(pattern=f'\[sudo\]passwordfor{user}:',response=password+'\n')#注意需要设置pty=True以启用伪终端c.run('sudocat/etc/shadow',pty=True,watchers=[sudopass])c.close()任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.3为sudo命令自动提供密码使用Config类提供sudo密码fromfabricimportConfigfromfabricimportConnection#预先配置sudo密码config=Config({'sudo':{'password':'abc123'}})c=Connection('gly@0',connect_kwargs={'password':'abc123'},config=config)#使用sudo方法执行命令c.sudo(cat/etc/shadow')c.close()任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.4批量操作远程服务器使用Group类fromfabricimportSerialGroupasGrouphosts=("root@0","gly@0")pool=Group(*hosts,connect_kwargs={"password":"abc123"})pool.run('mkdir-p/tmp/test')pool.put('fabric_basic.py','/tmp/test')pool.close()任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.4批量操作远程服务器使用Group类(改进)fromfabricimportSerialGroupasGrouphosts=("root@0","gly@0")pool=Group(*hosts,connect_kwargs={"password":"abc123"})#定义函数,参数为Connection对象defupload(c):#如要创建的目录不存在,则创建该目录

ifnotc.run('test-e/tmp/test',warn=True):c.run('mkdir-p/tmp/test')c.put('fabric_basic.py','/tmp/test')#遍历组成员,每个连接执行该函数forconninpool:upload(conn)任务6.2使用Fabric库批量管理和运维服务器相关知识6.2.5传统的fab命令行工具在fabfile文件中使用函数定义任务fromfabricimporttask@taskdefupload(c):ifnotc.run('test-e/tmp/test',warn=True):

c.run('mkdir/tmp/test')c.put('fabric_basic.py','/tmp/test’)执行由upload()函数定义的任务fab-Hcnetossrv-aupload任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.1批量部署源代码部署源代码的一般步骤(1)本地打包源文件。(2)将源文件包上传到目标服务器。(3)校验文件的一致性。可比对本地源文件包和服务器上的源文件包的MD5值。(4)在目标服务器上对源文件包进行解压缩。任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.1批量部署源代码Python程序实现批量部署fromfabricimportConfigimportinvoke#定义目标服务器集合hosts=("root@0","gly@0")#配置sudo密码config=Config(overrides={'sudo':{'password':'abc123'}})#创建Group对象,统一建立组成员服务器的SSH连接group=Group(*hosts,connect_kwargs={"password":"abc123"},config=config)任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.1批量部署源代码Python程序实现批量部署#本地文件打包invoke.run("tar-czfsource_test.tar.gz*.py")#计算本地压缩包文件的MD5值local_md5=invoke.run("md5sumsource_test.tar.gz").stdout.split('')[0]#定义上传校验函数defupload_check(c):c.sudo("mkdir-p/source_test")#修改目标目录权限

c.sudo("chmod777/source_test")#上传压缩包文件

c.put("source_test.tar.gz","/source_test/")#计算已上传的压缩包文件的MD5值

remote_md5=c.run("md5sum/source_test/source_test.tar.gz").stdout.split('')[0]任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.1批量部署源代码Python程序实现批量部署#比较本地与远程压缩包文件的MD5值,进行校验

ifremote_md5==local_md5:print(c.host+"服务器上已完成上传")

c.run("tar-zxvf/source_test/source_test.tar.gz-C/source_test")else:print(c.host+"服务器上上传失败")#还原目标目录权限

c.sudo("chmod754/source_test")#遍历组成员并执行上传校验函数forconningroup:upload_check(conn)group.close()任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.2集中采集多台服务器的系统信息Python程序fromfabricimportSerialGroupasGrouphosts=("root@0","gly@0")group=Group(*hosts,connect_kwargs={"password":"abc123"})#定义汇总服务器系统信息的数组data_total=[]#定义执行Shell命令采集系统信息的函数defget_sysinfo(c):#定义采集服务器系统信息的命令字典

sys_commands={"hostname":"hostname",┈┈"disk_usage":"df/|sed-n'2p'|awk'{print$5}'"}data_sys={}#定义汇集单台服务器系统信息结果的字典任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.2集中采集多台服务器的系统信息Python程序

#遍历字典,执行Shell命令采集多种系统信息(其中CPU和内存使用率需单独计算)

foritem,commandinsys_commands.items():ifitem=="cpu_idle":cpu_idle=c.run(command).stdout.rstrip('\n‘)┈┈else:data_sys[item]=c.run(command).stdout.rstrip('\n')data_total.append(data_sys)#定义输出系统信息报告的函数(这里输出到控制台)defreport(label,item):print(f"\n{label:15}",end="")fordata_sysindata_total:print(f"{data_sys[item]:40}",end="")任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.2集中采集多台服务器的系统信息Python程序#遍历组成员,采集各服务器系统信息forconningroup:get_sysinfo(conn)group.close()#定义报告用的系统信息项目字典item_names={'hostname':'服务器','kernel':'Linux内核','architecture':'体系结构','ipadd':'IP地址','cpu_usage':'CPU使用率','memory_usage':'内存使用率','process_number':'当前进程数','disk_usage':'磁盘使用率'}#输出系统信息报告print("===============================服务器系统信息============================")foritem,labelinitem_names.items():report(label,item)任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.2集中采集多台服务器的系统信息测试结果任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.3自动部署LAMP平台在Linux系统中部署LAMP平台的一般步骤(1)安装Apache服务器。(2)安装数据库服务器。(3)安装PHP运行环境。(4)安装phpMyAdmin管理工具。任务6.2使用Fabric库批量管理和运维服务器任务实现任务6.2.3自动部署LA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论