Ansible用于网络设备管理 part 3 使用NAPALM成品库

时间:2022-02-07 08:58:14

闲话

经过了这俩月的闲暇时间的瞎逛和瞎琢磨,我发现NAPALM是一条路,NAPALM是由帅哥David Barroso和美女Elisa Jasinska创建的一个项目,都是颜值高的技术牛人啊,真是不给别人留活路。话说我是因为在youtube上看CPAL的视频,然后youtube自己推荐我的这个视频,这个视频是来自于NANOG64上的某个片段,我竟然在提问环节看到了Steve Feldman我真是有种“地球村太小了”的感觉,话说老爷子说话一如既往的快,youtube的自动识别根本跟不上。

NAPALM的全称是Network Automation and Programmability Abstraction Layer with Multivendor support,是一个Ansible的成品库,可以通过pip install安装,也可通过git clone或者硬copy之后运行里面的setup.py来安装,还可以很逗逼的通过Pycharm随意写个Python文件,from napalm import "something" 然后等着Pycharm自带的git给你补全你所需要的一大堆依赖关系,对,在我眼里就是一大堆,用Pycharm直接节省时间是个不错的选择,但也因此失去了了解git的机会(作为一个网络工程师)(因此我也常常在想,作为一个网络工程师只懂网络是远远不够的,这也是我放弃追逐下一个CCIE的原因)(Steve Feldman尝试过不靠“版本”直接考CCIE结果折了,所以我也就觉得自己的CCIE来的实在是shameful,想了解些CCIE级别的知识自己敲敲IOU得了),我也记不清中间具体被哪些依赖关系给坑过了,目前回忆起来大概是Python2.7 lxml requests[security] libffi-devel,所以大家有个心理准备就是了。

正片

安装

我用了两种方法:

1. 在OS X 10.9.5上,PyCharm解决一切来安装。安装最新的PyCharm即可。不太推荐,学不到东西。

2. 在CentOS6.7上git clone https://github.com/napalm-automation/napalm.git 之后,'pip install requirements.txt'解决部分依赖关系。

  • 如遇到lxml报错(一般长这样src/lxml/lxml.etree.c:199222: error:),先了解lxml是个啥,然后按照提示安装lxml,我曾经试过pip2.7 install lxml但是依然有etree的问题,所以我就滚去lxml官网一步步来了。如果还进一步遇到“

    cc -I/usr/include/libxml2 -c /tmp/xmlXPathIniti07Gia.c -o tmp/xmlXPathIniti07Gia.o
    /tmp/xmlXPathIniti07Gia.c:1:26: error: libxml/xpath.h: No such file or directory

    ”这种报错,则yum install libxslt-devel libxml2-devel解决

  • 如遇“

    /usr/local/lib/python2.7/site-packages/pip-7.1.2-py2.7.egg/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
    InsecurePlatformWarning

    ”这种报错,先pip install 'requests[security]',如果这个进一步提示你“failed with error code 1 in /tmp/pip-build-v3CWAF/cffi”这种错,先yum install libffi,再pip install 'requests[security]'

遇到的两个最头疼的依赖关系报错就是以上两个了,解决之后就好了。

解决好依赖关系之后就可以python setup.py install了,一切顺利的话就可以python setup.py install了,然后进入Python验证一下是否NAPALM安装成功了

[root@localhost napalm]# python
Python 2.7.7 (default, Dec 5 2015, 09:20:51)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from napalm import get_network_driver
>>> driver = get_network_driver('ios')

验证下小功能

Python 2.7.7 (default, Dec 5 2015, 09:20:51)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from napalm import get_network_driver
>>> driver = get_network_driver('ios')
>>> device = driver('这里填主机名或IP', '这里是15级用户名', '这里是密码')
>>> device.open()
SSH connection established to 主机名或IP:22
Interactive SSH session established
>>>

>>> device.get_facts()
{'os_version': u'12.2(52)SE, RELEASE SOFTWARE (fc3)\nCopyright (c) 1986-2009 by Cisco Systems, Inc.\nCompiled Fri 25-Sep-09 08:49 by sasyamal\nImage text-base: 0x00003000, data-base: 0x01500000\n\nROM: Bootstrap program is C2960 boot loader\nBOOTLDR: C2960 Boot Loader (C2960-HBOOT-M) Version 12.2(44)SE5', 'uptime': u'1 week, 20 hours, 44 minutes', 'interface_list': [u'Vlan1', u'VlanXXX', u'GigabitEthernet0/1', u'GigabitEthernet0/2', u'GigabitEthernet0/3', u'GigabitEthernet0/4', u'GigabitEthernet0/5', u'GigabitEthernet0/6', u'GigabitEthernet0/7', u'GigabitEthernet0/8', u'GigabitEthernet0/9', u'GigabitEthernet0/10', u'GigabitEthernet0/11', u'GigabitEthernet0/12', u'GigabitEthernet0/13', u'GigabitEthernet0/14', u'GigabitEthernet0/15', u'GigabitEthernet0/16', u'GigabitEthernet0/17', u'GigabitEthernet0/18', u'GigabitEthernet0/19', u'GigabitEthernet0/20', u'GigabitEthernet0/21', u'GigabitEthernet0/22', u'GigabitEthernet0/23', u'GigabitEthernet0/24', u'GigabitEthernet0/25', u'GigabitEthernet0/26', u'GigabitEthernet0/27', u'GigabitEthernet0/28', u'GigabitEthernet0/29', u'GigabitEthernet0/30', u'GigabitEthernet0/31', u'GigabitEthernet0/32', u'GigabitEthernet0/33', u'GigabitEthernet0/34', u'GigabitEthernet0/35', u'GigabitEthernet0/36', u'GigabitEthernet0/37', u'GigabitEthernet0/38', u'GigabitEthernet0/39', u'GigabitEthernet0/40', u'GigabitEthernet0/41', u'GigabitEthernet0/42', u'GigabitEthernet0/43', u'GigabitEthernet0/44', u'GigabitEthernet0/45', u'GigabitEthernet0/46', u'GigabitEthernet0/47', u'GigabitEthernet0/48', u'Port-channel1', u'Port-channel2', u'Port-channel3'], 'vendor': u'Cisco', 'serial_number': u'N/A', 'model': -1, 'hostname': u'XXXXXXXXXXXXX', 'fqdn': u'N/A'}

#可以看到这是个IOS哦,IOS哦!最不API的IOS哦

>>> device.load_merge_candidate(config='interface gi 0/8\ndes testNAPALM')   #随便找了个端口写了下description做个测试吧
>>> device.compare_config()
+ interface gi 0/8
+ des testNAPALM
>>> device.commit_config()
>>> device.compare_config()
+ des testNAPALM
+ interface gi 0/8
+

+ do copy run start
>>> device.rollback()

#以上改gi0/8下的description的时候,我去真实机器上看了,的确work,rollback功能也是成功的,viva NAPALM!

(当然还是觉得我们自己的Playground屌屌哒,毕竟Playground是那么多年前的产品,那个时候还没有netmiko作支撑,现在还在服役,而且有图形界面,集成AD做AAA,所以也向orange team致敬!)

接下来打算拿NAPALM开始搞Python写点小东西,期间估计要参考一些实例,努力去搜集一些先。如果能集成到图形界面并且集成AD做个AAA,那么就没什么遗憾了。简直终极目标了。