用于获取设备对象实例的启动函数。
pyntc的Python项目详细描述
简介
pyntc是一个开源的多供应商python库,它为使用不同的网络api和设备类型(包括ios设备)建立了一个通用框架
其主要目的是简化常见任务的执行,包括:
- 执行命令
- 复制文件
- 升级设备
- 重新启动设备
- 保存/备份配置
支持的平台
- Cisco IOS平台-使用ssh(netmiko)
- Cisco NX-OS-使用PynxOS(NX-API)
- arista eos-使用pyeapi(eapi)
- juniper junos-使用pyez(netconf)
它是一个多供应商和多api库。
安装PYNTC
选项1:
"sudo pip install pyntc" or "sudo pip install pyntc --upgrade"
选项2:
git clone https://github.com/networktocode/pyntc.git
cd pyntc
sudo python setup.py install
PYNTC入门
开始使用pyntc有两种方法。
第一种方法是使用ntc_device
对象。只需将所有必需的参数传递给对象即可初始化设备。在这里,我们将显示导入,但将对象重命名为NTC
。
>>> from pyntc import ntc_device as NTC
>>>
像许多库一样,我们需要传入主机/ip和凭据。因为这是一个多供应商/api库,所以我们还使用device_type
参数来标识我们正在构建哪个设备的实例。
PYNTC目前支持四种设备类型:
- 思科iOS ssh
- 思科NXOS NXAPI
- Arista_eos_eapi
- juniper_junos_netconf
下面的示例演示如何在使用Cisco IOS路由器时构建设备对象。
>>> # CREATE DEVICE OBJECT FOR AN IOS DEVICE
>>>
>>> csr1 = NTC(host='csr1', username='ntc', password='ntc123', device_type='cisco_ios_ssh')
>>>
下面是Cisco Nexus设备的对象:
>>> # CREATE DEVICE OBJECT FOR A NEXUS DEVICE
>>>
>>> nxs1 = NTC(host='nxos-spine1', username='ntc', password='ntc123', device_type='cisco_nxos_nxapi')
>>>
开始使用pyntc的第二种方法是使用pyntc配置文件。这是以arista的.eapi.conf
文件为模型的。我们的文件名为.ntc.conf
这简化了设备对象的创建,因为在构建设备对象时不再需要指定凭据和其他设备特定的参数。相反,它们存储在conf文件中。
PYNTC配置文件
- 文件名:
.ntc.conf
- 查找conf文件的优先级:
filename
参数在ntc_device_by_name
- 环境变量aka
PYNTC_CONF
- 主目录
.ntc.conf
- 指定设备类型和名称
- 如果名称是设备的fqdn,则不需要主机
- 四种支持的设备类型:
cisco_nxos_nxapi
、cisco_ios_ssh
、arista_eos_eapi
和juniper_junos_netconf
下面是一个示例.ntc.conf
文件:
[cisco_nxos_nxapi:nxos-spine1] host: 31.220.64.117 username: ntc password: ntc123 transport: http [cisco_ios_ssh:csr1] host: 176.126.88.94 username: ntc password: ntc123 port: 22[juniper_junos_netconf:vmx1] host: 176.126.88.99 username: ntc password: ntc123
我们现在可以通过从conf文件中引用设备的名称来构建设备对象。
>>> from pyntc import ntc_device_by_name as NTCNAME
>>>
>>> csr1 = NTCNAME('csr1')
>>>
>>> nxs1 = NTCNAME('nxos-spine1')
>>>
>>> vmx1 = NTCNAME('vmx1')
一旦使用ntc_device
或ntc_device_by_name
创建设备对象,就可以开始使用pyntc中的内置设备方法。
注意:所有设备上不支持的唯一方法和属性是install_os
。juniper junos设备不支持此功能。
收集事实
- 使用
facts
设备属性
在Nexus设备上:
>>> nxs1 = NTCNAME('nxos-spine1')
>>>
>>> nxs1.facts
{'vendor': 'cisco', 'interfaces': [], u'hostname': 'nxos-spine1', u'os_version': '7.1(0)D1(1) [build 7.2(0)ZD(0.17)]', u'serial_number': 'TM600C2833B', u'model': 'NX-OSv Chassis', 'vlans': ['1']}
>>>
>>> print(json.dumps(nxs1.facts, indent=4))
{
"vendor": "cisco",
"interfaces": [],
"hostname": "nxos-spine1",
"os_version": "7.1(0)D1(1) [build 7.2(0)ZD(0.17)]",
"serial_number": "TM600C2833B",
"model": "NX-OSv Chassis",
"vlans": [
"1"
]
}
在iOS设备上:
>>> csr1 = NTCNAME('csr1')
>>>
>>> print(json.dumps(csr1.facts, indent=4))
{
"uptime": 87060,
"vendor": "cisco",
"uptime_string": "01:00:11:00",
"interfaces": [
"GigabitEthernet1",
"GigabitEthernet2",
"GigabitEthernet3",
"GigabitEthernet4",
"Loopback100"
],
"hostname": "csr1",
"ios": {
"config_register": "0x2102"
},
"fqdn": "N/A",
"os_version": "15.5(1)S1",
"serial_number": "",
"model": "CSR1000V",
"vlans": []
}
发送显示命令
show
方法- 注意:默认情况下,启用api的设备返回json
>>> nxs1.show('show hostname')
{'hostname': 'nxos-spine1'}
>>>
- 使用
raw_text=True
从设备获取非结构化数据
>>> nxs1.show('show hostname', raw_text=True)
'nxos-spine1 \n'
>>>
发送多个命令
show_list
方法
>>> cmds = ['show hostname', 'show run int Eth2/1']
>>> data = nxs1.show_list(cmds, raw_text=True)
>>> for d in data:
... print(d)
...
nxos-spine1
!Command: show running-config interface Ethernet2/1
!Time: Wed Jan 6 18:10:01 2016
version 7.1(0)D1(1)
interface Ethernet2/1
switchport
no shutdown
配置命令
- 使用
config
和config_list
>>> csr1.config('hostname testname')
>>>
>>> csr1.config_list(['interface Gi3', 'shutdown'])
>>>
查看运行/启动配置
- 使用
running_config
和start_up
设备属性- 仅显示部分配置(本幻灯片手动缩短)
>>> run = csr1.running_config
>>>
>>> print(run)
Building configuration...
Current configuration : 2062 bytes
!
! Last configuration change at 18:26:59 UTC Wed Jan 6 2016 by ntc
!
version 15.5
service timestamps debug datetime msec
lldp run
cdp run
!
ip scp server enable
!
interface GigabitEthernet1
ip address 10.0.0.50 255.255.255.0
cdp enable
复制文件
file_copy
方法
>>> devices = [csr1, nxs1]
>>>
>>> for device in devices:
... device.file_copy('newconfig.cfg')
...
>>>
保存配置
save
方法
copy run start
对于Cisco/Arista和commit
对于Juniper
>>> csr1.save()
True
还可以通过指定文件名来执行copy running-config <filename>
的等效操作:
>>> csr1.save('mynewconfig.cfg')
True
备份配置
备份当前运行配置并将其存储在本地
>>> csr1.backup_running_config('csr1.cfg')
>>>
重新启动
重新启动目标设备
参数:
timer=0
默认情况下confirm=False
默认情况下
>>> csr1.reboot(confirm=True)
>>>
安装操作系统
>>> device.install_os('nxos.7.0.3.I2.1.bin')
>>>
完整工作流示例:
>>> device.file_copy('nxos.7.0.3.I2.1.bin')
>>> device.install_os('nxos.7.0.3.I2.1.bin')
>>> device.save()
>>> device.reboot() # IF NEEDED, NXOS automatically reboots
>>>