现在,您知道如何初始化nornir并使用inventory了,让我们看看如何利用它来在host组上运行task。
task是可重用的代码段,可为单个host实现某些功能。用python术语来说,它是一个将Task作为第一个参数并返回Result的函数。
例如:
from nornir.core.task import Task, Result def hello_world(task: Task) -> Result: return Result( host=task.host, result=f"{task.host.name} says hello world!" )
要执行task,可以使用run方法:
result = nr.run(task=hello_world) print_result(result)
hello_world********************************************************************* * host1.cmh ** changed : False ************************************************* vvvv hello_world ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO host1.cmh says hello world! ^^^^ END hello_world ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * host2.cmh ** changed : False ************************************************* vvvv hello_world ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO host2.cmh says hello world! ^^^^ END hello_world ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
task还可以使用任意数量的参数来扩展其功能。例如:
def say(task: Task, text: str) -> Result: return Result( host=task.host, result=f"{task.host.name} says {text}" )
然后可以像以前一样调用它,但可以为extra参数指定值:
result = nr.run( name="Saying goodbye in a very friendly manner", task=say, text="buhbye!" ) print_result(result)
Saying goodbye in a very friendly manner**************************************** * host1.cmh ** changed : False ************************************************* vvvv Saying goodbye in a very friendly manner ** changed : False vvvvvvvvvvvvvvv INFO host1.cmh says buhbye! ^^^^ END Saying goodbye in a very friendly manner ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * host2.cmh ** changed : False ************************************************* vvvv Saying goodbye in a very friendly manner ** changed : False vvvvvvvvvvvvvvv INFO host2.cmh says buhbye! ^^^^ END Saying goodbye in a very friendly manner ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请注意,我们name
向run
函数传递了一个参数。此参数是参数,它使我们可以为task指定一个描述性名称。如果未指定,则使用函数名称。
分组task
一个task也可以调用其他task。这很有用,因为它可以允许您通过组合较小的构建块来构建更复杂的功能。为了说明这一点,让我们首先定义一个新task:
def count(task: Task, number: int) -> Result: return Result( host=task.host, result=f"{[n for n in range(0, number)]}" )
现在,让我们将其与say
我们先前定义的功能结合起来,以实现更复杂的工作流程:
def greet_and_count(task: Task, number: int) -> Result: task.run( name="Greeting is the polite thing to do", task=say, text="hi!", ) task.run( name="Counting beans", task=count, number=number, ) task.run( name="We should say bye too", 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!", )
值得注意的几件事:
- 第一次调用该
say
函数时,我们将文本硬编码为“ hi!”。而第二次执行此操作(最后一个操作)时,我们将其硬编码为“再见!” - 调用时
count
,将我们也指定的参数传递给父taskgreet_and_count
。这样我们就可以使我们对动态感兴趣的零件 - 最后,我们返回一个
Result
对象,其中包含有关整个工作流程的一些有意义的信息
现在我们有了可以调用的分组task,就像其他任何常规task一样:
result = nr.run( name="Counting to 5 while being very polite", task=greet_and_count, number=5, ) print_result(result)
Counting to 5 while being very polite******************************************* * host1.cmh ** changed : False ************************************************* vvvv Counting to 5 while being very polite ** changed : False vvvvvvvvvvvvvvvvvv INFO host1.cmh counted even times! ---- Greeting is the polite thing to do ** changed : False --------------------- INFO host1.cmh says hi! ---- Counting beans ** changed : False ----------------------------------------- INFO [0, 1, 2, 3, 4] ---- We should say bye too ** changed : False ---------------------------------- INFO host1.cmh says bye! ^^^^ END Counting to 5 while being very polite ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * host2.cmh ** changed : False ************************************************* vvvv Counting to 5 while being very polite ** changed : False vvvvvvvvvvvvvvvvvv INFO host2.cmh counted even times! ---- Greeting is the polite thing to do ** changed : False --------------------- INFO host2.cmh says hi! ---- Counting beans ** changed : False ----------------------------------------- INFO [0, 1, 2, 3, 4] ---- We should say bye too ** changed : False ---------------------------------- INFO host2.cmh says bye! ^^^^ END Counting to 5 while being very polite ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^