Nornir – 如何处理与设备的连接

自动方式

默认情况下,连接是自动处理的:

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get

import pprint
nr = InitNornir(config_file="handling_connections/config.yaml")
rtr = nr.filter(name="rtr00")
r = rtr.run(
    task=napalm_get,
    getters=["facts"]
)
pprint.pprint(r["rtr00"][0].result)
{'facts': {'fqdn': 'localhost',
           'hostname': 'localhost',
           'interface_list': ['Ethernet1',
                              'Ethernet2',
                              'Ethernet3',
                              'Ethernet4',
                              'Management1'],
           'model': 'vEOS',
           'os_version': '4.15.5M-3054042.4155M',
           'serial_number': '',
           'uptime': '...',
           'vendor': 'Arista'}}

手动方式

在某些情况下,您可能需要手动管理连接。为此,您可以使用open_connection,close_connection,close_connections和Nornir.close_connections。例如:

def task_manages_connection_manually(task):
    task.host.open_connection("napalm", configuration=task.nornir.config)
    r = task.run(
        task=napalm_get,
        getters=["facts"]
    )
    task.host.close_connection("napalm")

nr = InitNornir(config_file="handling_connections/config.yaml")
rtr = nr.filter(name="rtr00")
r = rtr.run(
    task=task_manages_connection_manually,
)

# this time the result in position 0 is the connection
print(f"Connection succeeded: {not r['rtr00'][0].failed}")
# and the result in position 1 is the result for napalm_get
Connection succeeded: True
{'facts': {'fqdn': 'localhost',
           'hostname': 'localhost',
           'interface_list': ['Ethernet1',
                              'Ethernet2',
                              'Ethernet3',
                              'Ethernet4',
                              'Management1'],
           'model': 'vEOS',
           'os_version': '4.15.5M-3054042.4155M',
           'serial_number': '',
           'uptime': '...',
           'vendor': 'Arista'}}

指定连接参数

使用open_connection时,可以指定所需的任何参数。如果不这样做,或者让nornir自动打开连接,则nornir将从inventory中读取这些参数。如果要在不同的连接上重用它们,则可以在对象级别指定标准属性,也可以为每个连接覆盖它们。例如:

!sed '2,35!d' ../../tests/inventory_data/hosts.yaml
dev1.group_1:
    port: 65020
    hostname: localhost
    username:
    password: a_password
    platform: eos
    data:
        my_var: comes_from_dev1.group_1
        www_server: nginx
        role: www
        nested_data:
            a_dict:
                a: 1
                b: 2
            a_list: [1, 2]
            a_string: asdasd
    groups:
        - group_1
    connection_options:
        paramiko:
            port: 65020
            hostname:
            username: root
            password: docker
            platform: linux
            extras: {}
        dummy:
            hostname: dummy_from_host
            port:
            username:
            password:
            platform:
            extras:
                blah: from_host

觉得文章有用?

点个广告表达一下你的爱意吧 !😁