昨天的《网络工程师的Python之路 - NAPALM》中介绍了NAPALM这个十分强大又好用的开源Python模块,以及它Getter类API的用法,今天继续来讲下如何使用它Configuration类的API。前文中提到了,Configuration类的API包括替换(Config.replace),合并(Config.merge),比对(Compare config),原子更换(Atomic Changes),回滚(Rollback)等五项操作,本文中我将举例介绍最常用的合并和比对的用法。
合并(Config.merge)
Configuration类的合并(Config.merge)实际就是给设备做配置,它的方法是创建一个扩展名为.cfg的配置文件,将配置命令写入该配置文件,然后在脚本里使用NAPALM的load_merge_candidate()函数读取配置文件中的命令并上传到目标设备里,然后通过commit_config()将这些命令在设备上配置执行,load_merge_candidate()函数是基于SCP协议来向目标设备传送配置命令的,因此在使用load_merge_candidate()之前,我们首先需要在设备上开启scp server,否则NAPALM会返回“napalm.base.exceptions.CommandErrorException: SCP file transfers are not enabled. Configure 'ip scp server enable' on the device.”的错误:
![8217caea1ef3d2c2351b984013e7e654.png](https://i-blog.csdnimg.cn/blog_migrate/46113c9d4a4573dabaadccba983ce1ea.jpeg)
![ff8df9bb78793553f4887146abafb17c.png](https://i-blog.csdnimg.cn/blog_migrate/46529af5fe2b97de012e865a296e33ad.jpeg)
知道原理后,首先我们创建一个名为napalm_config.cfg的配置文件,将下面用来对交换机VTY的第5至15条线做基本配置的命令集写进该配置文件并保存:
![386d353a9a2432227fc470bde48bca4b.png](https://i-blog.csdnimg.cn/blog_migrate/e3815106a3c5bb35aaabd13c29a485ff.jpeg)
然后创建一个名为napalm2.py的脚本:
![31b3ab7a305fc98454386632a78345a2.png](https://i-blog.csdnimg.cn/blog_migrate/8bb9e19d0db6f4be465ea1bf2529e8d8.jpeg)
将下面的代码放入脚本:
from napalm import get_network_driver driver = get_network_driver('ios') SW1 = driver('192.168.2.11', 'python', '123') SW1.open() SW1.load_merge_candidate(filename='napalm_config.cfg') SW1.commit_config()
代码讲解如下:
- 这里我们用load_merge_candidate(filename='napalm_config.cfg')加载我们之前创建好的配置文件napalm_config.cfg,然后配合NAPALM的commit_config()方法执行该配置文件里的配置命令即完成了对交换机的配置任务。
执行代码前,我们先检查一遍交换机192.168.2.11的配置,确认当前交换机没有line vty 5 15的配置:
![03bd2287258c9180bc037bdbc2469d9c.png](https://i-blog.csdnimg.cn/blog_migrate/7dc9f4676c0769de2eb8a3bcd9819797.jpeg)
然后执行脚本(因为代码里我们没有使用任何print语句,因此这里执行代码后没有任何回显内容):
![e2e5c4995efab9b8a8df735e28305e4e.png](https://i-blog.csdnimg.cn/blog_migrate/007c70c27fe9bac6dcac0ac31056bea5.jpeg)
然后回到交换机检查配置:
![108d09eb09c024a2247d965f895d0397.png](https://i-blog.csdnimg.cn/blog_migrate/7360c84506c812bebbffa4bfae3c93c3.jpeg)
可以看到执行脚本后NAPALM已经帮我们完成了VTY 5至15线的配置,并且“show start | s line vty ”的回显内容证实了在完成配置的同时NAPALM也帮我们保存了该配置。
比对(Compare Config)
接下来我们看下如何使用Configuration类中的比对。首先我们手动将line vty 5 15下面的“ login local”、“transport input ssh”、“transport output ssh”三条命令都从交换机里移除,移除之后再“show run | s line vty”可以看到之前的三条命令现在已分别被“no login”、“transport input none”以及“transport output none”替代:
![3e107c347d41eaac20563a5e1a54f4a5.png](https://i-blog.csdnimg.cn/blog_migrate/8e8b087359e143f7133fd55f14ea30a0.jpeg)
接着我们创建一个名为napalm3.py的脚本:
![d3c7b24b00503a3f85317363dd813575.png](https://i-blog.csdnimg.cn/blog_migrate/edf382dfc2deef86f0a08dc42246598f.jpeg)
将下面代码写入该脚本:
from napalm import get_network_driver driver = get_network_driver('ios') SW1 = driver('192.168.2.11', 'python', '123') SW1.open() SW1.load_merge_candidate(filename='napalm_config.cfg') differences = SW1.compare_config() if len(differences) > 0: print(differences) SW1.commit_config() else: print('No changes needed.') SW1.discard_config()
代码讲解如下:
- 这里我们照例用load_merge_candidate(filename='napalm_config.cfg')加载我们之前创建好的配置文件napalm_config.cfg,然后我们调用NAPALM的compare_config()方法。顾名思义,compare_config()是NAPALM用来将napalm_conig.cfg文件里的配置命令和交换机当前的配置做比对用的,它返回的值(即比对的结果)的数据类型为字符串。这里我们将该比对结果赋值给difference这个变量,然后我们用if语句配合len()函数对比对结果difference做分析,如果len()返回的整数大于0,即说明difference的内容为非空,也就说明配置文件里的命令和交换机当前的配置有区别,我们将比对结果打印出来,然后再调用commit_config()将漏掉的命令补上。反之,如果len()返回的整数为0,说明配置文件里的命令和交换机当前的配置一致,我们打印内容“No changes needed.”提醒用户不需要对交换机配置做任何更改并调用NAPALM的discard_config()方法来放弃之前通过load_merge_candidate(filename='napalm_config.cfg')从配置文件napalm_config.cfg里加载好的配置命令。
接下来执行脚本看效果:
![05b59d154a2cb64b93eba0e13079166a.png](https://i-blog.csdnimg.cn/blog_migrate/9b5fb7a00f186fc1dd8d0ac2e8e47736.jpeg)
注意到三条命令前的三个加号“+”了吗?它是difference这个代表比对内容的变量的具体内容,表示compare_config()方法在将配置文件里的配置命令和交换机现有的配置做比对后,发现交换机里还缺少这三条命令,然后我们通过“SW1.commit_config()”将这三条命令在交换机里补上。下面我们登录交换机来验证:
![9a82ef013aa68d71d92ce30255c722a3.png](https://i-blog.csdnimg.cn/blog_migrate/f00c0062f4f1e36cdddcfed68466209c.jpeg)
可以发现NAPALM将交换机缺少的“login local”、“transport input ssh”、“transport output ssh”这三条命令又补回来了。