网络自动化运维教程 课件 项目8-12 使用RESTCONF协议配置网络-使用Nmap扫描网络_第1页
网络自动化运维教程 课件 项目8-12 使用RESTCONF协议配置网络-使用Nmap扫描网络_第2页
网络自动化运维教程 课件 项目8-12 使用RESTCONF协议配置网络-使用Nmap扫描网络_第3页
网络自动化运维教程 课件 项目8-12 使用RESTCONF协议配置网络-使用Nmap扫描网络_第4页
网络自动化运维教程 课件 项目8-12 使用RESTCONF协议配置网络-使用Nmap扫描网络_第5页
已阅读5页,还剩135页未读 继续免费阅读

下载本文档

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

文档简介

项目8使用RESTCONF协议配置网络项目8使用RESTCONF协议配置网络8.1HTTP协议原理8.2RESTCONF协议8.3任务实施8.1HTTP协议原理1HTTP协议–原理HTTP基于客户端/服务端(C/S)的架构模型。HTTP请求及响应有如下五个步骤:HTTP客户端通常是浏览器,Web服务器可以是Apache服务器,IIS服务器(InternetInformationServices)等

客户端与服务器建立TCP连接。客户端发送HTTP请求。请求报文由请求行、请求头部、空行和请求数据四部分组成。服务器接受请求并返回HTTP响应。响应报文由状态行、响应头部、空行和响应正文四部分组成。释放TCP连接。客户端浏览器解析响应报文并显示。客户端浏览器依次解析状态行、响应头部、响应正文并显示。如正文数据为HTML,客户端根据HTML的语法对其进行格式化,并在浏览器窗口中显示。8.1HTTP协议原理2HTTP协议–特点HTTP具有如下特点:

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求后就断开连接。媒体独立:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器通过头部字段指定适合的MIMEType内容类型。无状态:无状态是指协议对于事务处理没有记忆能力,这样做利于更快地处理大量事务,确保协议的可伸缩性。。8.1HTTP协议原理3HTTP协议–客户端发送的报文客户端发送的HTTP请求消息包括由请求行、请求头部、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

8.1HTTP协议原理4HTTP协议–客户端请求报文请求行由请求方法字段、URI字段和HTTP协议版本字段3个字段组成。

请求方法:HTTP使用的请求方法,比如常见的GET/POST等。HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型。URI:URI是一个统一资源标识符,它标识了请求所针对的资源。协议版本:协议版本旨在允许发送方指示消息的格式和理解后续HTTP通信的能力。8.1HTTP协议原理5HTTP协议–客户端请求方法根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP1.0定义了三种请求方法:GET、POST和HEAD方法。HTTP1.1新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT方法。

方法描述GET请求指定的页面信息,服务端将返回具体内容数据。POST提交数据,例如提交表单。HEAD类似于GET请求,但是返回的响应中没有具体的内容,用于获取报头。PUT更新和修改数据。DELETE请求删除指定的页面。CONNECT用于HTTP代理。OPTIONS允许客户端查看服务器的性能。TRACE回显服务器收到的请求,主要用于测试或诊断。PATCH用来对已知资源进行局部更新。8.1HTTP协议原理6HTTP协议–客户端请求头部请求头部允许客户端向服务器传递关于请求的附加信息。这些字段充当请求修饰符,其语义相当于编程语言方法调用中的参数。

8.1HTTP协议原理7HTTP协议–客户端请求头部字段

8.1HTTP协议原理8HTTP协议–客户端请求数据空行:它的作用是通过一个空行,告诉服务器请求头部到此为止。请求数据:若方法字段是GET,则此项为空,没有数据。若方法字段是POST,则通常来说此处放置的是要提交的数据。

8.1HTTP协议原理8HTTP协议–客户端请求报文示例客户端向服务器发送含有用户名密码的请求消息,进行登录认证。

8.1HTTP协议原理10HTTP协议–服务端响应消息客户端向服务器发送含有用户名密码的请求消息,进行登录认证。

8.1HTTP协议原理11HTTP协议–服务端响应消息–状态行响应消息的第一行是状态行,由协议版本、状态码和原因短语组成,每个元素由空格字符分隔。

