处理设备连接

自动处理

默认情况下,Nornir 会自动处理设备的连接。这里指的意思是 Nornir 会自动连接到设备,执行完成任务后再退出设备。

  1. [1]:
  1. from nornir import InitNornir
  2. from nornir_utils.plugins.functions import print_result
  3. from nornir_napalm.plugins.tasks import napalm_get
  1. [2]:
  1. nr = InitNornir(config_file="handling_connections/config.yaml")
  2. r1 = nr.filter(name="rt01")
  3. r = r1.run(
  4. task=napalm_get,
  5. getters=["facts"]
  6. )
  1. [3]:
  1. print_result(r)
  1. napalm_get**********************************************************************
  2. * rt01 ** changed : False ******************************************************
  3. vvvv napalm_get ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
  4. { 'facts': { 'fqdn': 'Unknown',
  5. 'hostname': 'R1',
  6. 'interface_list': [],
  7. 'model': 'Unknown',
  8. 'os_version': 'Unknown',
  9. 'serial_number': [],
  10. 'uptime': -1,
  11. 'vendor': 'Huawei'}}
  12. ^^^^ END napalm_get ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

手动处理

在某些情况下,可能需要手动管理设备的连接,让用户来决定什么时候连接到设备上,什么时候和设备断开连接。

这时候可以使用 open_connectionclose_connectionclose_connectionsNornir.close_connections 这几个方法来实现:

  1. [4]:
  1. def task_manages_connection_manually(task):
  2. print(f"开始连接:{task.host.name}")
  3. task.host.open_connection("napalm", configuration=task.nornir.config)
  4. r = task.run(
  5. task=napalm_get,
  6. getters=["facts"]
  7. )
  8. print(f"连接成功: {not r[0].failed}")
  9. task.host.close_connection("napalm")
  10. nr = InitNornir(config_file="handling_connections/config.yaml")
  11. rtr = nr.filter(name="rt01")
  12. r = rtr.run(
  13. task=task_manages_connection_manually,
  14. )
  1. 开始连接:rt01
  2. 连接成功: True
  1. [5]:
  1. print_result(r)
  1. task_manages_connection_manually************************************************
  2. * rt01 ** changed : False ******************************************************
  3. vvvv task_manages_connection_manually ** changed : False vvvvvvvvvvvvvvvvvvvvvvv INFO
  4. ---- napalm_get ** changed : False --------------------------------------------- INFO
  5. { 'facts': { 'fqdn': 'Unknown',
  6. 'hostname': 'R1',
  7. 'interface_list': [],
  8. 'model': 'Unknown',
  9. 'os_version': 'Unknown',
  10. 'serial_number': [],
  11. 'uptime': -1,
  12. 'vendor': 'Huawei'}}
  13. ^^^^ END task_manages_connection_manually ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

指定连接参数

使用 open_connection 时,可以指定所需要的任何参数,如果没有指定或者如果让 nornir 自动打开设备连接,nornir 将会从主机清单中读取这些连接参数。

在主机清单中的 connection_options 中指定设备的连接方式,然后在 extras -> optional_args 中添加连接插件的额外参数,连接参数通常是下面这种格式:

  1. [6]:
  1. # %load handling_connections/inventory/test-hosts.yaml
  2. dev1.group_1:
  3. port: 22
  4. hostname: 192.168.56.20
  5. username: username
  6. password: password
  7. platform: ios
  8. connection_options:
  9. netmiko:
  10. port: 22
  11. hostname:
  12. username: user
  13. password: pass
  14. platform: ios
  15. extras:
  16. optional_args:
  17. secret: secret
  18. session_log: path/to/save_log
  19. napalm:
  20. platform: ios
  21. extras:
  22. optional_args:
  23. path: path/to/save_log
  24. dummy:
  25. hostname: dummy_from_host
  26. port:
  27. username:
  28. password:
  29. platform:
  30. extras:
  31. blah: from_host