网络自动化运维教程 课件 项目9-11 使用Ansible实现网络自动化运维、使用Nornir收集网络日志、使用Scapy处理数据包_第1页
网络自动化运维教程 课件 项目9-11 使用Ansible实现网络自动化运维、使用Nornir收集网络日志、使用Scapy处理数据包_第2页
网络自动化运维教程 课件 项目9-11 使用Ansible实现网络自动化运维、使用Nornir收集网络日志、使用Scapy处理数据包_第3页
网络自动化运维教程 课件 项目9-11 使用Ansible实现网络自动化运维、使用Nornir收集网络日志、使用Scapy处理数据包_第4页
网络自动化运维教程 课件 项目9-11 使用Ansible实现网络自动化运维、使用Nornir收集网络日志、使用Scapy处理数据包_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

项目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_jinj

温馨提示

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

评论

0/150

提交评论