Nornir 是一个非常好用的网络自动化的框架,最近我输出了一份 Nornir 中文手册,欢迎大家阅读指正。
初始化 Nornir 对象的方法是使用 InitNornir
函数。
InitNornir
可以使用配置文件、代码或者两者结合起来使用来初始化一个 Nornir 对象。
先从配置文件开始看,下面是一个 Nornir 的配置文件。
# %load files/config.yaml
---
inventory:
plugin: SimpleInventory
options:
host_file: "files/inventory/hosts.yaml"
group_file: "files/inventory/groups.yaml"
defaults_file: "files/inventory/defaults.yaml"
runner:
plugin: threaded
options:
num_workers: 100
现在你可以创建一个 Nornir 对象:
from nornir import InitNornir
nr = InitNornir(config_file="files/config.yaml")
也可以不用配置文件,通过传参的方式来初始化 Nornir 对象,如下:
from nornir import InitNornir
nr = InitNornir(
runner={
"plugin": "threaded",
"options": {
"num_workers": 100,
},
},
inventory={
"plugin": "SimpleInventory",
"options": {
"host_file": "files/inventory/hosts.yaml",
"group_file": "files/inventory/groups.yaml",
},
},
)
或者两种方式混合使用:
from nornir import InitNornir
nr = InitNornir(
config_file="files/config.yaml",
runner={
"plugin": "threaded",
"options": {
"num_workers": 100,
},
},
)
Nornir 对象有一个 dict
方法,可以看到 data 和 inventory 相关的信息,执行下面代码可以查看:
from pprint import pprint as print
print(nr.dict())
{'data': {'dry_run': False, 'failed_hosts': set()},
'inventory': {'defaults': {'connection_options': {},
'data': {'domain': 'netdevops.local'},
'hostname': None,
'password': None,
'platform': None,
'port': None,
'username': None},
'groups': {'bj': {'connection_options': {},
'data': {},
'groups': ['north', 'global'],
'hostname': None,
'name': 'bj',
'password': None,
'platform': None,
'port': None,
'username': None},
'global': {'connection_options': {},
'data': {'asn': 1,
'domain': 'global.local'},
'groups': [],
'hostname': None,
'name': 'global',
'password': None,
'platform': None,
'port': None,
'username': None},
'gz': {'connection_options': {},
'data': {'asn': 65000,
'vlans': {100: 'wired',
200: 'wireless'}},
'groups': [],
'hostname': None,
'name': 'gz',
'password': None,
'platform': None,
'port': None,
'username': None},
'north': {'connection_options': {},
'data': {'asn': 65100},
'groups': [],
'hostname': None,
'name': 'north',
'password': None,
'platform': None,
'port': None,
'username': None}},
'hosts': {'host00': {'connection_options': {},
'data': {},
'groups': ['gz', 'bj'],
'hostname': None,
'name': 'host00',
'password': None,
'platform': None,
'port': None,
'username': None},
'host01': {'connection_options': {},
'data': {},
'groups': ['bj', 'gz'],
'hostname': None,
'name': 'host01',
'password': None,
'platform': None,
'port': None,
'username': None},
'host01.bj': {'connection_options': {},
'data': {'nested_data': {'a_dict': {'a': 1,
'b': 2},
'a_list': [1,
2],
'a_string': 'this '
'is '
'a '
'web '
'server'},
'role': 'host',
'site': 'bj',
'type': 'host'},
'groups': ['bj'],
'hostname': '127.0.0.1',
'name': 'host01.bj',
'password': 'netdevops',
'platform': 'linux',
'port': 2201,
'username': 'netdevops'},
'host01.gz': {'connection_options': {},
'data': {'role': 'host',
'site': 'gz',
'type': 'host'},
'groups': ['gz'],
'hostname': None,
'name': 'host01.gz',
'password': None,
'platform': 'linux',
'port': None,
'username': None},
'leaf00.bj': {'connection_options': {},
'data': {'asn': 65100,
'role': 'leaf',
'site': 'bj',
'type': 'network_device'},
'groups': ['bj'],
'hostname': '127.0.0.1',
'name': 'leaf00.bj',
'password': 'netdevops',
'platform': 'hp_comware',
'port': 12443,
'username': 'netdevops'},
'leaf01.bj': {'connection_options': {},
'data': {'asn': 65101,
'role': 'leaf',
'site': 'bj',
'type': 'network_device'},
'groups': ['bj'],
'hostname': '127.0.0.1',
'name': 'leaf01.bj',
'password': '',
'platform': 'huawei',
'port': 12203,
'username': 'netdevops'},
'leaf01.gz': {'connection_options': {},
'data': {'role': 'leaf',
'site': 'gz',
'type': 'network_device'},
'groups': ['gz'],
'hostname': '127.0.0.1',
'name': 'leaf01.gz',
'password': 'netdevops',
'platform': 'eos',
'port': 12443,
'username': 'netdevops'},
'spine00.bj': {'connection_options': {},
'data': {'role': 'spine',
'site': 'bj',
'type': 'network_device'},
'groups': ['bj'],
'hostname': '127.0.0.1',
'name': 'spine00.bj',
'password': 'netdevops',
'platform': 'ios',
'port': 12444,
'username': 'netdevops'},
'spine01.bj': {'connection_options': {},
'data': {'role': 'spine',
'site': 'bj',
'type': 'network_device'},
'groups': ['bj'],
'hostname': '127.0.0.1',
'name': 'spine01.bj',
'password': '',
'platform': 'junos',
'port': 12204,
'username': 'netdevops'},
'spine01.gz': {'connection_options': {},
'data': {'role': 'spine',
'site': 'gz',
'type': 'network_device'},
'groups': ['gz'],
'hostname': '127.0.0.1',
'name': 'spine01.gz',
'password': 'netdevops',
'platform': 'eos',
'port': 12444,
'username': 'netdevops'}}}}
这里看到的是运行时指定的 data 参数和所有的主机信息,配置相关的信息则存储在 config 的 dict
方法里,这里可以看到包括默认配置在内的所有配置:
print(nr.config.dict())
{'core': {'raise_on_error': False},
'inventory': {'options': {'defaults_file': 'files/inventory/defaults.yaml',
'group_file': 'files/inventory/groups.yaml',
'host_file': 'files/inventory/hosts.yaml'},
'plugin': 'SimpleInventory',
'transform_function': '',
'transform_function_options': {}},
'logging': {'enabled': True,
'format': '%(asctime)s - %(name)12s - %(levelname)8s - '
'%(funcName)10s() - %(message)s',
'level': 'INFO',
'log_file': 'nornir.log',
'loggers': ['nornir'],
'to_console': False},
'runner': {'options': {'num_workers': 100}, 'plugin': 'threaded'},
'ssh': {'config_file': 'C:\\Users\\xdai\\.ssh\\config'},
'user_defined': {}}
从这两个例子可以看出,Nornir 数据相关的字段都是封装成字典的格式来返回给用户。如果想要取某个部分的值,就可以直接使用字典的方式来取,比如查看配置中的并发数量(注:Nornir 默认的线程池并发是 20):
print(nr.config.runner.options["num_workers"])
100