协议版本:协议版本旨在允许发送方指示消息的格式及其理解后续HTTP通信的能力。状态码:一个3位整数结果码,用于向客户端返回操作结果。原因短语:旨在对状态码进行简短的文本描述,帮助理解。8.1HTTP协议原理12HTTP协议–服务端响应消息–状态码HTTP状态码(HTTPStatusCode)是服务器响应状态的3位数字码,用于向客户端返回操作结果。

8.1HTTP协议原理13HTTP协议–服务端响应消息–响应头部响应头部允许服务器传递关于响应的附加信息,这些头部字段提供了关于服务器的相关信息以及URI所标识资源的信息。

8.1HTTP协议原理14HTTP协议–服务端响应消息–响应头部字段

8.1HTTP协议原理15HTTP协议–服务端响应报文示例

服务器向客户端返回响应消息,认证成功。8.1HTTP协议原理16HTTPS协议HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险。HTTPS具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。HTTPS(HyperTextTransferProtocoloverSecureSocketLayer,安全超文本传输协议),是以安全为目标的HTTP通道。HTTPS在HTTP的基础下加入SSL/TLS层,是使用SSL/TLS加密的HTTP协议。8.1HTTP协议原理17HTTPS协议HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险。HTTPS具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。HTTPS(HyperTextTransferProtocoloverSecureSocketLayer,安全超文本传输协议),是以安全为目标的HTTP通道。HTTPS在HTTP的基础下加入SSL/TLS层,是使用SSL/TLS加密的HTTP协议。项目8使用RESTCONF协议配置网络8.1HTTP协议原理8.2RESTCONF协议8.3任务实施8.2RESTCONF协议随着网络规模的增大、复杂性的增加,自动化运维的需求日益增加。NETCONF提供基于RPC机制的应用编程接口。但是NETCONF已无法满足网络发展中对设备编程接口提出的新要求,希望能够提供支持WEB应用访问和操作网络设备的标准化接口。RESTCONF是在融合NETCONF和HTTP协议的基础上发展而来的。RESTCONF以HTTP协议的方法提供了NETCONF协议的核心功能,编程接口符合IT业界流行的RESTful风格,为用户提供高效开发WEB化运维工具的能力。1RESTCONF介绍–背景8.2RESTCONF协议RESTCONF允许Web应用以一种模块化、可扩展的方式访问网络设备的配置数据、状态数据和事件通知。而NETCONG使用的NETCONFClient。2RESTCONF介绍–特点RESTCONF使用HTTP的方法对设备YANG定义的数据进行操作(增删改查)。设备NETCONF和RESTCONF可以共享的YANG文件。数据编码格式支持XML或者JSON。8.2RESTCONF协议RESTCONF基本网络架构如下图所示。RESTCONF基本网络架构中主要元素:RESTCONFClient:RESTCONFServer:3RESTCONF介绍–网络结构客户端利用RESTCONF协议对网络设备进行系统管理。客户端向服务器发送请求,可以实现创建、删除、修改或查询一个或多个数据。设备作为服务器端,服务器用于维护被管理设备的信息数据并响应客户端的请求,把数据返回给发送请求的客户端。服务器收到客户端的请求后会进行解析并处理请求,然后给客户端8.2RESTCONF协议RESTCONF使用YANG作为其建模语言。YANG是用来对RESTCONF协议中的配置数据和状态数据等进行建模的数据建模语言。RESTCONF客户端和服务器之间使用HTTPs协议进行通信。客户端必须和服务器成功建立一个安全的、面向连接的会话才能进行通信。客户端向服务器发送一个请求,服务器处理完用户请求后,给客户端发送一个回应消息。RESTCONF客户端发送的请求和服务器的回应消息可以使用XML或者JSON编码。4RESTCONF介绍–建模语言8.2RESTCONF协议5RESTCONF介绍–与NETCONF比较(1)RESTCONF与NETCONF比较比较项目NETCONF+YANGRESTCONF+YANG传输通道(协议)NETCONF传输层首选推荐SSH(SecureShell)协议,XML信息通过SSH协议承载。RESTCONF是基于HTTP协议访问设备资源。RESTCONF提供的编程接口符合IT业界流行的RESTful风格。报文格式采用XML编码。采用XML或JSON编码。操作特点NETCONF的操作复杂,例如:NETCONF支持增、删、改、查,支持多个配置数据库,也支持回滚等。NETCONF需要两阶段提交(即先提交参数,再commit参数)。RESTCONF的操作简单,例如:RESTCONF支持增、删、改、查操作,仅支持<running/>配置数据库。RESTCONF操作方法无需两阶段提交,操作直接生效。RESTCONF较于NETCONF,使用了不同的操作方法和数据编码。8.2RESTCONF协议5RESTCONF介绍–与NETCONF比较(2)RESTCONF较于NETCONF定义了配置数据库和增、删、改、查操作,这些操作可以用来访问配置数据库。NETCONF使用YANG语言定义了数据库内容、配置数据、状态数据、RPC操作等的语法语意。RESTCONF协议通过HTTP方法可以识别NETCONF中定义的增删改查操作,用于访问YANG定义的数据。8.2RESTCONF协议5RESTCONF介绍–操作方法比较(3)RESTCONF操作方法与NETCONF操作方法对应关系如下所示:RESTCONF操作方法与NETCONF协议方法RESTCONF+YANGNETCONF+YANGOPTIONSN/AHEAD<get-config>,<get>GET<get-config>,<get>POST<edit-config>(nc:operation="create")POST调用RPC操作PATCH当操作对象已存在时,<edit-config>(nc:operation="merge")DELETE<edit-config>(nc:operation="delete")

