版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
項目8使用RESTCONF協(xié)議配置網(wǎng)絡項目8使用RESTCONF協(xié)議配置網(wǎng)絡8.1HTTP協(xié)議原理8.2RESTCONF協(xié)議8.3任務實施8.1HTTP協(xié)議原理1HTTP協(xié)議–原理HTTP基于客戶端/服務端(C/S)的架構模型。HTTP請求及響應有如下五個步驟:HTTP客戶端通常是瀏覽器,Web服務器可以是Apache服務器,IIS服務器(InternetInformationServices)等
客戶端與服務器建立TCP連接??蛻舳税l(fā)送HTTP請求。請求報文由請求行、請求頭部、空行和請求數(shù)據(jù)四部分組成。服務器接受請求并返回HTTP響應。響應報文由狀態(tài)行、響應頭部、空行和響應正文四部分組成。釋放TCP連接??蛻舳藶g覽器解析響應報文并顯示。客戶端瀏覽器依次解析狀態(tài)行、響應頭部、響應正文并顯示。如正文數(shù)據(jù)為HTML,客戶端根據(jù)HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。8.1HTTP協(xié)議原理2HTTP協(xié)議–特點HTTP具有如下特點:
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求后就斷開連接。媒體獨立:這意味著,只要客戶端和服務器知道如何處理的數(shù)據(jù)內(nèi)容,任何類型的數(shù)據(jù)都可以通過HTTP發(fā)送。客戶端以及服務器通過頭部字段指定適合的MIMEType內(nèi)容類型。無狀態(tài):無狀態(tài)是指協(xié)議對于事務處理沒有記憶能力,這樣做利于更快地處理大量事務,確保協(xié)議的可伸縮性。。8.1HTTP協(xié)議原理3HTTP協(xié)議–客戶端發(fā)送的報文客戶端發(fā)送的HTTP請求消息包括由請求行、請求頭部、空行和請求數(shù)據(jù)四個部分組成,下圖給出了請求報文的一般格式。
8.1HTTP協(xié)議原理4HTTP協(xié)議–客戶端請求報文請求行由請求方法字段、URI字段和HTTP協(xié)議版本字段3個字段組成。
請求方法:HTTP使用的請求方法,比如常見的GET/POST等。HTTP客戶程序(例如瀏覽器),向服務器發(fā)送請求的時候必須指明請求類型。URI:URI是一個統(tǒng)一資源標識符,它標識了請求所針對的資源。協(xié)議版本:協(xié)議版本旨在允許發(fā)送方指示消息的格式和理解后續(xù)HTTP通信的能力。8.1HTTP協(xié)議原理5HTTP協(xié)議–客戶端請求方法根據(jù)HTTP標準,HTTP請求可以使用多種請求方法。HTTP1.0定義了三種請求方法:GET、POST和HEAD方法。HTTP1.1新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT方法。
方法描述GET請求指定的頁面信息,服務端將返回具體內(nèi)容數(shù)據(jù)。POST提交數(shù)據(jù),例如提交表單。HEAD類似于GET請求,但是返回的響應中沒有具體的內(nèi)容,用于獲取報頭。PUT更新和修改數(shù)據(jù)。DELETE請求刪除指定的頁面。CONNECT用于HTTP代理。OPTIONS允許客戶端查看服務器的性能。TRACE回顯服務器收到的請求,主要用于測試或診斷。PATCH用來對已知資源進行局部更新。8.1HTTP協(xié)議原理6HTTP協(xié)議–客戶端請求頭部請求頭部允許客戶端向服務器傳遞關于請求的附加信息。這些字段充當請求修飾符,其語義相當于編程語言方法調(diào)用中的參數(shù)。
8.1HTTP協(xié)議原理7HTTP協(xié)議–客戶端請求頭部字段
8.1HTTP協(xié)議原理8HTTP協(xié)議–客戶端請求數(shù)據(jù)空行:它的作用是通過一個空行,告訴服務器請求頭部到此為止。請求數(shù)據(jù):若方法字段是GET,則此項為空,沒有數(shù)據(jù)。若方法字段是POST,則通常來說此處放置的是要提交的數(shù)據(jù)。
8.1HTTP協(xié)議原理8HTTP協(xié)議–客戶端請求報文示例客戶端向服務器發(fā)送含有用戶名密碼的請求消息,進行登錄認證。
8.1HTTP協(xié)議原理10HTTP協(xié)議–服務端響應消息客戶端向服務器發(fā)送含有用戶名密碼的請求消息,進行登錄認證。
8.1HTTP協(xié)議原理11HTTP協(xié)議–服務端響應消息–狀態(tài)行響應消息的第一行是狀態(tài)行,由協(xié)議版本、狀態(tài)碼和原因短語組成,每個元素由空格字符分隔。
協(xié)議版本:協(xié)議版本旨在允許發(fā)送方指示消息的格式及其理解后續(xù)HTTP通信的能力。狀態(tài)碼:一個3位整數(shù)結果碼,用于向客戶端返回操作結果。原因短語:旨在對狀態(tài)碼進行簡短的文本描述,幫助理解。8.1HTTP協(xié)議原理12HTTP協(xié)議–服務端響應消息–狀態(tài)碼HTTP狀態(tài)碼(HTTPStatusCode)是服務器響應狀態(tài)的3位數(shù)字碼,用于向客戶端返回操作結果。
8.1HTTP協(xié)議原理13HTTP協(xié)議–服務端響應消息–響應頭部響應頭部允許服務器傳遞關于響應的附加信息,這些頭部字段提供了關于服務器的相關信息以及URI所標識資源的信息。
8.1HTTP協(xié)議原理14HTTP協(xié)議–服務端響應消息–響應頭部字段
8.1HTTP協(xié)議原理15HTTP協(xié)議–服務端響應報文示例
服務器向客戶端返回響應消息,認證成功。8.1HTTP協(xié)議原理16HTTPS協(xié)議HTTP協(xié)議采用明文傳輸信息,存在信息竊聽、信息篡改和信息劫持的風險。HTTPS具有身份驗證、信息加密和完整性校驗的功能,可以避免此類問題發(fā)生。HTTPS(HyperTextTransferProtocoloverSecureSocketLayer,安全超文本傳輸協(xié)議),是以安全為目標的HTTP通道。HTTPS在HTTP的基礎下加入SSL/TLS層,是使用SSL/TLS加密的HTTP協(xié)議。8.1HTTP協(xié)議原理17HTTPS協(xié)議HTTP協(xié)議采用明文傳輸信息,存在信息竊聽、信息篡改和信息劫持的風險。HTTPS具有身份驗證、信息加密和完整性校驗的功能,可以避免此類問題發(fā)生。HTTPS(HyperTextTransferProtocoloverSecureSocketLayer,安全超文本傳輸協(xié)議),是以安全為目標的HTTP通道。HTTPS在HTTP的基礎下加入SSL/TLS層,是使用SSL/TLS加密的HTTP協(xié)議。項目8使用RESTCONF協(xié)議配置網(wǎng)絡8.1HTTP協(xié)議原理8.2RESTCONF協(xié)議8.3任務實施8.2RESTCONF協(xié)議隨著網(wǎng)絡規(guī)模的增大、復雜性的增加,自動化運維的需求日益增加。NETCONF提供基于RPC機制的應用編程接口。但是NETCONF已無法滿足網(wǎng)絡發(fā)展中對設備編程接口提出的新要求,希望能夠提供支持WEB應用訪問和操作網(wǎng)絡設備的標準化接口。RESTCONF是在融合NETCONF和HTTP協(xié)議的基礎上發(fā)展而來的。RESTCONF以HTTP協(xié)議的方法提供了NETCONF協(xié)議的核心功能,編程接口符合IT業(yè)界流行的RESTful風格,為用戶提供高效開發(fā)WEB化運維工具的能力。1RESTCONF介紹–背景8.2RESTCONF協(xié)議RESTCONF允許Web應用以一種模塊化、可擴展的方式訪問網(wǎng)絡設備的配置數(shù)據(jù)、狀態(tài)數(shù)據(jù)和事件通知。而NETCONG使用的NETCONFClient。2RESTCONF介紹–特點RESTCONF使用HTTP的方法對設備YANG定義的數(shù)據(jù)進行操作(增刪改查)。設備NETCONF和RESTCONF可以共享的YANG文件。數(shù)據(jù)編碼格式支持XML或者JSON。8.2RESTCONF協(xié)議RESTCONF基本網(wǎng)絡架構如下圖所示。RESTCONF基本網(wǎng)絡架構中主要元素:RESTCONFClient:RESTCONFServer:3RESTCONF介紹–網(wǎng)絡結構客戶端利用RESTCONF協(xié)議對網(wǎng)絡設備進行系統(tǒng)管理。客戶端向服務器發(fā)送請求,可以實現(xiàn)創(chuàng)建、刪除、修改或查詢一個或多個數(shù)據(jù)。設備作為服務器端,服務器用于維護被管理設備的信息數(shù)據(jù)并響應客戶端的請求,把數(shù)據(jù)返回給發(fā)送請求的客戶端。服務器收到客戶端的請求后會進行解析并處理請求,然后給客戶端8.2RESTCONF協(xié)議RESTCONF使用YANG作為其建模語言。YANG是用來對RESTCONF協(xié)議中的配置數(shù)據(jù)和狀態(tài)數(shù)據(jù)等進行建模的數(shù)據(jù)建模語言。RESTCONF客戶端和服務器之間使用HTTPs協(xié)議進行通信。客戶端必須和服務器成功建立一個安全的、面向連接的會話才能進行通信??蛻舳讼蚍掌靼l(fā)送一個請求,服務器處理完用戶請求后,給客戶端發(fā)送一個回應消息。RESTCONF客戶端發(fā)送的請求和服務器的回應消息可以使用XML或者JSON編碼。4RESTCONF介紹–建模語言8.2RESTCONF協(xié)議5RESTCONF介紹–與NETCONF比較(1)RESTCONF與NETCONF比較比較項目NETCONF+YANGRESTCONF+YANG傳輸通道(協(xié)議)NETCONF傳輸層首選推薦SSH(SecureShell)協(xié)議,XML信息通過SSH協(xié)議承載。RESTCONF是基于HTTP協(xié)議訪問設備資源。RESTCONF提供的編程接口符合IT業(yè)界流行的RESTful風格。報文格式采用XML編碼。采用XML或JSON編碼。操作特點NETCONF的操作復雜,例如:NETCONF支持增、刪、改、查,支持多個配置數(shù)據(jù)庫,也支持回滾等。NETCONF需要兩階段提交(即先提交參數(shù),再commit參數(shù))。RESTCONF的操作簡單,例如:RESTCONF支持增、刪、改、查操作,僅支持<running/>配置數(shù)據(jù)庫。RESTCONF操作方法無需兩階段提交,操作直接生效。RESTCONF較于NETCONF,使用了不同的操作方法和數(shù)據(jù)編碼。8.2RESTCONF協(xié)議5RESTCONF介紹–與NETCONF比較(2)RESTCONF較于NETCONF定義了配置數(shù)據(jù)庫和增、刪、改、查操作,這些操作可以用來訪問配置數(shù)據(jù)庫。NETCONF使用YANG語言定義了數(shù)據(jù)庫內(nèi)容、配置數(shù)據(jù)、狀態(tài)數(shù)據(jù)、RPC操作等的語法語意。RESTCONF協(xié)議通過HTTP方法可以識別NETCONF中定義的增刪改查操作,用于訪問YANG定義的數(shù)據(jù)。8.2RESTCONF協(xié)議5RESTCONF介紹–操作方法比較(3)RESTCONF操作方法與NETCONF操作方法對應關系如下所示:RESTCONF操作方法與NETCONF協(xié)議方法RESTCONF+YANGNETCONF+YANGOPTIONSN/AHEAD<get-config>,<get>GET<get-config>,<get>POST<edit-config>(nc:operation="create")POST調(diào)用RPC操作PATCH當操作對象已存在時,<edit-config>(nc:operation="merge")DELETE<edit-config>(nc:operation="delete")
8.2RESTCONF協(xié)議6一次典型的RESTCONF交互一次完整的RESTCONF交互包含請求和響應。本例客戶端通過OPTIONS方法獲取設備支持的操作方法。設備回復支持操作有:POST,DELETE,GET,HEAD,PATCH,OPTIONS
8.2RESTCONF協(xié)議7RESTCONF請求報文
8.2RESTCONF協(xié)議8RESTCONF請求案例
RESTCONF請求對象地址為00。修改數(shù)據(jù)配置數(shù)據(jù)domainName為abc,修改accessLimit值為10。8.2RESTCONF協(xié)議9RESTCONF響應報文
8.2RESTCONF協(xié)議10RESTCONF響應案例
RESTCONF響應報文:返回狀態(tài)碼201,表示資源創(chuàng)建成功。頭部信息Content-Type和Content-Length,描述Body信息。Body數(shù)據(jù)類型為XML,內(nèi)容長度為0。第8章RESTCONF協(xié)議8.1HTTP協(xié)議原理8.2RESTCONF協(xié)議8.3任務實施8.3任務實施
公司B的網(wǎng)絡由4臺思科CSR1000v組成,希望通過Web應用方式統(tǒng)一管理網(wǎng)絡設備。按照公司的整體網(wǎng)絡規(guī)劃,運維工程師將使用RESTCONF協(xié)議實現(xiàn)網(wǎng)絡配置與管理。本任務主要通過Web的方式配置與管理公司B網(wǎng)絡的4臺思科CSR1000v,思科CSR1000v作為RESTCONF服務器。網(wǎng)絡拓撲如圖8-1所示。工程師需要完成的任務如下。(1)配置設備SSH登陸密碼。(2)配置RESTCONF。(3)編寫Python腳本。(4)運行Python腳本。(5)驗證配置。項目9使用Ansible實現(xiàn)網(wǎng)絡自動化運維項目9使用Ansible實現(xiàn)網(wǎng)絡自動化運維9.1Ansible基礎9.2Ansible模塊9.3Ansible劇本9.4任務實施12.1Ansible基礎Ansible基于Python語言實現(xiàn),由Paramiko和PyYAML兩個關鍵模塊構建。Ansible具有以下特點:1特點安裝部署簡單;管理主機便捷,支持多臺主機并行管理。避免在被管理主機上安裝客戶代理,采用無代理方式,只是利用現(xiàn)有的SSH后臺進程。用于描述基礎架構的語言友好。關注安全,很容易對執(zhí)行的內(nèi)容進行審計、評估、重寫。能夠立即管理遠程被管理主機,不需要預先安裝任何軟件。不僅僅支持Python,可運行使用任何動態(tài)語言開發(fā)模塊。非root賬戶也可以使用。成為最簡單、易用的IT自動化系統(tǒng)。12.1Ansible基礎Ansible通常由管理節(jié)點和被管節(jié)點組成。管理節(jié)點是用來安裝Ansible工具軟件、執(zhí)行維護指令的服務器或工作站,是Ansible維護的核心。被管節(jié)點是運行業(yè)務服務的服務器,由控制機通過SSH來進行管理。Ansible采用Pythonparamiko模塊,通過SSH連接主機。Ansible在管理節(jié)點將Ansible模塊通過SSH協(xié)議推送到被管節(jié)點執(zhí)行,執(zhí)行完之后自動刪除
2Ansible架構–管理方式Ansible管理節(jié)點Ansible被管節(jié)點Ansible被管節(jié)點Ansible被管節(jié)點SSHSSHSSH12.1Ansible基礎Ansible對管理節(jié)點沒有太多要求,當前管理節(jié)點的操作系統(tǒng)選用Linux。被管節(jié)點的要求更少,支持Linux、類Unix、Windows等類型的主機節(jié)點,甚至支持Cisco、Huawei、Juniper等網(wǎng)絡設備、負載均衡器。Ansible不需要安裝其他依賴軟件包,默認是基于SSH協(xié)議進行通信的。安裝Ansible之后,管理節(jié)點不需要啟動或運行任何Ansible的后臺進程,也不需要數(shù)據(jù)庫。只要在一臺管理節(jié)點上安裝Ansible,就可以通過這臺主機管理一組遠程節(jié)點。在被管節(jié)點上,同樣也不需要安裝、運行任何Ansible特有的軟件。這樣如果Ansible版本需要升級,只需升級控制主機,不涉及被管節(jié)點。3Ansible系統(tǒng)要求12.1Ansible基礎Ansible管理節(jié)點只要安裝了Python2.6或以上版本,就可以運行Ansible。注意,Windows環(huán)境系統(tǒng)當前還不能作為管理節(jié)點。Ansible被管理節(jié)點可以是Linux系統(tǒng),可以是Windows系統(tǒng)。4Ansible系統(tǒng)要求12.1Ansible基礎在Ansible管理節(jié)點上使用yum安裝Ansible,先更新yum源5Ansible安裝步驟#Yum源更換為國內(nèi)阿里源[root@ansi-manager~]#yuminstallwget–y[root@ansi-manager~]#mv/etc/yum.repos.d/CentOS-Base.repo/etc/yum.repos.d/CentOS-Base.repo.backup[root@ansi-manager~]#wget-O/etc/yum.repos.d/CentOS-Base.repohttp:///repo/Centos-7.repo?#添加阿里的epel源[root@ansi-manager~]#wget-O/etc/yum.repos.d/epel.repo/repo/epel-7.repo?#yum重新建立緩存[root@ansi-manager~]#yumcleanall[root@ansi-manager~]#yummakecache12.1Ansible基礎在Ansible管理節(jié)點上使用yum安裝Ansible6Ansible安裝步驟#使用YUM安裝ansible[root@ansi_manager~]#yum-yinstallansible#驗證ansible[root@ansi-manager~]#ansible--versionansible2.9.23
configfile=/etc/ansible/ansible.cfgconfiguredmodulesearchpath=[u'/root/.ansible/plugins/modules',u'/usr/share/ansible/plugins/modules']ansiblepythonmodulelocation=/usr/lib/python2.7/site-packages/ansible
executablelocation=/usr/bin/ansible
pythonversion=2.7.5(default,Oct302018,23:45:53)[GCC4.8.520150623(RedHat4.8.5-36)]Ansible版本Ansible配置文件Python版本12.1Ansible基礎配置免密登錄:為了避免Ansible下發(fā)指令被管理主機時輸入被管理主機主機密碼,使用SSH免密登錄。使用ssh-keygen與ssh-copy-id來實現(xiàn)快速證書的生成及公鑰下發(fā)。其中ssh-keygen生產(chǎn)一對密鑰,使用sh-copy-id來下發(fā)生成的公鑰。7Ansible安裝步驟#在管理節(jié)點上創(chuàng)建密鑰,執(zhí)行ssh-keygen-trsa,有詢同直接按回車鍵即可。[root@ansi-manager~]#ssh-keygen-trsa[root@ansi-manager~]#ll/root/.ssh/total8-rw-------1rootroot1679Aug318:07id_rsa-rw-r--r--1rootroot399Aug318:07id_rsa.pub這是私鑰文件這是公鑰文件12.1Ansible基礎下發(fā)密鑰就是把管理節(jié)點的公鑰id_rsa.pub下發(fā)到被管理節(jié)點上8Ansible安裝步驟#在管理節(jié)點上向被管理節(jié)點ansi-Node01(31)下發(fā)密鑰
[root@ansi-manager~]#ssh-copy-idroot@31#在管理節(jié)點上向被管理節(jié)點ansi-Node01(31)下發(fā)密鑰[root@ansi-manager~]#ssh-copy-idroot@3212.1Ansible基礎下發(fā)密鑰就是把管理節(jié)點的公鑰id_rsa.pub下發(fā)到被管理節(jié)點上9Ansible安裝步驟#在管理節(jié)點上向被管理節(jié)點ansi-Node01(31)下發(fā)密鑰
[root@ansi-manager~]#ssh-copy-idroot@31#在管理節(jié)點上向被管理節(jié)點ansi-Node01(31)下發(fā)密鑰[root@ansi-manager~]#ssh-copy-idroot@3212.1Ansible基礎在Ansible中,被管理節(jié)點都稱為Inventory。因此,Inventory就是被管理主機清單。默認Ansible的Inventory是一個靜態(tài)的INI格式的文件/etc/ansible/hosts。還可以通過ANSIBLEHOSTS環(huán)境變量指定或者運行ansible和ansible-playbook的時候用-i參數(shù)臨時設置。在Ansible中,常用的有2種方式制定hosts文件:Inventory文件(/etc/ansible/hosts)可以定義主機或主機組定義。添加完主機和主機組后就可以使用Ansible命令針對這些主機進行操作和管理了。10資產(chǎn)Inventory默認讀取/etc/ansible/hosts文件;通過命令行參數(shù)
-i
指定hosts文件;12.1Ansible基礎Ansible的資產(chǎn)文件中,可以以IP地址的形式或者主機名的形式存在Ansible的資產(chǎn)若連續(xù),可以使用[stat:end]的形式去表達可以將服務器按照業(yè)務場景定義成組,比如db和webservers可以把一個組作為另一個組的子成員,比如db
和webservers是docker組的子成員。11資產(chǎn)Inventory文件定義12.1Ansible基礎12資產(chǎn)Inventory舉例[root@ansi_manager~]#cat/etc/ansible/hosts31#單獨定義一個主機,由于配置了SSH免密登錄,不需要指定SSH登錄密碼32#單獨定義一個主機,由于配置了SSH免密登錄,不需要指定SSH登錄密碼?33ansible_ssh_pass='123456'#定義一個主機,使用Inventory內(nèi)置變量定義了SSH登錄密碼34ansible_ssh_pass=‘123456’#如果配置了SSH免密登錄,不需要指定SSH登錄密碼[webservers]#中括號定義一個主機組,webservers是主機組名,該主機組下由兩臺主機3132?[db]
#中括號定義一個主機組,db是主機組名192.168.1.[241:243]#定義主機組db中3臺主機從41到43?[db:vars]
#通過變量(vars)的方式定義db組主機的SSH登錄密碼,ansible_ssh_pass='123456'[docker:children]#定義一個docker組,它有2個子組db和webserver,把一個組作為另一個組的子成員dbwebservers12.1Ansible基礎13資產(chǎn)Inventory舉例12.1Ansible基礎14查看資產(chǎn)[root@ansi-manager~]#ansibleall--list-hostshosts(7):333441424331
32查看資產(chǎn)文件中的所有主機查看資產(chǎn)文件中主機組中的所有主機[root@ansi-manager~]#ansiblewebservers--list-hostshosts(2):313212.1Ansible基礎資產(chǎn)變量分為主機變量和組變量,分別針對資產(chǎn)中的單個主機和主機組。主機變量:以下資產(chǎn)中,定義了2個主機變量user和port此變量只針對31這臺服務器有效。驗證:(通過-i指定自定義的資產(chǎn)文件)15資產(chǎn)變量–主機變量[root@ansi_manager~]#vimhostvars[webservers]31user=tomport=888832[root@ansi-manager~]#ansible31-ihostvar-mdebug-a"msg='{{user}}{{port}}'"31|SUCCESS=>{"msg":"tom8888"}12.1Ansible基礎變量的值是針對31主機,對32主機無效通過對組的操作,得到相同的結果16資產(chǎn)變量–主機變量[root@ansi-manager~]#ansible32-ihostvar-mdebug-a"msg='{{user}}{{port}}'"32|FAILED!=>{"msg":"Thetaskincludesanoptionwithanundefinedvariable.Theerrorwas:'user'isundefined"}[root@ansi-manager~]#ansiblewebservers-ihostvar-mdebug-a"msg='{{user}}{{port}}'"32|FAILED!=>{"msg":"Thetaskincludesanoptionwithanundefinedvariable.Theerrorwas:'user'isundefined"}31|SUCCESS=>{"msg":"tom8888"}12.1Ansible基礎變量在以下資產(chǎn)中,定義一個組變量home。此變量針對webservers這個主機組中的所有主機有效17資產(chǎn)變量–組變量[root@ansi-manager~]#vimgroupvars[webservers]31user=tom32[webservers:vars]home="/home/tom"12.1Ansible基礎home是webservers的組變量,針對組中的所有主機有效18資產(chǎn)變量–組變量[root@ansi-manager~]#ansiblewebservers-igroupvars-mdebug-a"var=home"31|SUCCESS=>{"home":"/home/tom"}32|SUCCESS=>{"home":"/home/tom"}項目9使用Ansible實現(xiàn)網(wǎng)絡自動化運維9.1Ansible基礎9.2Ansible模塊9.3Ansible劇本9.4任務實施9.2Ansible模塊Ansible核心:ansible核心模塊(CoreModules):這些都是ansible自帶的模塊擴展模塊(CustomModules):如果核心模塊不足以完成某種功能,可以添加擴展模塊插件(Plugins):完成模塊功能的補充劇本(Playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執(zhí)行連接插件(ConnectiorPlugins):ansible基于連接插件連接到各個主機上,雖然ansible是使用ssh連接到各個主機的,但是它還支持其他的連接方法,所以需要有連接插件1Ansible模塊簡介9.2Ansible模塊Ansible自帶很多模塊,可以直接使用這些模塊??梢酝ㄟ^“ansible-doc-l”顯示所有自帶模塊。2Ansible模塊[root@ansi-manager~]#ansible-doc-lfortios_router_community_listConfigurecommunitylistsinFortinet's...azure_rm_devtestlab_infoGetAzureDevTestLabfactsecs_taskdefinition
registerataskdefinitioninecsavi_alertscriptconfig
ModuleforsetupofAlertScriptConfigA...tower_receiveReceiveassetsfromAnsibleTowernetapp_e_iscsi_targetNetAppE-SeriesmanageiSCSItargetcon...azure_rm_acs
ManageanAzureContainerService(ACS)..................9.2Ansible模塊ad-hoc命令是指ansible執(zhí)行一條命令,并且不需要保存命令。ad-hoc所有的命令都要依賴于模塊,默認安裝好的ansible里有很多自帶的模塊,例如:command,raw,shell,file,cron等若執(zhí)行這樣的命令:ansiblehost2-mcommand-adate,代表的就是ad-hoc命令。使用Ah-hoc命令,Ansible的一些插件功能就無法使用,如loop、facts功能等。3Ansible執(zhí)行命令–ad-hoc命令9.2Ansible模塊常用的ansible選項參數(shù):4Ansible執(zhí)行命令–ad-hoc命令參數(shù)
-m模塊名:指定要執(zhí)行的模塊的名稱,如果不指定-m選項,默認是command模塊。
-a命令:指定執(zhí)行模塊對應的參數(shù)選項。
-k:提示輸入SSH登錄的密碼而不是基于密鑰的驗證,小寫k
-K:用于輸入執(zhí)行su或sudo操作時需要的認證密碼,大寫K-b:表示提升權限操作。新版ansible才有的一個選項操作。
--become-method:指定提升權限的方法,常用的有sudo和su,默認是sudo。
--become-user:指定執(zhí)行sudo或su命令時要切換到哪個用戶下,默認是root用戶。
-BSECONDS:后臺運行超時時間
-C:測試一下會改變什么內(nèi)容,不會真正去執(zhí)行,主要用來測試一些可能發(fā)生的變化
-fFORKS,:設置ansible并行的任務數(shù)。默認值是5
-iINVENTORY:指定主機清單文件的路徑,默認為/etc/ansible/hosts。。
-h:查看幫助,關于ad-hoc的一些選項的詳細參數(shù)9.2Ansible模塊Ansible命令執(zhí)行格式:5Ansible執(zhí)行命令–ad-hoc命令執(zhí)行格式ansible主機或組-m模塊名-a‘模塊參數(shù)’ansible參數(shù)主機和組:是在/etc/ansible/hosts`里或通過-i參數(shù)進行指定的部分?模塊名:可以通過ansible-doc-l查看目前安裝的模塊,默認不指定時,使用的是command模塊,具體可以查看/etc/ansible/ansible.cfg的“#module_name=command"部分,默認模塊可以在該配置文件中進行修改;模塊參數(shù):可以通過“ansible-doc模塊名”查看具體的用法及后面的參數(shù);ansible參數(shù):可以通過ansible命令的幫忙信息里查看到,這里有很多參數(shù)可以供選擇,如是否需要輸入密碼、是否sudo等。9.2Ansible模塊執(zhí)行一些簡單的任務,使用ad-hoc命令可以方便的解決問題,但是有時一個場景過于復雜,需要大量的操作時候,執(zhí)行的ad-hoc命令是不適合的,這時最好使用playbook,就像執(zhí)行shell命令與寫shell腳本一樣,也可以理解為批處理任務,但playbook有自己的語法格式。Playbook將在下節(jié)課中詳細講解。6Ansible執(zhí)行命令–playbook劇本項目9使用Ansible實現(xiàn)網(wǎng)絡自動化運維9.1Ansible基礎9.2Ansible模塊9.3Ansible劇本9.4任務實施9.3Ansible劇本在前面?zhèn)€的課程中,使用Ansible模塊執(zhí)行一些簡單的任務,使用ad-hoc命令可以方便的解決問題。但是有時一個任務需要大量的操作時候,執(zhí)行的ad-hoc命令是不適合的,這時最好使用playbook。Playbook可以理解為批處理任務,但playbook有自己的語法格式。11playbook概述9.3Ansible劇本playbook文件由YAML語言編寫。YAML是一個類似XML、JSON的標記性語言,YAML強調(diào)以數(shù)據(jù)為中心,并不是以標識語言為重點。因而YAML本身的定義比較簡單,號稱“一種人性化的數(shù)據(jù)格式語言”。編寫playbook要遵循一定的書寫格式,以下為playbook常用到的YAML格式。2playbook文件格式大小寫敏感使用空格作為嵌套縮進工具,縮進時不允許使用Tab鍵縮進的空格數(shù)目不重要,只要相同層級的元素左側對齊即可使用“-”(橫線)+單個空格:表示單個列表項使用“:”(冒號)+空格:表示單個鍵值對使用"{}"表示一個鍵值表9.3Ansible劇本playbook文件是通過ansible-playbook命令進行解析的,ansbile-playbook命令會根據(jù)自上而下的順序依次執(zhí)行playbook文件中的內(nèi)容。Playbook還有很多特性,它可以允許傳輸某個命令的狀態(tài)到后面的指令,也可以從一臺機器的文件中抓取內(nèi)容并附為變量,然后在另一臺機器中使用,這使得playbook可以實現(xiàn)一些復雜的部署機制,這是ansiblead-hoc命令無法實現(xiàn)的。3playbook文件執(zhí)行9.3Ansible劇本playbook是由一個或多個“play”組成的列表。play的主要功能在于,將事先合并為一組的主機裝扮成事先通過ansible定義好的角色。將多個play組織在一個playbook中就可以讓它們聯(lián)同起來按事先編排的機制完成一系列復雜的任務。4playbook文件構成5個核心組件:target部分:定義將要執(zhí)行playbook的遠程主機組variable部分:定義playbook運行時需要使用的變量task部分:定義將要在遠程主機上執(zhí)行的任務列表handler部分:定義task執(zhí)行完成以后需要調(diào)用的任務Roles:角色:對應5個目錄層:vars變量層tasks任務層handlers觸發(fā)條件files文件template模板9.3Ansible劇本4playbook組件-hostsplaybook中的每一個play的目的都是為了讓特定主機以某個指定的用戶身份執(zhí)行任務。hosts用于指定要執(zhí)行指定任務的主機,須事先定義在主機清單中。如:[root@ansi_manager~]#cat
/etc/ansible/hosts3132?[webservers]31329.3Ansible劇本5playbook組件-hosts想知道在執(zhí)行Playbook時,哪些主機將會受影響,則使用--list-hosts選項9.3Ansible劇本6playbook組件-task列表和action組件play的主體部分是task列表,task列表中有一個或多個task,各個task按次序逐個在hosts中指定的所有主機上執(zhí)行,即在所有主機上完成第一個task后,再開始第二個task。task的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的,這意味著多次執(zhí)行是安全的,因為其結果均一致。每個task都應該有其name,用于playbook的執(zhí)行結果輸出,建議其內(nèi)容能清晰地描述任務執(zhí)行步驟。如果未提供name,則action的結果將用于輸出。定義一個task,常見的格式:”module:options”例如:yum:name=httpd9.3Ansible劇本7playbook組件-task列表和action組件使用下列命令,可以列出first.yml劇本中的taskansible-playbookfirst.yml--list-task9.3Ansible劇本8playbook變量Ansible定義變量的方式有很多種,下面就詳細介紹Ansible各種變量定義方式。9.3Ansible劇本9playbook變量-主機及主機組變量
如下例,Ansible默認的Inventory文件是ini格式,如前面用到hosts文件,然后分別針對每臺主機設置一個變量名稱叫作key,接著使用debug模塊來查有變量的值,最后通過對werbservers組定義一個變量同樣使用debug模塊查看。1、編輯資產(chǎn)文件[root@ansi_manager~]#vimhosts_v231key=23132key=232?[webservers]3[1:2]?[webservers:vars]user=tom2、編輯劇本[[root@ansi_manager~]#vimhost_v2.yml-hosts:allgather_facts:Falsetasks:-name:displarvarsfromhosts_v2debug:msg="The{{inventory_hostname}}valueis{{key}},useris{{user}}"
3、
檢查劇本語法[root@ansi_manager~]#ansible-playbookhost_v2.yml--syntax-check?playbook:host_v2.yml9.3Ansible劇本10playbook變量-主機及主機組變量
4、執(zhí)行劇本[root@ansi_manager~]#ansible-playbook-ihosts_v2host_v2.yml?PLAY[all]*******************************************************************************************************?TASK[displarvarsfromhosts_v2]********************************************************************************************ok:[31]=>{"msg":"The31valueis231,useristom"}ok:[32]=>{"msg":"The32valueis232,useristom"}?PLAYRECAP*******************************************************************************************************31:ok=1changed=0unreachable=0failed=0skipped=0rescued=0ignored=032:ok=1changed=0unreachable=0failed=0skipped=0rescued=0ignored=09.3Ansible劇本11playbook變量–使用vars
在playbook文件內(nèi)通過vars字段定義變量1、編輯劇本[root@ansi_manager~]#vimhost_v4.yml-hosts:allgather_facts:Falsevars:key:ansible_webservertasks:-name:displarvarsfromhosts_v3debug:msg="The{{inventory_hostname}}valueis{{key}}"?2、驗證劇本[root@ansi_manager~]#ansible-playbookhost_v4.yml--syntax-check?playbook:host_v4.yml9.3Ansible劇本12playbook變量–使用vars
在playbook文件內(nèi)通過vars字段定義變量3、執(zhí)行劇本[root@ansi_manager~]#ansible-playbookhost_v4.yml?PLAY[all]*******************************************************************************************************?TASK[displarvarsfromhosts_v3]********************************************************************************************ok:[31]=>{"msg":"The31valueisansible_webserver"}ok:[32]=>{"msg":"The32valueisansible_webserver"}PLAYRECAP*******************************************************************************************************31:ok=1changed=0unreachable=0failed=0skipped=0rescued=0ignored=032:ok=1changed=0unreachable=0failed=0skipped=0rescued=0ignored=09.3Ansible劇本13playbook變量–注冊變量register
Ansibleplaybook中task之間還可以互相傳遞數(shù)據(jù),如有兩個tasks,其中第2個task是否執(zhí)行需要判斷第1個task運行后的結果。這時就需要在task之間傳遞數(shù)據(jù),把第1個task執(zhí)行的結果傳遞給第2個task。Ansibleregister變量用來保存前一個命令的返回狀態(tài),便于后面進行調(diào)用,可用于task之間傳遞數(shù)據(jù)。如定義了2個task,第一個task執(zhí)行hostname命令,第二個task通過debug模塊打印出第一個task的主機名9.3Ansible劇本14playbook變量–注冊變量register
檢查劇本語法,執(zhí)行劇本9.3Ansible劇本15playbook變量–fact變量AnsibleFacts是Ansible在被托管主機上自動收集的變量。它是通過在執(zhí)行Ad-Hoc以及Playbook時使用setup模塊進行收集的,并且這個操作是默認的。因為這個收集托管主機上的Facts比較耗費時間,所以可以在不需要的時候關閉setup模塊。收集的Facts中包含了托管主機特有的信息,這些信息可以像變量一樣在Playbook中使用。收集的Facts中包含了以下常用的信息:主機名、內(nèi)核版本、網(wǎng)卡接口、IP地址、操作系統(tǒng)版本、環(huán)境變量、CPU核數(shù)、可用內(nèi)存、可用磁盤等等……。9.3Ansible劇本16條件判斷考慮這樣的場景:若Nginx的配置文件語法錯誤則會導致啟動Nginx失敗,以至于PlayBook執(zhí)行失敗。如果能夠在啟動之前去對Nginx的配置文件語法做正確性的校驗,只有當校驗通過的時候,才去啟動或者重啟Nginx;否則則跳過啟動Nginx的過程。這樣就會避免Nginx配置文件語法問題而導致的無法啟動Nginx的風險。when的值是一個條件表達式,如果條件判斷成立,這個task就執(zhí)行,如果判斷不成立,則task不執(zhí)行。9.3Ansible劇本17條件判斷下面的例子包含3個task:task1安裝nginx,task2檢查nginx語法,task3根據(jù)task2的情況決定是否啟動nginx服務。9.3Ansible劇本18條件判斷9.3Ansible劇本19條件判斷9.3Ansible劇本20條件判斷9.3Ansible劇本21playbook循環(huán)Ansibleloops:可以使用loops方式去編寫playbook減少重復使用某個模塊。目前官網(wǎng)支持很多l(xiāng)oops方式,這里使用介紹比較常用的loops。9.3Ansible劇本22playbook循環(huán)–標準循環(huán)playbook中標準循環(huán)使用
with_items:關鍵字,而且循環(huán)中的中間變量只能是
item
,不能隨意自定義。如下例執(zhí)行循環(huán)打印one,two,three。首先定義劇本文件test_loop.yml9.3Ansible劇本23playbook循環(huán)–標準循環(huán)檢查劇本文件語法,執(zhí)行劇本9.3Ansible劇本24playbook循環(huán)–標準循環(huán)下例使用循環(huán)在被管主機上創(chuàng)建用戶。編寫劇本create_user.yml9.3Ansible劇本25playbook循環(huán)–標準循環(huán)檢查劇本文件語法,執(zhí)行劇本14.5playbook任務控制14.5.3playbook
tag屬性考慮這樣一個場景,現(xiàn)在需要更新一個應用服務的配量文件,并通過Ansible發(fā)布到被管節(jié)點上,再重新加載該服務。目前的做法是:通過AnsiblePlayBook將新的配置文件發(fā)布到被管節(jié)點上,再重新加載該服務。這樣做的風險是每次更改服務配置文件后,雖然可以通過playbook發(fā)布到被管節(jié)點,但整個PlayBook都要執(zhí)行一次,這樣無形中擴大了變更范圍和變更風險。Tags屬性可以解決這個問題。項目9使用Ansible實現(xiàn)網(wǎng)絡自動化運維9.1Ansible基礎9.2Ansible模塊9.3Ansible劇本9.4任務實施9.4任務實施考慮這樣一個場景,現(xiàn)在需要更新一個應用服務的配量文件,并通過Ansible發(fā)布到被管節(jié)點上,按照公司A的整體網(wǎng)絡規(guī)劃,運維工程師將使用Ansible工具對深圳總部園區(qū)網(wǎng)絡實現(xiàn)網(wǎng)絡自動化配置與管理,需要完成的任務如下。
(1)配置SSH服務。(2)創(chuàng)建資產(chǎn)文件。(3)編寫收集信息的playbook。(4)驗證收集信息的playbook。(5)編寫配置交換機的playbook。(6)驗證配置交換機的playbook。項目10使用Nornir收集網(wǎng)絡日志項目10使用Nornir收集網(wǎng)絡日志10.1Nornir基礎10.2任務實施10.1Nornir基礎在網(wǎng)絡自動化領域中,Python是其中熱門的語言,而Nornir則是非常熱門的框架。Nornir是基于Python編寫的網(wǎng)絡自動化框架,而其他大多數(shù)自動化框架通過使用一些煩瑣的偽語言來隱藏它們所使用的語言,這些偽語言通常是相當完整的,但缺乏調(diào)試和故障排除的工具,導致這些框架難以與其他系統(tǒng)集成,而且沒有很好的處理數(shù)據(jù)的能力,可重用性有限。相比Ansible,Nornir更適合操作網(wǎng)絡設備,操作更加靈活,且不受格式限制,與Python結合可使執(zhí)行操作更加靈活,并且具有很強的并發(fā)性。在執(zhí)行速度上,Norinir相比Ansible執(zhí)行速度更快。Nornir要求安裝Python3.7或更高版本。1Nornir簡介10.1Nornir基礎Nornir是一個用于自動化網(wǎng)絡編程的Python框架,它可以幫助用戶快速構建和管理復雜的網(wǎng)絡系統(tǒng)。Nornir具有以下幾個特點。靈活:Nornir靈活的框架,允許用戶根據(jù)需要構建自己的網(wǎng)絡應用程序。可擴展性:Nornir使用插件機制,用戶可以輕松地添加新的插件。設備支持廣泛:Nornir支持多種設備類型和操作系統(tǒng),包括華為、思科、Juniper、Arista等的主流網(wǎng)絡設備。并行處理:Nornir使用異步處理模式,可以并行處理多個任務,提高效率。簡單易用:Nornir的API非常簡單、易用,即使初學者也很容易上手。2Nornir特點10.1Nornir基礎主機清單是Nornir重要的部分,它由hosts、groups和defaults這3部分組成,其中groups、defaults文件不是必需的。主機相關的文件都使用YAML文件。hosts.yaml定義了設備屬性,分為3大部分:設備基本信息:包含設備的IP地址或目標主機名、用戶名和密碼、連接的端口號、設備的廠商,這些參數(shù)都可以無縫對接netmiko和napalm。所屬組groups:列表格式,每個組都有很多屬性,如接入設備的基本配置等。參數(shù)data:字典格式,用戶可以根據(jù)需求自己定義,如定義一個role后續(xù)再篩選,或者一些配置預定義等。3主機清單10.1Nornir基礎初始化Nornir對象的方法是使用
InitNornir()
函數(shù)。InitNornir()
可以使用配置文件、代碼或者將兩者結合起來初始化Nornir對象。4初始化Nornir對象fromnornirimportInitNornir#導入InitNornir
nr=InitNornir()#初始化Nornir對象10.1Nornir基礎任務是一段可以被循環(huán)使用的用于實現(xiàn)一定邏輯的代碼,類似于Ansible的模塊。任務在設備上進行操作,為單個主機或主機組實現(xiàn)某些功能,可以簡單理解成函數(shù)。任務作為參數(shù)輸入Python函數(shù),并以框架可以理解和打印的結構化格式將結果作為數(shù)據(jù)返回。定義好任務函數(shù)之后,就可以編寫一個runbook(在Ansible中被稱為playbook)來執(zhí)行這個任務。函數(shù)run()用于執(zhí)行任務,接收可能已指定的任何其他可選參數(shù)。函數(shù)print_result()用于顯示用戶友好的輸出,記錄任務對哪些主機執(zhí)行了哪些操作。這不是實時完成的,它是對存儲結果的美化。5任務(1)10.1Nornir基礎下面的示例使用run()執(zhí)行任務,使用print_result()顯示輸出。5任務(2)fromnornirimportInitNornirfromnornir.core.taskimportTask,Resultfromnornir_utils.plugins.functionsimportprint_result
nr=InitNornir(config_file="hosts.yaml")
definventory_usernames(task):returnResult(host=task.host,result=f"{}usernameis{task.host.username}")
output=nr.run(task=inventory_usernames)print_result(output)10.1Nornir基礎Nornir過濾器(filter)可以限制自動化腳本在特定網(wǎng)絡設備或網(wǎng)絡設備組上執(zhí)行的能力。Nornir有兩種過濾方法:一種是使用基本過濾器,根據(jù)特定設備屬性來過濾網(wǎng)絡設備;另一種是使用高級過濾器,可以使用設備屬性的復雜邏輯運算如AND、OR、NOT、CONTAIN、LESSTHANOREQUAL和GREATERTHANOREQUAL等來過濾設備。6過濾器(1)10.1Nornir基礎使用Nornir過濾器功能,首先需要在Nornir清單文件中為每個網(wǎng)絡設備配置一些屬性。設備屬性可以是任何可用于過濾設備的屬性,如物理位置、設備類型、設備的拓撲層等。所有這些屬性都是通過在hosts.yaml清單文件中添加一個data字段來配置的。本例中每個設備使用了3個屬性,type表示設備的類型,city表示設備的物理位置,core表示設備是否是核心路由器。。6過濾器(2)---S2:hostname:"54"groups:-huaweidata:type:switchcity:shenzhencore:True
SZ1:hostname:""groups:-huaweidata:type:routercity:guangzhoucore:True
S4:
hostname:""
groups:
-cisco
data:
type:switch
city:guangzhou
core:False10.1Nornir基礎在Nornir的官方網(wǎng)站中可以看到官方的插件列表,插件列表分成任務類、連接類、清單管理類、進程管理類、函數(shù)類等7插件10.1Nornir基礎nornir_netmiko插件用于調(diào)用netmiko的相關功能,自動管理到網(wǎng)絡設備的連接,直接調(diào)用nornir_netmiko中的任務函數(shù)就可以實現(xiàn)與網(wǎng)絡設備的交互。nornir_netmiko插件中的主要任務函數(shù)有:netmiko_commit()、netmiko_file_transfer()、netmiko_save_config()、netmiko_send_command()和netmiko_send_config()。8nornir_netmiko插件10.1Nornir基礎nornir_utils插件常用的函數(shù)print_result()。大多數(shù)情況下,如果只想知道任務的執(zhí)行結果,可以使用
print_result()
函數(shù)。print_result()
可以按照日志規(guī)則打印結果。默認情況下,它只打印嚴重級別大于
INFO
的任務(如果任務中沒有指定日志級別,默認值是INFO);如果任務執(zhí)行失敗,它的嚴重級別是
ERROR,比
INFO
大,所以可以輸出。日志級別:CRITICAL>ERROR>WARNING>INFO>DEBUG。nornir_utils插件中的write_file()函數(shù)可以用于非常便捷地將文本內(nèi)容寫入文件9nornir_utils插件10.1Nornir基礎nornir_jinja2插件主要提供一些基于Jinja2封裝的比較便捷的任務函數(shù),可以方便地使用Jinja2。nornir_jinja2主要有兩個任務函數(shù)即template_file()函數(shù)和tempalte_string()函數(shù)。10nornir_jinja2插件項目10使用Nornir收集網(wǎng)絡日志10.1Nornir基礎10.2任務實施10.2任務實施整個網(wǎng)絡已經(jīng)實現(xiàn)了路由、交換等各項功能,已經(jīng)實現(xiàn)了全網(wǎng)互通。為了更好地管理整個網(wǎng)絡,本任務主要收集深圳總部園區(qū)網(wǎng)絡和服務器區(qū)網(wǎng)絡的路由器和交換機日志。工程師需要完成的任務如下。(1)配置SSH服務。(2)安裝Syslog日志服務器。(3)創(chuàng)建主機清單。(4)編寫Python腳本。(5)執(zhí)行Python腳本。(6)服務器收到日志信息。項目11使用Scapy處理數(shù)據(jù)包項目11使用Scapy處理數(shù)據(jù)包11.1Scrapy基礎11.2任務實施11.1Scapy基礎Scapy是Python應用程序,允許用戶發(fā)送、嗅探、分析和偽造網(wǎng)絡數(shù)據(jù)包,允許構建能夠探測、掃描或攻擊網(wǎng)絡的工具。它還提供了靈活的API、支持多種協(xié)議、支持數(shù)據(jù)可視化等,被廣泛應用于網(wǎng)絡安全、網(wǎng)絡測試、網(wǎng)絡監(jiān)控等領域。Scapy能夠對任何類型的數(shù)據(jù)包進行準確而快速的描述,使用Python語法和Python解釋器,不需要編寫單獨的解釋器,用戶不需要再學習另外的語言。1Scapy簡介11.1Scapy基礎Scapy支持大量的協(xié)議,采用分層的形式組織各種協(xié)議,每一個協(xié)議就是一個類。只需要實例化一個協(xié)議類,就可以創(chuàng)建一個該協(xié)議的數(shù)據(jù)包。下面的代碼是在Python中執(zhí)行的,打印Scapy中的層2Scapy協(xié)議類11.1Scapy基礎下面的代碼使用Scapy的explore()方法打印出l2中的各種協(xié)議3l2中的各種協(xié)議11.1Scapy基礎下面的代碼使用Scapy的explore()方法打印出inet中的各種協(xié)議4inet中的各種協(xié)議11.1Scapy基礎在使用Scapy構造數(shù)據(jù)包時,需要填入數(shù)據(jù)包的字段,這
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《陸游生平上課》課件
- 2024-2025年河南中考物理試卷及答案
- 2024年全球視野下的SWOT分析法課件解析
- 山羊茲拉特草原課件:2024年教學新視角
- 起重機械指揮試題題庫及答案
- 旅統(tǒng)基1表、2表、3表、4表、5表
- 2024年新版課件:輕松學會三角形面積
- 1查勘定損要求和流程
- 人教版(八年級)初二上冊歷史期中測試題及答案
- 小學語文經(jīng)典美文老友蔡瀾
- 九年級英語《Unit 6 When was it invented》說課稿
- 馬渭麗《月光下的中國》
- 2024屆高考英語復習語法填空課件
- 原地8字舞龍課課件高一上學期體育與健康人教版
- 如何有效應對學習中的困難和挑戰(zhàn)
- 醫(yī)院感染管理培訓課件消毒劑的選擇與使用
- 平臺分銷返傭合作協(xié)議
- 中國城市行政代碼
- 低纖維蛋白原血癥的護理查房
- 數(shù)學4教材介紹
- 全國大學生職業(yè)生涯規(guī)劃大賽
評論
0/150
提交評論