Nornir文档翻译----第三节 结果处理

Processing results

在这个教程中我们将看下我们是如何处理tasks处理的结果的。
我们从这个我们已经见过的代码中去看下:


import logging

from nornir import InitNornir
from nornir.core.task import Task, Result

nr = InitNornir(config_file="config.yaml")
cmh = nr.filter(site="cmh",type="host")

def count(task: Task, number: int) -> Result:
    return Result(
        host=task.host,
        result=f"{[n for n in range(0,number)]}"
    )

def say(task: Task, text: str) -> Result:
    if task.host.name == "host2.cmh":
        raise Exception("I can't say anything right now")
    return Result(
        host=task.host,
        result=f"{task.host.name} says {text}"
    )

目前为止没有新代码出现,我们在say任务中写了一个错误提醒,来帮我们说明一些概念。
下面我们写一个我们上节见过的比较复杂的task。

def greet_and_count(task: Task, number: int):
    task.run(
        name="Greeting is the polite thing to do",
        severity_level=logging.DEBUG,
        task=say,
        text="hi!",
    )

    task.run(
        name="Counting beans",
        task=count,
        number=number,
    )
    task.run(
        name="We should say bye too",
        severity_level=logging.DEBUG,
        task=say,
        text="bye!",
    )

    # let's inform if we counted even or odd times
    even_or_odds = "even" if number % 2 == 1 else "odd"
    return Result(
        host=task.host,
        result=f"{task.host} counted {even_or_odds} times!",
    )

它和之前的task调用有些区别,我们把severity_level=logging.DEBUG传递给了第一个和最后一个子task。
我们稍后看下会发生什么。

现在,我们可以调用这个task组,然后我们可以检查result对象:

result = cmh.run(
    task=greet_and_count,
    number=5,
)

简单方式

大多时候你只是想通过回显看到发生了什么。对于这个你只需要用nornir_utils中的print_result函数就行。

from nornir_utils.plugins.functions import print_result
print_result(result,severity_level=logging.DEBUG)

输出:
greet_and_count*****************************************************************
* host1.cmh ** changed : False *************************************************
vvvv greet_and_count ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
host1.cmh counted even times!
---- Counting beans ** changed : False ----------------------------------------- INFO
[0, 1, 2, 3, 4]
^^^^ END greet_and_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* host2.cmh ** changed : False *************************************************
vvvv greet_and_count ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR
Subtask: Greeting is the polite thing to do (failed)

---- Greeting is the polite thing to do ** changed : False --------------------- ERROR
Traceback (most recent call last):
  File "/home/bless/.local/lib/python3.8/site-packages/nornir/core/task.py", line 99, in start
    r = self.task(self, **self.params)
  File "/mnt/d/Project/nornir_learn2/learn_result.py", line 18, in say
    raise Exception("I can't say anything right now")
Exception: I can't say anything right now

^^^^ END greet_and_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

你还可以打印单独的一个host的结果:

print_result(result['host1.cmh'])

输出:
vvvv host1.cmh: greet_and_count ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
host1.cmh counted even times!
---- Counting beans ** changed : False ----------------------------------------- INFO
[0, 1, 2, 3, 4]
^^^^ END greet_and_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

甚至一个单独的task:

print_result(result['host1.cmh'][2])

应该你已经注意到了,不是所有的任务都被打印了。这是由于我们传递了severity_level这个参数。这个参数可以让
我们标识任务的日志级别。然后print_result可以根据日志规则来打印结果。默认情况下任务会被标识未INFO级别的
才会被打印(如果一个任务没有被特殊指定,默认值就是INFO)。

一个失败任务的严重级别会被改成未ERROR即使用户指定了特定值。你可以先看下host2.cmh在Greeting is the polite thing to do
任务中看到这个。

现在我们可以告诉print_result来打印DEBUG级别的任务。

print_result(result, severity_level=logging.DEBUG)

输出:
greet_and_count*****************************************************************
* host1.cmh ** changed : False *************************************************
vvvv greet_and_count ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO
host1.cmh counted even times!
---- Greeting is the polite thing to do ** changed : False --------------------- DEBUG
host1.cmh says hi!
---- Counting beans ** changed : False ----------------------------------------- INFO
[0, 1, 2, 3, 4]
---- We should say bye too ** changed : False ---------------------------------- DEBUG
host1.cmh says bye!
^^^^ END greet_and_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* host2.cmh ** changed : False *************************************************
vvvv greet_and_count ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR
Subtask: Greeting is the polite thing to do (failed)

---- Greeting is the polite thing to do ** changed : False --------------------- ERROR
Traceback (most recent call last):
  File "/home/bless/.local/lib/python3.8/site-packages/nornir/core/task.py", line 99, in start
    r = self.task(self, **self.params)
  File "/mnt/d/Project/nornir_learn2/learn_result.py", line 18, in say
    raise Exception("I can't say anything right now")
Exception: I can't say anything right now

^^^^ END greet_and_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

现在我们得到了所有任务的输出。你可以看到严重级别基本都在输出的最右侧。

编程方式

前面我们已经暗示了如何处理result对象,现在让我们详细的说明下。我们从任务组返回的一个AggregatedResult开始。
这个对象是一个类似字典的对象,你可以迭代出所有结果或直接访问某个host。

print(result)

输出:
AggregatedResult (greet_and_count): {
    'host1.cmh': 
        MultiResult: [
            Result: "greet_and_count", 
            Result: "Greeting is the polite thing to do", 
            Result: "Counting beans", Result: "We should say bye too"
            ], 
    'host2.cmh': 
        MultiResult: [
            Result: "greet_and_count", 
            Result: "Greeting is the polite thing to do"
            ]
    }

print(result.keys())

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

print(result["host1.cmh"])

MultiResult: [
    Result: "greet_and_count", 
    Result: "Greeting is the polite thing to do", 
    Result: "Counting beans", Result: "We should say bye too"]

你可能已经注意到了在AggregatedResult中的键是一个MultiResult对象。这个对象是一个类似列表的对象,
你可以完成堆叠或者访问你想要的任何结果:

print(result["host1.cmh"][0])

输出:
host1.cmh counted even times!

MultiResult和Result都可以清晰的表明是否有change或者error在系统中:

print("changed: ", result["host1.cmh"].changed)
print("failed: ", result["host1.cmh"].failed)

输出:
changed:  False
failed:  False

print("changed: ", result["host2.cmh"][0].changed)
print("failed: ", result["host2.cmh"][0].failed)

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

推荐阅读更多精彩内容

  • Tasks 现在已经知道了如何初始化nornir和使用inventory,下面让我们看下如何使用nornir在h...
    Bless_H阅读 480评论 0 1
  • 1. 协程概述 能被asyncio调用的协程可以通过两种方式实现:使用async def语句使用生成器。第一种方式...
    treelake阅读 1,188评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 英文原文档地址: http://www.pymssql.org/index.html[http://www.pym...
    递归的橙子阅读 4,331评论 0 3
  • 1.什么是监控 2.为什么要做监控 系统为什么要做监控:监控是整个运维乃至整个产品生命周期中最重要的一环.事前及时...
    Gq赵阅读 979评论 0 0