8.2RESTCONF协议6一次典型的RESTCONF交互一次完整的RESTCONF交互包含请求和响应。本例客户端通过OPTIONS方法获取设备支持的操作方法。设备回复支持操作有:POST,DELETE,GET,HEAD,PATCH,OPTIONS

8.2RESTCONF协议7RESTCONF请求报文

8.2RESTCONF协议8RESTCONF请求案例

RESTCONF请求对象地址为00。修改数据配置数据domainName为abc,修改accessLimit值为10。8.2RESTCONF协议9RESTCONF响应报文

8.2RESTCONF协议10RESTCONF响应案例

RESTCONF响应报文:返回状态码201,表示资源创建成功。头部信息Content-Type和Content-Length,描述Body信息。Body数据类型为XML,内容长度为0。第8章RESTCONF协议8.1HTTP协议原理8.2RESTCONF协议8.3任务实施8.3任务实施

公司B的网络由4台思科CSR1000v组成,希望通过Web应用方式统一管理网络设备。按照公司的整体网络规划,运维工程师将使用RESTCONF协议实现网络配置与管理。本任务主要通过Web的方式配置与管理公司B网络的4台思科CSR1000v,思科CSR1000v作为RESTCONF服务器。网络拓扑如图8-1所示。工程师需要完成的任务如下。(1)配置设备SSH登陆密码。(2)配置RESTCONF。(3)编写Python脚本。(4)运行Python脚本。(5)验证配置。项目9使用Ansible实现网络自动化运维项目9使用Ansible实现网络自动化运维9.1Ansible基础9.2Ansible模块9.3Ansible剧本9.4任务实施12.1Ansible基础Ansible基于Python语言实现,由Paramiko和PyYAML两个关键模块构建。Ansible具有以下特点:1特点安装部署简单;管理主机便捷,支持多台主机并行管理。避免在被管理主机上安装客户代理,采用无代理方式,只是利用现有的SSH后台进程。用于描述基础架构的语言友好。关注安全,很容易对执行的内容进行审计、评估、重写。能够立即管理远程被管理主机,不需要预先安装任何软件。不仅仅支持Python,可运行使用任何动态语言开发模块。非root账户也可以使用。成为最简单、易用的IT自动化系统。12.1Ansible基础Ansible通常由管理节点和被管节点组成。管理节点是用来安装Ansible工具软件、执行维护指令的服务器或工作站,是Ansible维护的核心。被管节点是运行业务服务的服务器,由控制机通过SSH来进行管理。Ansible采用Pythonparamiko模块,通过SSH连接主机。Ansible在管理节点将Ansible模块通过SSH协议推送到被管节点执行,执行完之后自动删除

