初始化 Nornir

初始化 Nornir 对象的方法是使用 InitNornir 函数。

InitNornir 可以使用配置文件、代码或者两者结合起来使用来初始化一个 Nornir 对象。

先从配置文件开始看,下面是一个 Nornir 的配置文件

  1. [1]:
  1. # %load files/config.yaml
  2. ---
  3. inventory:
  4. plugin: SimpleInventory
  5. options:
  6. host_file: "files/inventory/hosts.yaml"
  7. group_file: "files/inventory/groups.yaml"
  8. defaults_file: "files/inventory/defaults.yaml"
  9. runner:
  10. plugin: threaded
  11. options:
  12. num_workers: 100

现在你可以创建一个 Nornir 对象:

  1. [2]:
  1. from nornir import InitNornir
  2. nr = InitNornir(config_file="files/config.yaml")

也可以不用配置文件,通过传参的方式来初始化 Nornir 对象,如下:

  1. [3]:
  1. from nornir import InitNornir
  2. nr = InitNornir(
  3. runner={
  4. "plugin": "threaded",
  5. "options": {
  6. "num_workers": 100,
  7. },
  8. },
  9. inventory={
  10. "plugin": "SimpleInventory",
  11. "options": {
  12. "host_file": "files/inventory/hosts.yaml",
  13. "group_file": "files/inventory/groups.yaml",
  14. },
  15. },
  16. )

或者两种方式混合使用:

  1. [4]:
  1. from nornir import InitNornir
  2. nr = InitNornir(
  3. config_file="files/config.yaml",
  4. runner={
  5. "plugin": "threaded",
  6. "options": {
  7. "num_workers": 100,
  8. },
  9. },
  10. )

