Linux系統(tǒng)自動化運維(Python版)(微課版)-項目6_第1頁
Linux系統(tǒng)自動化運維(Python版)(微課版)-項目6_第2頁
Linux系統(tǒng)自動化運維(Python版)(微課版)-項目6_第3頁
Linux系統(tǒng)自動化運維(Python版)(微課版)-項目6_第4頁
Linux系統(tǒng)自動化運維(Python版)(微課版)-項目6_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Linux系統(tǒng)自動化運維(Python版)(微課版)工業(yè)和信息化精品系列教材項目6

遠程管理和批量運維服務器人民郵電出版社能力CAPACITY要求了解SSH遠程管理功能,學會使用Paramiko庫編程實現(xiàn)SSH客戶端。熟悉Fabric庫的用法,學會使用Fabric庫編程實現(xiàn)源代碼批量部署。學會使用Fabric庫編程實現(xiàn)多服務器的系統(tǒng)集中監(jiān)控。學會使用Fabric庫編程實現(xiàn)程序批量部署。任務6.2使用Fabric庫批量管理和運維服務器任務6.1使用Paramiko庫遠程管理服務器任務6.1使用Paramiko庫遠程管理服務器任務說明01OPTION02OPTION03OPTION了解SSH協(xié)議了解Paramiko庫及其基本用法學會使用Paramiko庫編程實現(xiàn)以密鑰認證方式登錄服務器04OPTION學會使用Paramiko庫編程實現(xiàn)文件傳輸任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.1SSH協(xié)議SSH基于成熟的公鑰加密體系,將所有傳輸?shù)臄?shù)據(jù)進行加密,保證數(shù)據(jù)在傳輸時不被惡意破壞、泄露和篡改。SSH使用多種加密和認證方式,解決傳輸中數(shù)據(jù)加密和身份認證的問題,能有效防止網(wǎng)絡嗅探和IP地址欺騙等攻擊。SSH用戶認證方式密碼認證密鑰認證Linux平臺廣泛使用開源的OpenSSH程序實現(xiàn)SSH協(xié)議。任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.2Paramiko庫簡介Paramiko庫實現(xiàn)SSH協(xié)議建立遠程安全連接遠程命令執(zhí)行遠程文件傳輸SSH代理安裝Paramiko庫pipinstallparamiko任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.2Paramiko庫簡介Paramiko庫的核心類Channel:用于實現(xiàn)SSH通道,建立安全的SSH傳輸通道。SSHClient:用于實現(xiàn)SSH客戶端,以便與SSH服務器建立會話。Message:用于實現(xiàn)SSH2消息(字節(jié)流形式)。Packetizer:用于實現(xiàn)基本的SSH數(shù)據(jù)包協(xié)議。Transport:用于實現(xiàn)會話之間的流隧道(通道)。任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.3使用SSHClient類建立SSH連接SSHClient類的常用方法connect()——用于實現(xiàn)遠程服務器的連接與認證set_missing_host_key_policy()——設置服務器公鑰未被記錄到known_hosts文件時的應對策略