2Ansible架构–管理方式Ansible管理节点Ansible被管节点Ansible被管节点Ansible被管节点SSHSSHSSH12.1Ansible基础Ansible对管理节点没有太多要求,当前管理节点的操作系统选用Linux。被管节点的要求更少,支持Linux、类Unix、Windows等类型的主机节点,甚至支持Cisco、Huawei、Juniper等网络设备、负载均衡器。Ansible不需要安装其他依赖软件包,默认是基于SSH协议进行通信的。安装Ansible之后,管理节点不需要启动或运行任何Ansible的后台进程,也不需要数据库。只要在一台管理节点上安装Ansible,就可以通过这台主机管理一组远程节点。在被管节点上,同样也不需要安装、运行任何Ansible特有的软件。这样如果Ansible版本需要升级,只需升级控制主机,不涉及被管节点。3Ansible系统要求12.1Ansible基础Ansible管理节点只要安装了Python2.6或以上版本,就可以运行Ansible。注意,Windows环境系统当前还不能作为管理节点。Ansible被管理节点可以是Linux系统,可以是Windows系统。4Ansible系统要求12.1Ansible基础在Ansible管理节点上使用yum安装Ansible,先更新yum源5Ansible安装步骤#Yum源更换为国内阿里源[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管理节点上使用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下发指令被管理主机时输入被管理主机主机密码,使用SSH免密登录。使用ssh-keygen与ssh-copy-id来实现快速证书的生成及公钥下发。其中ssh-keygen生产一对密钥,使用sh-copy-id来下发生成的公钥。7Ansible安装步骤#在管理节点上创建密钥,执行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基础下发密钥就是把管理节点的公钥id_rsa.pub下发到被管理节点上8Ansible安装步骤#在管理节点上向被管理节点ansi-Node01(31)下发密钥

[root@ansi-manager~]#ssh-copy-idroot@31#在管理节点上向被管理节点ansi-Node01(31)下发密钥[root@ansi-manager~]#ssh-copy-idroot@3212.1Ansible基础下发密钥就是把管理节点的公钥id_rsa.pub下发到被管理节点上9Ansible安装步骤#在管理节点上向被管理节点ansi-Node01(31)下发密钥

[root@ansi-manager~]#ssh-copy-idroot@31#在管理节点上向被管理节点ansi-Node01(31)下发密钥[root@ansi-manager~]#ssh-copy-idroot@3212.1Ansible基础在Ansible中,被管理节点都称为Inventory。因此,Inventory就是被管理主机清单。默认Ansible的Inventory是一个静态的INI格式的文件/etc/ansible/hosts。还可以通过ANSIBLEHOSTS环境变量指定或者运行ansible和ansible-playbook的时候用-i参数临时设置。在Ansible中,常用的有2种方式制定hosts文件:Inventory文件(/etc/ansible/hosts)可以定义主机或主机组定义。添加完主机和主机组后就可以使用Ansible命令针对这些主机进行操作和管理了。10资产Inventory默认读取/etc/ansible/hosts文件;通过命令行参数

-i

指定hosts文件;12.1Ansible基础Ansible的资产文件中,可以以IP地址的形式或者主机名的形式存在Ansible的资产若连续,可以使用[stat:end]的形式去表达可以将服务器按照业务场景定义成组,比如db和webservers可以把一个组作为另一个组的子成员,比如db

和webservers是docker组的子成员。11资产Inventory文件定义12.1Ansible基础12资产Inventory举例[root@ansi_manager~]#cat/etc/ansible/hosts31#单独定义一个主机,由于配置了SSH免密登录,不需要指定SSH登录密码32#单独定义一个主机,由于配置了SSH免密登录,不需要指定SSH登录密码​33ansible_ssh_pass='123456'#定义一个主机,使用Inventory内置变量定义了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资产Inventory举例12.1Ansible基础14查看资产[root@ansi-manager~]#ansibleall--list-hostshosts(7):333441424331