Nornir 对象有一个 dict 方法,可以看到 data 和 inventory 相关的信息,执行下面代码可以查看:

  1. [5]:
  1. from pprint import pprint as print
  2. print(nr.dict())
  1. {'data': {'dry_run': False, 'failed_hosts': set()},
  2. 'inventory': {'defaults': {'connection_options': {},
  3. 'data': {'domain': 'netdevops.local'},
  4. 'hostname': None,
  5. 'password': None,
  6. 'platform': None,
  7. 'port': None,
  8. 'username': None},
  9. 'groups': {'bj': {'connection_options': {},
  10. 'data': {},
  11. 'groups': ['north', 'global'],
  12. 'hostname': None,
  13. 'name': 'bj',
  14. 'password': None,
  15. 'platform': None,
  16. 'port': None,
  17. 'username': None},
  18. 'global': {'connection_options': {},
  19. 'data': {'asn': 1,
  20. 'domain': 'global.local'},
  21. 'groups': [],
  22. 'hostname': None,
  23. 'name': 'global',
  24. 'password': None,
  25. 'platform': None,
  26. 'port': None,
  27. 'username': None},
  28. 'gz': {'connection_options': {},
  29. 'data': {'asn': 65000,
  30. 'vlans': {100: 'wired',
  31. 200: 'wireless'}},
  32. 'groups': [],
  33. 'hostname': None,
  34. 'name': 'gz',
  35. 'password': None,
  36. 'platform': None,
  37. 'port': None,
  38. 'username': None},
  39. 'north': {'connection_options': {},
  40. 'data': {'asn': 65100},
  41. 'groups': [],
  42. 'hostname': None,
  43. 'name': 'north',
  44. 'password': None,
  45. 'platform': None,
  46. 'port': None,
  47. 'username': None}},
  48. 'hosts': {'host00': {'connection_options': {},
  49. 'data': {},
  50. 'groups': ['gz', 'bj'],
  51. 'hostname': None,
  52. 'name': 'host00',
  53. 'password': None,
  54. 'platform': None,
  55. 'port': None,
  56. 'username': None},
  57. 'host01': {'connection_options': {},
  58. 'data': {},
  59. 'groups': ['bj', 'gz'],
  60. 'hostname': None,
  61. 'name': 'host01',
  62. 'password': None,
  63. 'platform': None,
  64. 'port': None,
  65. 'username': None},
  66. 'host01.bj': {'connection_options': {},
  67. 'data': {'nested_data': {'a_dict': {'a': 1,
  68. 'b': 2},
  69. 'a_list': [1,
  70. 2],
  71. 'a_string': 'this '
  72. 'is '
  73. 'a '
  74. 'web '
  75. 'server'},
  76. 'role': 'host',
  77. 'site': 'bj',
  78. 'type': 'host'},
  79. 'groups': ['bj'],
  80. 'hostname': '127.0.0.1',
  81. 'name': 'host01.bj',
  82. 'password': 'netdevops',
  83. 'platform': 'linux',
  84. 'port': 2201,
  85. 'username': 'netdevops'},
  86. 'host01.gz': {'connection_options': {},
  87. 'data': {'role': 'host',
  88. 'site': 'gz',
  89. 'type': 'host'},
  90. 'groups': ['gz'],
  91. 'hostname': None,
  92. 'name': 'host01.gz',
  93. 'password': None,
  94. 'platform': 'linux',
  95. 'port': None,
  96. 'username': None},
  97. 'leaf00.bj': {'connection_options': {},
  98. 'data': {'asn': 65100,
  99. 'role': 'leaf',
  100. 'site': 'bj',
  101. 'type': 'network_device'},
  102. 'groups': ['bj'],
  103. 'hostname': '127.0.0.1',
  104. 'name': 'leaf00.bj',
  105. 'password': 'netdevops',
  106. 'platform': 'hp_comware',
  107. 'port': 12443,
  108. 'username': 'netdevops'},
  109. 'leaf01.bj': {'connection_options': {},
  110. 'data': {'asn': 65101,
  111. 'role': 'leaf',
  112. 'site': 'bj',
  113. 'type': 'network_device'},
  114. 'groups': ['bj'],
  115. 'hostname': '127.0.0.1',
  116. 'name': 'leaf01.bj',
  117. 'password': '',
  118. 'platform': 'huawei',
  119. 'port': 12203,
  120. 'username': 'netdevops'},
  121. 'leaf01.gz': {'connection_options': {},
  122. 'data': {'role': 'leaf',
  123. 'site': 'gz',
  124. 'type': 'network_device'},
  125. 'groups': ['gz'],
  126. 'hostname': '127.0.0.1',
  127. 'name': 'leaf01.gz',
  128. 'password': 'netdevops',
  129. 'platform': 'eos',
  130. 'port': 12443,
  131. 'username': 'netdevops'},
  132. 'spine00.bj': {'connection_options': {},
  133. 'data': {'role': 'spine',
  134. 'site': 'bj',
  135. 'type': 'network_device'},
  136. 'groups': ['bj'],
  137. 'hostname': '127.0.0.1',
  138. 'name': 'spine00.bj',
  139. 'password': 'netdevops',
  140. 'platform': 'ios',
  141. 'port': 12444,
  142. 'username': 'netdevops'},
  143. 'spine01.bj': {'connection_options': {},
  144. 'data': {'role': 'spine',
  145. 'site': 'bj',
  146. 'type': 'network_device'},
  147. 'groups': ['bj'],
  148. 'hostname': '127.0.0.1',
  149. 'name': 'spine01.bj',
  150. 'password': '',
  151. 'platform': 'junos',
  152. 'port': 12204,
  153. 'username': 'netdevops'},
  154. 'spine01.gz': {'connection_options': {},
  155. 'data': {'role': 'spine',
  156. 'site': 'gz',
  157. 'type': 'network_device'},
  158. 'groups': ['gz'],
  159. 'hostname': '127.0.0.1',
  160. 'name': 'spine01.gz',
  161. 'password': 'netdevops',
  162. 'platform': 'eos',
  163. 'port': 12444,
  164. 'username': 'netdevops'}}}}

这里看到的是运行时指定的 data 参数和所有的主机信息,配置相关的信息则存储在 config 的 dict 方法里,这里可以看到包括默认配置在内的所有配置:

  1. [6]:
  1. print(nr.config.dict())
  1. {'core': {'raise_on_error': False},
  2. 'inventory': {'options': {'defaults_file': 'files/inventory/defaults.yaml',
  3. 'group_file': 'files/inventory/groups.yaml',
  4. 'host_file': 'files/inventory/hosts.yaml'},
  5. 'plugin': 'SimpleInventory',
  6. 'transform_function': '',
  7. 'transform_function_options': {}},
  8. 'logging': {'enabled': True,
  9. 'format': '%(asctime)s - %(name)12s - %(levelname)8s - '
  10. '%(funcName)10s() - %(message)s',
  11. 'level': 'INFO',
  12. 'log_file': 'nornir.log',
  13. 'loggers': ['nornir'],
  14. 'to_console': False},
  15. 'runner': {'options': {'num_workers': 100}, 'plugin': 'threaded'},
  16. 'ssh': {'config_file': 'C:\\Users\\xdai\\.ssh\\config'},
  17. 'user_defined': {}}

从这两个例子可以看出,Nornir 数据相关的字段都是封装成字典的格式来返回给用户。如果想要取某个部分的值,就可以直接使用字典的方式来取,比如查看配置中的并发数量(注:Nornir 默认的线程池并发是 20):

  1. [7]:
  1. print(nr.config.runner.options["num_workers"])
  1. 100