Nornir文档翻译----第一节 主机清单

Inventory

Inventory是nornir非常的重要的组件,Inventory由三部分组成hosts、groups、defaults
hosts.yaml

---
host1.cmh:
    hostname: 127.0.0.1
    port: 2201
    username: vagrant
    password: vagrant
    platform: linux
    groups:
        - cmh
    data:
        site: cmh
        role: host
        type: host
        nested_data:
            a_dict:
                a: 1
                b: 2
            a_list: [1, 2]
            a_string: "asdasd"

host2.cmh:
    hostname: 127.0.0.1
    port: 2202
    username: vagrant
    password: vagrant
    platform: linux
    groups:
        - cmh
    data:
        site: cmh
        role: host
        type: host
        nested_data:
            a_dict:
                b: 2
                c: 3
            a_list: [1, 2]
            a_string: "qwe"

spine00.cmh:
    hostname: 127.0.0.1
    username: vagrant
    password: vagrant
    port: 12444
    platform: eos
    groups:
        - cmh
    data:
        site: cmh
        role: spine
        type: network_device

spine01.cmh:
    hostname: 127.0.0.1
    username: vagrant
    password: ""
    platform: junos
    port: 12204
    groups:
        - cmh
    data:
        site: cmh
        role: spine
        type: network_device

leaf00.cmh:
    hostname: 127.0.0.1
    username: vagrant
    password: vagrant
    port: 12443
    platform: eos
    groups:
        - cmh
    data:
        site: cmh
        role: leaf
        type: network_device
        asn: 65100

leaf01.cmh:
    hostname: 127.0.0.1
    username: vagrant
    password: ""
    port: 12203
    platform: junos
    groups:
        - cmh
    data:
        site: cmh
        role: leaf
        type: network_device
        asn: 65101

host1.bma:
    groups:
        - bma
    platform: linux
    data:
        site: bma
        role: host
        type: host

host2.bma:
    groups:
        - bma
    platform: linux
    data:
        site: bma
        role: host
        type: host

spine00.bma:
    hostname: 127.0.0.1
    username: vagrant
    password: vagrant
    port: 12444
    platform: eos
    groups:
        - bma
    data:
        site: bma
        role: spine
        type: network_device

spine01.bma:
    hostname: 127.0.0.1
    username: vagrant
    password: ""
    port: 12204
    platform: junos
    groups:
        - bma
    data:
        site: bma
        role: spine
        type: network_device

leaf00.bma:
    hostname: 127.0.0.1
    username: vagrant
    password: vagrant
    port: 12443
    platform: eos
    groups:
        - bma
    data:
        site: bma
        role: leaf
        type: network_device

leaf01.bma:
    hostname: 127.0.0.1
    username: vagrant
    password: wrong_password
    port: 12203
    platform: junos
    groups:
        - bma
    data:
        site: bma
        role: leaf
        type: network_device

groups.yaml

---
global:
    data:
        domain: global.local
        asn: 1

eu:
    data:
        asn: 65100

bma:
    groups:
        - eu
        - global

cmh:
    data:
        asn: 65000
        vlans:
          100: frontend
          200: backend

可以通过Host对象来查看简要格式

from nornir.core.inventory import Host
import json
print(json.dumps(Host.schema(), indent=4))

输出:
{
    "name": "str",
    "connection_options": {
        "$connection_type": {
            "extras": {
                "$key": "$value"
            },
            "hostname": "str",
            "port": "int",
            "username": "str",
            "password": "str",
            "platform": "str"
        }
    },
    "groups": [
        "$group_name"
    ],
    "data": {
        "$key": "$value"
    },
    "hostname": "str",
    "port": "int",
    "username": "str",
    "password": "str",
    "platform": "str"
}

groups.yaml和host基本保持一样的格式

访问Iventory

可以通过inventory属性来访问:

from nornir import InitNornir
nr = InitNornir(config_file="config.yaml")
print(nr.inventory.hosts)

输出:
{'host1.cmh': Host: host1.cmh, 
'host2.cmh': Host: host2.cmh, 
'spine00.cmh': Host: spine00.cmh,
 'spine01.cmh': Host: spine01.cmh,
 'leaf00.cmh': Host: leaf00.cmh, 
'leaf01.cmh': Host: leaf01.cmh, 
'host1.bma': Host: host1.bma, 
'host2.bma': Host: host2.bma, 
'spine00.bma': Host: spine00.bma,
 'spine01.bma': Host: spine01.bma,
 'leaf00.bma': Host: leaf00.bma, 
'leaf01.bma': Host: leaf01.bma}

inventory有两个类似字典的属性,hosts和groups,可以用相同的方式来访问host和groups

print(nr.inventory.groups)

输出:
{'global': Group: global,
 'eu': Group: eu,
 'bma': Group: bma, 
'cmh': Group: cmh}

Hosts和groups同样是类似字典格式的对象:

host = nr.inventory.hosts['host1.cmh']
print(host.keys())
print(host['asn'])

输出:
dict_keys(['site', 'role', 'type', 'nested_data', 'asn', 'vlans', 'domain'])
65000

继承模块

下面我们举例看下继承模块是如何工作的,我们再看下goups文件:

