注:本文作者是 Patrick Ogenstad,原文是 Gathering Ansible facts from network devices using SNMP
注:这篇博客里面的文章大部分是关于网络的,所以网络工程师多看看可以。SA 有时候也会协助网络工程师处理收集网络硬件的信息,所以也是需要的。
注:我只捡重要的说,详细看强力推荐原文。
一个 Ansible SNMP 模块
当我们需要管理网络硬件的时候,但是大部分的网络硬件是不支持安装客户端或者是允许 Python 脚本的,所以我们就需要使用 SNMP 来收集网络硬件的信息。本文就是讲解结合 Ansible 来采集网络硬件的信息,作者自己使用 Python 写了一个 SNMP 的采集模块。
下面是两个你可以在一个 playbook 中设置的任务的例子:
# Gather facts with SNMP version 2
- snmp_facts: host={{ inventory_hostname }} version=2c community=public
Gather facts using SNMP version 3
- snmp_facts:
host={{ inventory_hostname }}
version=v3
level=authPriv
integrity=sha
privacy=aes
username=snmp-user
authkey=abc12345
privkey=def6789
该模块要求 pysnmp
安装在你的 Ansible 服务器上。为了使用这个模块你可以添加它的目录到 $ANSIBLE_LIBRARY
变量,或者是为这个模块在当前的 library 目录创建一个子目录,通常是 /usr/share/ansible
。
使用这些 facts
你或许会想:“这实际没有做任何事情!”这是正确的。这个模块是一个收集模块,并且仅仅从你的网络硬件收集信息。其他模块将被需要利用这些使用 snmp_facts
收集的信息。比如你可以在 playbooks 中使用这些 facts 与 Jason Edelman 已经做的工具一起工作。另外一个选择就是同 Ansible 模块系统一起使用这些信息,为了构建和修改配置文件。
如果你使用 ansible / ansible-playbook
的详细选项 -v
,你将看到从每台主机采集到的信息。
什么能被采集
在该模块的第一版本我采集了:
- sysDescr – System Description
- sysObjectId – System Object ID, uniquely identifies the device class
- sysUpTime – Basic counter (just in seconds in this version)
- sysContact – SNMP Contact
- sysName – System Name
- sysLocation – SNMP Location
- All IPv4 addresses
- Interfaces – Name, Description, Speed, Physical address, admin and operational status
snmp_facts 的未来计划
有很多东西可以通过 SNMP 采集到 Ansible facts。仅举几件事情,我们有 CDP 或 LLDP 的邻居信息,路由表,NAT 设置,OSPF 邻居,IPv6 地址,mac 地址表,VRF 信息等等。因为对于每个硬件类型来说 sysobjectid 是唯一的,未来的一个选项可能就是首先运行一个集合仅仅只获取基本的信息,然后在一个 playbook 通过一个查找函数传递 sysobjectid 给 Jinja 模板,为了取回设备类别。这样将有可能运行其他集合,但只针对特定设备。比如你想对你所有的交换机来使用这个收集 LLDP 信息,但是你有一些 Cisco 交换机和一些华为交换机。问题就是华为不使用开放的 LLDP-MIB,但是使用 HUAWEI-LLDP-MIB 代替。假设对于 lldp 我们有一个模块选项,它通过 true/false/huawei 选项来确定是否是华为设备。这里你可以手工的组织你的在两个组和两个任务。或者你可以第一次运行一个收集任务来获取 sysobjectid,做一个查询来获取设备类别。设备类别将被注册到一个变量,你可以在以下的任务中动态使用。
该模块的 github。
有需求的可以通过 fork 他这个模块然后根据自己的业务需求来改动,会 Python 和 Ansible 就行。
比如我们可以通过这个模块然后格式化下数据存进数据库,然后定时取出来信息对比,同时版本库管理问题,当你做一个网络变更的时候,可以新旧版本对比,看自己变更了哪些东西,如果出错回滚也方便,一键回滚。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。