「Python 网络自动化」Nornir——初始化 Nornir

程俊健
2023-12-01

Nornir 是一个非常好用的网络自动化的框架,最近我输出了一份 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
 类似资料: