用于获取设备对象实例的启动函数。

pyntc的Python项目详细描述


Build StatusCoverage Status

简介

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
    • 环境变量akaPYNTC_CONF
    • 主目录.ntc.conf
  • 指定设备类型和名称
  • 如果名称是设备的fqdn,则不需要主机
  • 四种支持的设备类型:cisco_nxos_nxapicisco_ios_ssharista_eos_eapijuniper_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_devicentc_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

配置命令

  • 使用configconfig_list
>>> csr1.config('hostname testname')
>>> 
>>> csr1.config_list(['interface Gi3', 'shutdown'])
>>> 

查看运行/启动配置

  • 使用running_configstart_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
>>> 

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java泛型重写抽象方法并具有子类的返回类型   Java中的字符串反转字符,同时保留一些字符   java将系统时间与我获取它的时间进行比较   java解析ODATA URL以在准备entityset之前读取ID值   java中的有界通配符下界泛型即使在传递超类时也不会编译   c#Java的JVM和Java的内部工作方式有什么不同。NET的CLR?   java如何在windows7上指定JDK的版本?   Java:列出单个目录中的所有文件(1020000+)   java使用Logback和Lombok   安卓谷歌玩java。lang.NullPointerException   使用RSA的解密结果在普通Java和Android中有所不同   具有默认连接池的java Spring引导   java我如何在一个坏的测试环境中前进?