exec_command()——在成功連接到服務器之后遠程執(zhí)行命令open_sftp()——用于在當前SSH會話的基礎上創(chuàng)建一個SFTP會話任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.3使用SSHClient類建立SSH連接SSHClient類的用法示例importparamiko#創(chuàng)建SSH對象ssh=paramiko.SSHClient()#允許連接未在know_hosts文件中列出的主機ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#連接服務器ssh.connect(hostname='0',port=22,username='root',password='abc123')#執(zhí)行命令stdin,stdout,stderr=ssh.exec_command('ls-ltr/etc')#獲取命令執(zhí)行結果res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())任務6.1使用Paramiko庫遠程管理服務器相關知識6.1.3使用SSHClient類建立SSH連接SSHClient類的用法示例#再執(zhí)行另一條命令并獲取命令執(zhí)行結果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#創(chuàng)建Transport對象transport=paramiko.Transport(('0',22))#建立SSH連接transport.connect(username='gly',password='abc123')#創(chuàng)建SSHClient對象并將其_transport變量指定為上述Transport對象ssh=paramiko.SSHClient()ssh._transport=transport#使用SSHClient對象的方法進行遠程操作stdin,stdout,stderr=ssh.exec_command('ls-ltr/etc')print(stdout.read().decode())#可以創(chuàng)建SFTPClient對象,繼續(xù)利用Transport對象及其連接執(zhí)行文件傳輸操作#關閉Transport對象及其連接transport.close()任務6.1使用Paramiko庫遠程管理服務器任務實現(xiàn)任務6.1.1搭建多服務器實驗環(huán)境Linux服務器配置修改服務器的主機名和IP地址主機名IP地址操作系統(tǒng)SSH服務器centossrv-a0CentOSStream8安裝并啟用centossrv-b1CentOSStream8安裝并啟用ubuntusrv-a0UbuntuServer20.04安裝并啟用任務6.1使用Paramiko庫遠程管理服務器任務實現(xiàn)任務6.1.2基于密鑰認證連接遠程服務器配置SSH密鑰(1)在SSH服務器端啟用密鑰認證。(2)在客戶端生成密鑰。(3)將公鑰提供給SSH服務器。(4)連接遠程服務器進行測試。任務6.1使用Paramiko庫遠程管理服務器任務實現(xiàn)任務6.1.2基于密鑰認證連接遠程服務器編寫Python程序importparamiko#獲取私鑰private_key=paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')#創(chuàng)建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)#執(zhí)行命令stdin,stdout,stderr=ssh.exec_command('df')#獲取命令執(zhí)行結果res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())#關閉連接ssh.close()任務6.1使用Paramiko庫遠程管理服務器任務實現(xiàn)任務6.1.3在遠程服務器上執(zhí)行sudo命令#使用非root賬戶連接服務器ssh.connect('0',port=22,username='gly',password='abc123')#執(zhí)行sudo命令時加上-S選項stdin,stdout,stderr=ssh.exec_command('sudo-Scat/etc/shadow')#通過標準輸入提供用戶密碼,注意\n表示回車換行stdin.write('abc123\n')#刷新標準輸入的內(nèi)部緩沖區(qū),將其中內(nèi)容立即提供給標準輸入stdin.flush()res,err=stdout.read(),stderr.read()result=resifreselseerrprint(result.decode())任務6.1使用Paramiko庫遠程管理服務器任務實現(xiàn)任務6.1.4實現(xiàn)交互式操作的遠程偽終端importparamikoimportsysimportsocketimportselect#創(chuàng)建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庫遠程管理服務器任務實現(xiàn)任務6.1.4實現(xiàn)交互式操作的遠程偽終端#通過循環(huán)監(jiān)控用戶輸入和服務器的回顯數(shù)據(jù)whileTrue:

readable,writeable,error=select.select([channel,sys.stdin,],[],[],1)#如果服務器有數(shù)據(jù)返回(通常是命令執(zhí)行結果),則在終端進行顯示

ifchannelinreadable:try:data=channel.recv(1024) #獲取服務器的回顯數(shù)據(jù)data=str(data,encoding='utf-8')#將字節(jié)轉換為字符串

iflen(data)==0:print('\r\n***EOF\r\n')breaksys.stdout.write(data) #寫入標準輸出的緩沖區(qū)

sys.stdout.flush() #刷新緩沖區(qū),將緩沖區(qū)內(nèi)容顯示出來

exceptsocket.timeout:pass#如果用戶在終端輸入內(nèi)容(通常是Shell命令),則將內(nèi)容發(fā)送到服務器

ifsys.stdininreadable:input=sys.stdin.readline()channel.sendall(input)#關閉通道和連接channel.close()ssh.close()任務6.2使用Fabric庫批量管理和運維服務器任務6.1使用Paramiko庫遠程管理服務器任務6.2使用Fabric庫批量管理和運維服務器任務說明01OPTION02OPTION03OPTION了解Fabric庫及其基本用法了解遠程執(zhí)行sudo命令的解決方案掌握基于Fabric庫的源代碼批量部署程序編寫方法04OPTION05OPTION掌握Fabric庫的系統(tǒng)集中監(jiān)控程序編寫方法掌握Fabric庫的程序批量自動部署程序編寫方法任務6.2使用Fabric庫批量管理和運維服務器相關知識6.2.1Fabric庫簡介特點提供豐富的SSH交互接口。集成系統(tǒng)基礎操作組件以簡化程序部署和系統(tǒng)管理運維操作。用來在遠程服務器上自動化、流水化地執(zhí)行Shell命令。安裝Fabric2最新版。pipinstallfabric使用Fabric庫實現(xiàn)自動化部署和運維的基本步驟(1)在遠程服務器測試要執(zhí)行任務的Shell命令或腳本,盡可能地采用非交互式。(2)使用Fabric庫編寫執(zhí)行自動化任務的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()在遠程服務器上執(zhí)行命令sudo()以sudo方式在遠程服務器上執(zhí)行命令put()將本地文件上傳到遠程服務器get()從服務器上下載文件local()在本地系統(tǒng)上執(zhí)行Shell命令,該方法實際上是invoke.run()close()關閉連接任務6.2使用Fabric庫批量管理和運維服務器相關知識6.2.2Connection類的基本用法連接服務器并執(zhí)行命令fromfabricimportConnectionhost='0'user='root'password='abc123'#實例化Connection類以建立SSH連接c=Connection(host=host,user=user,connect_kwargs={'password':'abc123'})#在遠程系統(tǒng)上運行命令(用run()方法),并獲得返回結果result=c.run('uname-r')#顯示執(zhí)行命令返回的結果print(result.stdout.strip())#繼續(xù)執(zhí)行命令c.run('df')#切換當前目錄連續(xù)執(zhí)行多條命令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方法執(zhí)行命令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"})#定義函數(shù),參數(shù)為Connection對象defupload(c):#如要創(chuàng)建的目錄不存在,則創(chuàng)建該目錄