---
global:
    data:
        domain: global.local
        asn: 1

eu:
    data:
        asn: 65100

bma:
    groups:
        - eu
        - global

cmh:
    data:
        asn: 65000
        vlans:
          100: frontend
          200: backend

leaf01.bma属于bma组,并且bma又属于eu和global. spine00.cmh属于cmh,但是cmh并不属于其他人组

数据解析是通过递归迭代出所有的父组中的数据,查看是否包含data这个字段。例如:

leaf01_bma = nr.inventory.hosts["leaf01.bma"]
leaf01_bma["domain"]  # 来自global组

输出:
'global.local'

leaf01_bma["asn"]  # 来自eu组
输出:
65100

如果你不想通过迭代的方式去获取数据,那可以使用data这个属性来获取数据。
可以通过keys()来看下data属性的key值,没有继承groups和defaults中的数据。

print(leaf01_cmh.data.keys())
print(leaf01_cmh.data["domain"])

输出:
dict_keys(['site', 'role', 'type', 'asn'])
Traceback (most recent call last):
  File "/mnt/c/Users/BlessLiu/Project/nornir_learn2/learn_inventory.py", line 23, in <module>
    print(leaf01_cmh.data["domain"])
KeyError: 'domain'

筛选inventory

我们已经看到了通过nr.inventory.hosts和nr.inventory.groups像是字典对象,我们可以直接迭代出hosts和groups中的所有的一个属性。

现在我们可以看下如果通过一些有趣的筛选基于他们的属性来做一些操作。

  • 最简单的筛选使用过key, value对来进行,例如:
print(nr.filter(site="cmh").inventory.hosts.keys())

输出:
dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh'])
  • 你可以设置多个key,value对:
print(nr.filter(site="cmh",role="spine").inventory.hosts.keys())

输出:
dict_keys(['spine00.cmh', 'spine01.cmh'])
  • 可以叠加:
nr.filter(site="cmh").filter(role="spine").inventory.hosts.keys()

输出:
dict_keys(['spine00.cmh', 'spine01.cmh'])
  • 可以通过筛选出属于一个group的host:
print(nr.inventory.children_of_group('bma'))

输出:
{Host: spine00.bma, Host: leaf01.bma, Host: spine01.bma, Host: host1.bma, Host: leaf00.bma, Host: host2.bma}

高级筛选

有时候你需要一些高级筛选。对于这些情况你有两个选择:

  1. 使用一个筛选函数。
  2. 使用一个筛选对象。

筛选函数

    filter_func参数可以让你运行自己的代码去筛选hosts,函数名就像my_func(host)一样简单,host是Host类型的一个对象,并且
这个函数必须返回True或者False以标识是否需要这个host。

def has_long_name(host):
    return len(host.name) == 11

print(nr.filter(filter_func=has_long_name).inventory.hosts.keys())

筛选对象

  你可以通过筛选对象来逐渐地创建一个复杂的筛选。我们看下它是怎么工作的:

#引入F对象
from nornir.core.filter import F

#在cmh中的host
cmh = nr.filter(F(groups__contains="cmh"))
print(cmh.inventory.hosts.keys())

输出:
dict_keys(['host1.cmh', 'host2.cmh', 'spine00.cmh', 'spine01.cmh', 'leaf00.cmh', 'leaf01.cmh'])

#在cmh的spines
cmh_and_spine = nr.filter(F(groups__contains="cmh") & F(role="spine"))
print(cmh_and_spine.inventory.hosts.keys())

输出:
dict_keys(['spine00.cmh', 'spine01.cmh'])

#在cmh但不是spines的host
cmh_and_not_spine = nr.filter(F(groups__contains="cmh") & ~F(role="spine"))
print(cmh_and_not_spine.inventory.hosts.keys())

输出:
dict_keys(['host1.cmh', 'host2.cmh', 'leaf00.cmh', 'leaf01.cmh'])

  你还可以访问嵌套在内部的数据,甚至dicts/lists/strings包含的元素。同样我们来几个例子:

nested_string_asd = nr.filter(F(nested_data__a_string__contains="asd"))
print(nested_string_asd.inventory.hosts.keys())'

输出:
dict_keys(['host1.cmh'])

a_dict_element_equals = nr.filter(F(nested_data__a_dict__c=3))
print(a_dict_element_equals.inventory.hosts.keys())

输出:
dict_keys(['host2.cmh'])

a_list_contains = nr.filter(F(nested_data__a_list__contains=2))
print(a_list_contains.inventory.hosts.keys())

输出:
dict_keys(['host1.cmh', 'host2.cmh'])

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 1)安装2)常用模块3)inventory4)playbook(role\tag\template)5) yaml...
    秦记阅读 4,146评论 2 5
  • ###### Ansible总结 ##### 运维工作: 系统安装(物理机、虚拟机)-->程序包安装、配置、服务启...
    二郎5阅读 2,021评论 0 4
  • ansible官方网站[https://docs.ansible.com]安装部署软件ansibleyum ins...
    八比特阅读 399评论 0 0
  • Ansible 认识 andsible 最早是 厄休拉*勒古恩 在 1966 年的小说 《罗卡农的星球》中创造了 ...
    Lengfin阅读 838评论 0 0