32查看资产文件中的所有主机查看资产文件中主机组中的所有主机[root@ansi-manager~]#ansiblewebservers--list-hostshosts(2):313212.1Ansible基础资产变量分为主机变量和组变量,分别针对资产中的单个主机和主机组。主机变量:以下资产中,定义了2个主机变量user和port此变量只针对31这台服务器有效。验证:(通过-i指定自定义的资产文件)15资产变量–主机变量[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资产变量–主机变量[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基础变量在以下资产中,定义一个组变量home。此变量针对webservers这个主机组中的所有主机有效17资产变量–组变量[root@ansi-manager~]#vimgroupvars[webservers]31user=tom32[webservers:vars]home="/home/tom"12.1Ansible基础home是webservers的组变量,针对组中的所有主机有效18资产变量–组变量[root@ansi-manager~]#ansiblewebservers-igroupvars-mdebug-a"var=home"31|SUCCESS=>{"home":"/home/tom"}32|SUCCESS=>{"home":"/home/tom"}项目9使用Ansible实现网络自动化运维9.1Ansible基础9.2Ansible模块9.3Ansible剧本9.4任务实施9.2Ansible模块Ansible核心:ansible核心模块(CoreModules):这些都是ansible自带的模块扩展模块(CustomModules):如果核心模块不足以完成某种功能,可以添加扩展模块插件(Plugins):完成模块功能的补充剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行连接插件(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执行一条命令,并且不需要保存命令。ad-hoc所有的命令都要依赖于模块,默认安装好的ansible里有很多自带的模块,例如:command,raw,shell,file,cron等若执行这样的命令:ansiblehost2-mcommand-adate,代表的就是ad-hoc命令。使用Ah-hoc命令,Ansible的一些插件功能就无法使用,如loop、facts功能等。3Ansible执行命令–ad-hoc命令9.2Ansible模块常用的ansible选项参数:4Ansible执行命令–ad-hoc命令参数

-m模块名:指定要执行的模块的名称,如果不指定-m选项,默认是command模块。

-a命令:指定执行模块对应的参数选项。

-k:提示输入SSH登录的密码而不是基于密钥的验证,小写k

-K:用于输入执行su或sudo操作时需要的认证密码,大写K-b:表示提升权限操作。新版ansible才有的一个选项操作。

--become-method:指定提升权限的方法,常用的有sudo和su,默认是sudo。

--become-user:指定执行sudo或su命令时要切换到哪个用户下,默认是root用户。

-BSECONDS:后台运行超时时间

-C:测试一下会改变什么内容,不会真正去执行,主要用来测试一些可能发生的变化

-fFORKS,:设置ansible并行的任务数。默认值是5

-iINVENTORY:指定主机清单文件的路径,默认为/etc/ansible/hosts。。

-h:查看帮助,关于ad-hoc的一些选项的详细参数9.2Ansible模块Ansible命令执行格式:5Ansible执行命令–ad-hoc命令执行格式ansible主机或组-m模块名-a‘模块参数’ansible参数主机和组:是在/etc/ansible/hosts`里或通过-i参数进行指定的部分​模块名:可以通过ansible-doc-l查看目前安装的模块,默认不指定时,使用的是command模块,具体可以查看/etc/ansible/ansible.cfg的“#module_name=command"部分,默认模块可以在该配置文件中进行修改;模块参数:可以通过“ansible-doc模块名”查看具体的用法及后面的参数;ansible参数:可以通过ansible命令的帮忙信息里查看到,这里有很多参数可以供选择,如是否需要输入密码、是否sudo等。9.2Ansible模块执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个场景过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook,就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,但playbook有自己的语法格式。Playbook将在下节课中详细讲解。6Ansible执行命令–playbook剧本项目9使用Ansible实现网络自动化运维9.1Ansible基础9.2Ansible模块9.3Ansible剧本9.4任务实施9.3Ansible剧本在前面个的课程中,使用Ansible模块执行一些简单的任务,使用ad-hoc命令可以方便的解决问题。但是有时一个任务需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。Playbook可以理解为批处理任务,但playbook有自己的语法格式。11playbook概述9.3Ansible剧本playbook文件由YAML语言编写。YAML是一个类似XML、JSON的标记性语言,YAML强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称“一种人性化的数据格式语言”。编写playbook要遵循一定的书写格式,以下为playbook常用到的YAML格式。2playbook文件格式大小写敏感使用空格作为嵌套缩进工具,缩进时不允许使用Tab键缩进的空格数目不重要,只要相同层级的元素左侧对齐即可使用“-”(横线)+单个空格:表示单个列表项使用“:”(冒号)+空格:表示单个键值对使用"{}"表示一个键值表9.3Ansible剧本playbook文件是通过ansible-playbook命令进行解析的,ansbile-playbook命令会根据自上而下的顺序依次执行playbook文件中的内容。Playbook还有很多特性,它可以允许传输某个命令的状态到后面的指令,也可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得playbook可以实现一些复杂的部署机制,这是ansiblead-hoc命令无法实现的。3playbook文件执行9.3Ansible剧本playbook是由一个或多个“play”组成的列表。play的主要功能在于,将事先合并为一组的主机装扮成事先通过ansible定义好的角色。将多个play组织在一个playbook中就可以让它们联同起来按事先编排的机制完成一系列复杂的任务。4playbook文件构成5个核心组件:target部分:定义将要执行playbook的远程主机组variable部分:定义playbook运行时需要使用的变量task部分:定义将要在远程主机上执行的任务列表handler部分:定义task执行完成以后需要调用的任务Roles:角色:对应5个目录层:vars变量层tasks任务层handlers触发条件files文件template模板9.3Ansible剧本4playbook组件-hostsplaybook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。如:[root@ansi_manager~]#cat

/etc/ansible/hosts3132​[webservers]31329.3Ansible剧本5playbook组件-hosts想知道在执行Playbook时,哪些主机将会受影响,则使用--list-hosts选项9.3Ansible剧本6playbook组件-task列表和action组件play的主体部分是task列表,task列表中有一个或多个task,各个task按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task。task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供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、编辑资产文件[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、执行剧本[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文件内通过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文件内通过vars字段定义变量3、执行剧本[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之间还可以互相传递数据,如有两个tasks,其中第2个task是否执行需要判断第1个task运行后的结果。这时就需要在task之间传递数据,把第1个task执行的结果传递给第2个task。Ansibleregister变量用来保存前一个命令的返回状态,便于后面进行调用,可用于task之间传递数据。如定义了2个task,第一个task执行hostname命令,第二个task通过debug模块打印出第一个task的主机名9.3Ansible剧本14playbook变量–注册变量register

检查剧本语法,执行剧本9.3Ansible剧本15playbook变量–fact变量AnsibleFacts是Ansible在被托管主机上自动收集的变量。它是通过在执行Ad-Hoc以及Playbook时使用setup模块进行收集的,并且这个操作是默认的。因为这个收集托管主机上的Facts比较耗费时间,所以可以在不需要的时候关闭setup模块。收集的Facts中包含了托管主机特有的信息,这些信息可以像变量一样在Playbook中使用。收集的Facts中包含了以下常用的信息:主机名、内核版本、网卡接口、IP地址、操作系统版本、环境变量、CPU核数、可用内存、可用磁盘等等……。9.3Ansible剧本16条件判断考虑这样的场景:若Nginx的配置文件语法错误则会导致启动Nginx失败,以至于PlayBook执行失败。如果能够在启动之前去对Nginx的配置文件语法做正确性的校验,只有当校验通过的时候,才去启动或者重启Nginx;否则则跳过启动Nginx的过程。这样就会避免Nginx配置文件语法问题而导致的无法启动Nginx的风险。when的值是一个条件表达式,如果条件判断成立,这个task就执行,如果判断不成立,则task不执行。9.3Ansible剧本17条件判断下面的例子包含3个task:task1安装nginx,task2检查nginx语法,task3根据task2的情况决定是否启动nginx服务。9.3Ansible剧本18条件判断9.3Ansible剧本19条件判断9.3Ansible剧本20条件判断9.3Ansible剧本21playbook循环Ansibleloops:可以使用loops方式去编写playbook减少重复使用某个模块。目前官网支持很多loops方式,这里使用介绍比较常用的loops。9.3Ansible剧本22playbook循环–标准循环playbook中标准循环使用

with_items:关键字,而且循环中的中间变量只能是

item

,不能随意自定义。如下例执行循环打印one,two,three。首先定义剧本文件test_loop.yml9.3Ansible剧本23playbook循环–标准循环检查剧本文件语法,执行剧本9.3Ansible剧本24playbook循环–标准循环下例使用循环在被管主机上创建用户。编写剧本create_user.yml9.3Ansible剧本25playbook循环–标准循环检查剧本文件语法,执行剧本14.5playbook任务控制14.5.3playbook

tag属性考虑这样一个场景,现在需要更新一个应用服务的配量文件,并通过Ansible发布到被管节点上,再重新加载该服务。目前的做法是:通过AnsiblePlayBook将新的配置文件发布到被管节点上,再重新加载该服务。这样做的风险是每次更改服务配置文件后,虽然可以通过playbook发布到被管节点,但整个PlayBook都要执行一次,这样无形中扩大了变更范围和变更风险。Tags属性可以解决这个问题。项目9使用Ansible实现网络自动化运维9.1Ansible基础9.2Ansible模块9.3Ansible剧本9.4任务实施9.4任务实施考虑这样一个场景,现在需要更新一个应用服务的配量文件,并通过Ansible发布到被管节点上,按照公司A的整体网络规划,运维工程师将使用Ansible工具对深圳总部园区网络实现网络自动化配置与管理,需要完成的任务如下。

(1)配置SSH服务。(2)创建资产文件。(3)编写收集信息的playbook。(4)验证收集信息的playbook。(5)编写配置交换机的playbook。(6)验证配置交换机的playbook。项目10使用Nornir收集网络日志项目10使用Nornir收集网络日志10.1Nornir基础10.2任务实施10.1Nornir基础在网络自动化领域中,Python是其中热门的语言,而Nornir则是非常热门的框架。Nornir是基于Python编写的网络自动化框架,而其他大多数自动化框架通过使用一些烦琐的伪语言来隐藏它们所使用的语言,这些伪语言通常是相当完整的,但缺乏调试和故障排除的工具,导致这些框架难以与其他系统集成,而且没有很好的处理数据的能力,可重用性有限。相比Ansible,Nornir更适合操作网络设备,操作更加灵活,且不受格式限制,与Python结合可使执行操作更加灵活,并且具有很强的并发性。在执行速度上,Norinir相比Ansible执行速度更快。Nornir要求安装Python3.7或更高版本。1Nornir简介10.1Nornir基础Nornir是一个用于自动化网络编程的Python框架,它可以帮助用户快速构建和管理复杂的网络系统。Nornir具有以下几个特点。灵活:Nornir灵活的框架,允许用户根据需要构建自己的网络应用程序。可扩展性:Nornir使用插件机制,用户可以轻松地添加新的插件。设备支持广泛:Nornir支持多种设备类型和操作系统,包括华为、思科、Juniper、Arista等的主流网络设备。并行处理:Nornir使用异步处理模式,可以并行处理多个任务,提高效率。简单易用:Nornir的API非常简单、易用,即使初学者也很容易上手。2Nornir特点10.1Nornir基础主机清单是Nornir重要的部分,它由hosts、groups和defaults这3部分组成,其中groups、defaults文件不是必需的。主机相关的文件都使用YAML文件。hosts.yaml定义了设备属性,分为3大部分:设备基本信息:包含设备的IP地址或目标主机名、用户名和密码、连接的端口号、设备的厂商,这些参数都可以无缝对接netmiko和napalm。所属组groups:列表格式,每个组都有很多属性,如接入设备的基本配置等。参数data:字典格式,用户可以根据需求自己定义,如定义一个role后续再筛选,或者一些配置预定义等。3主机清单10.1Nornir基础初始化Nornir对象的方法是使用

InitNornir()

函数。InitNornir()

可以使用配置文件、代码或者将两者结合起来初始化Nornir对象。4初始化Nornir对象fromnornirimportInitNornir#导入InitNornir

nr=InitNornir()#初始化Nornir对象10.1Nornir基础任务是一段可以被循环使用的用于实现一定逻辑的代码,类似于Ansible的模块。任务在设备上进行操作,为单个主机或主机组实现某些功能,可以简单理解成函数。任务作为参数输入Python函数,并以框架可以理解和打印的结构化格式将结果作为数据返回。定义好任务函数之后,就可以编写一个runbook(在Ansible中被称为playbook)来执行这个任务。函数run()用于执行任务,接收可能已指定的任何其他可选参数。函数print_result()用于显示用户友好的输出,记录任务对哪些主机执行了哪些操作。这不是实时完成的,它是对存储结果的美化。5任务(1)10.1Nornir基础下面的示例使用run()执行任务,使用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)可以限制自动化脚本在特定网络设备或网络设备组上执行的能力。Nornir有两种过滤方法:一种是使用基本过滤器,根据特定设备属性来过滤网络设备;另一种是使用高级过滤器,可以使用设备属性的复杂逻辑运算如AND、OR、NOT、CONTAIN、LESSTHANOREQUAL和GREATERTHANOREQUAL等来过滤设备。6过滤器(1)10.1Nornir基础使用Nornir过滤器功能,首先需要在Nornir清单文件中为每个网络设备配置一些属性。设备属性可以是任何可用于过滤设备的属性,如物理位置、设备类型、设备的拓扑层等。所有这些属性都是通过在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的官方网站中可以看到官方的插件列表,插件列表分成任务类、连接类、清单管理类、进程管理类、函数类等7插件10.1Nornir基础nornir_netmiko插件用于调用netmiko的相关功能,自动管理到网络设备的连接,直接调用nornir_netmiko中的任务函数就可以实现与网络设备的交互。nornir_netmiko插件中的主要任务函数有:netmiko_commit()、netmiko_file_transfer()、netmiko_save_config()、netmiko_send_command()和netmiko_send_config()。8nornir_netmiko插件10.1Nornir基础nornir_utils插件常用的函数print_result()。大多数情况下,如果只想知道任务的执行结果,可以使用

print_result()

函数。print_result()

可以按照日志规则打印结果。默认情况下,它只打印严重级别大于

INFO

的任务(如果任务中没有指定日志级别,默认值是INFO);如果任务执行失败,它的严重级别是

ERROR,比

INFO

大,所以可以输出。日志级别:CRITICAL>ERROR>WARNING>INFO>DEBUG。nornir_utils插件中的write_file()函数可以用于非常便捷地将文本内容写入文件9nornir_utils插件10.1Nornir基础nornir_jinja2插件主要提供一些基于Jinja2封装的比较便捷的任务函数,可以方便地使用Jinja2。nornir_jinja2主要有两个任务函数即template_file()函数和tempalte_string()函数。10nornir_jinja2插件项目10使用Nornir收集网络日志10.1Nornir基础10.2任务实施10.2任务实施整个网络已经实现了路由、交换等各项功能,已经实现了全网互通。为了更好地管理整个网络,本任务主要收集深圳总部园区网络和服务器区网络的路由器和交换机日志。工程师需要完成的任务如下。(1)配置SSH服务。(2)安装Syslog日志服务器。(3)创建主机清单。(4)编写Python脚本。(5)执行Python脚本。(6)服务器收到日志信息。项目11使用Scapy处理数据包项目11使用Scapy处理数据包11.1Scrapy基础11.2任务实施11.1Scapy基础Scapy是Python应用程序,允许用户发送、嗅探、分析和伪造网络数据包,允许构建能够探测、扫描或攻击网络的工具。它还提供了灵活的API、支持多种协议、支持数据可视化等,被广泛应用于网络安全、网络测试、网络监控等领域。Scapy能够对任何类型的数据包进行准确而快速的描述,使用Python语法和Python解释器,不需要编写单独的解释器,用户不需要再学习另外的语言。1Scapy简介11.1Scapy基础Scapy支持大量的协议,采用分层的形式组织各种协议,每一个协议就是一个类。只需要实例化一个协议类,就可以创建一个该协议的数据包。下面的代码是在Python中执行的,打印Scapy中的层2Scapy协议类11.1Scapy基础下面的代码使用Scapy的explore()方法打印出l2中的各种协议3l2中的各种协议11.1Scapy基础下面的代码使用Scapy的explore()方法打印出inet中的各种协议4inet中的各种协议11.1Scapy基础在使用Scapy构造数据包时,需要填入数据包的字段,这

温馨提示

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

评论

0/150

提交评论