ifnotc.run('test-e/tmp/test',warn=True):c.run('mkdir-p/tmp/test')c.put('fabric_basic.py','/tmp/test')#遍歷組成員,每個連接執(zhí)行該函數(shù)forconninpool:upload(conn)任務6.2使用Fabric庫批量管理和運維服務器相關知識6.2.5傳統(tǒng)的fab命令行工具在fabfile文件中使用函數(shù)定義任務fromfabricimporttask@taskdefupload(c):ifnotc.run('test-e/tmp/test',warn=True):

c.run('mkdir/tmp/test')c.put('fabric_basic.py','/tmp/test’)執(zhí)行由upload()函數(shù)定義的任務fab-Hcnetossrv-aupload任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.1批量部署源代碼部署源代碼的一般步驟(1)本地打包源文件。(2)將源文件包上傳到目標服務器。(3)校驗文件的一致性??杀葘Ρ镜卦次募头掌魃系脑次募腗D5值。(4)在目標服務器上對源文件包進行解壓縮。任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.1批量部署源代碼Python程序實現(xiàn)批量部署fromfabricimportConfigimportinvoke#定義目標服務器集合hosts=("root@0","gly@0")#配置sudo密碼config=Config(overrides={'sudo':{'password':'abc123'}})#創(chuàng)建Group對象,統(tǒng)一建立組成員服務器的SSH連接group=Group(*hosts,connect_kwargs={"password":"abc123"},config=config)任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.1批量部署源代碼Python程序實現(xiàn)批量部署#本地文件打包invoke.run("tar-czfsource_test.tar.gz*.py")#計算本地壓縮包文件的MD5值local_md5=invoke.run("md5sumsource_test.tar.gz").stdout.split('')[0]#定義上傳校驗函數(shù)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庫批量管理和運維服務器任務實現(xiàn)任務6.2.1批量部署源代碼Python程序實現(xiàn)批量部署#比較本地與遠程壓縮包文件的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")#遍歷組成員并執(zhí)行上傳校驗函數(shù)forconningroup:upload_check(conn)group.close()任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.2集中采集多臺服務器的系統(tǒng)信息Python程序fromfabricimportSerialGroupasGrouphosts=("root@0","gly@0")group=Group(*hosts,connect_kwargs={"password":"abc123"})#定義匯總服務器系統(tǒng)信息的數(shù)組data_total=[]#定義執(zhí)行Shell命令采集系統(tǒng)信息的函數(shù)defget_sysinfo(c):#定義采集服務器系統(tǒng)信息的命令字典

sys_commands={"hostname":"hostname",┈┈"disk_usage":"df/|sed-n'2p'|awk'{print$5}'"}data_sys={}#定義匯集單臺服務器系統(tǒng)信息結果的字典任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.2集中采集多臺服務器的系統(tǒng)信息Python程序

#遍歷字典,執(zhí)行Shell命令采集多種系統(tǒng)信息(其中CPU和內(nèi)存使用率需單獨計算)

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)#定義輸出系統(tǒng)信息報告的函數(shù)(這里輸出到控制臺)defreport(label,item):print(f"\n{label:15}",end="")fordata_sysindata_total:print(f"{data_sys[item]:40}",end="")任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.2集中采集多臺服務器的系統(tǒng)信息Python程序#遍歷組成員,采集各服務器系統(tǒng)信息forconningroup:get_sysinfo(conn)group.close()#定義報告用的系統(tǒng)信息項目字典item_names={'hostname':'服務器','kernel':'Linux內(nèi)核','architecture':'體系結構','ipadd':'IP地址','cpu_usage':'CPU使用率','memory_usage':'內(nèi)存使用率','process_number':'當前進程數(shù)','disk_usage':'磁盤使用率'}#輸出系統(tǒng)信息報告print("===============================服務器系統(tǒng)信息============================")foritem,labelinitem_names.items():report(label,item)任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.2集中采集多臺服務器的系統(tǒng)信息測試結果任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.3自動部署LAMP平臺在Linux系統(tǒng)中部署LAMP平臺的一般步驟(1)安裝Apache服務器。(2)安裝數(shù)據(jù)庫服務器。(3)安裝PHP運行環(huán)境。(4)安裝phpMyAdmin管理工具。任務6.2使用Fabric庫批量管理和運維服務器任務實現(xiàn)任務6.2.3自動部署LA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論