简短提示:跨父/子 Runbook 的错误处理

我收到有人以请求更改 Orchestrator 设计的形式发布的问题。Orchestrator 确实很时尚,我指出提出的请求可以作为一项功能,通过现有产品以特定方式设计 Runbook 来解决。发布的场景如下:

我有一个获取服务器列表的父 Runbook,并将对其执行一些操作。这些操作在子 Runbook 中执行。不过,如果发生问题,子 Runbook 的一个迭代中出现错误,我希望让子 Runbook 的任何进一步迭代停止,并希望父 Runbook 也停止。

当然,多年的程序管理员经验告诉我,首先要观察该场景并检查此人要求的问题的详情,确认描述的解决方案(添加的新功能)是否方向正确,确认是否存在解决同一问题的多种方法。当然,Orchestrator 是一款优秀的原型开发工具,我可以快速创建解决方案并测试它们,以了解它们是否可以正常运行。因此,只需 10 分钟的时间,我制定了可以在现有产品中使用该场景的解决方案。尽管它与用户所请求的解决方案并不完全相同,但它可以实现相同的目标,并且他们无需等待下一版本推出后才能得到。

总之 – 您可以使用计数器(一个全局资源对象)作为一个标记。如果有错误则设置该标记,并在即将执行操作时检查该标记,如果设置了该标记则中断。以下父和子 Runbook 图表说明了这一点。

让我们先看一看子 Runbook。它从一个 [Initialize Data](初始化数据)活动开始,并从父 Runbook 获取参数输入。然后,它使用 [Get Counter](获取计数器)活动来查找标记的值。默认情况下,此值为零。如果此值为零,Runbook 将继续顺利地操作,执行大量任务。如果该值不为零,则 Runbook 将立即退出。在中间处理“任务”时,如果发生任何错误,则计数器(标记)值将设置为 1,并且退出 Runbook。如果不发生任何错误,则在所有任务执行完之后,Runbook 将结束,而不设置计数器值。

在父 Runbook 中备份,有一个调用子 Runbook 的 [Invoke Runbook](调用 Runbook)活动。您可能问我们为什么不检查 [Get a list of values](获取值列表)和调用之间的计数器值…如果您恰好阅读过我以前的博文,了解串行与并行处理 Runbook 活动(英文),您就会知道,在从第一个列表中获取一个有 20 台计算机的列表时,它将运行 [Get Counter](获取计数)活动 20 次,然后进入调用活动并运行该活动 20 次。而且,由于计数器的设置基于子 Runbook 中发生的错误数,您在已经检查之后设置该值。因此,实际上无法在子 Runbook 的每个调用之间执行检查,这就是我们在每个子 Runbook 开始时检查该值的原因。

如果在调用 Runbook 活动之后有许多事情要做,我们可以在此处检查计数器的值,并在需要时简化 Runbook 结束流。

重要说明:为使此进程正常运行,必须在 [Invoke Runbook](调用 Runbook)活动中选中 [Wait for completion](等待完成)框。请考虑 – 如果并行启动所有子 Runbook,它们都在开始时检查错误标记,则会遇到与父 Runbook 相同的问题。根据完成子 Runbook 所需的时间以及在父 Runbook 中执行错误标记检查的位置,您可能还错过停止父 Runbook 的机会。

使用此方法,您可能决定以波浪式或分阶段执行子 Runbook 的处理,以确保每部分都在下一部分开始之前完成。

我希望这较详细地解释了有关使用计数器作为标记以及如何向父 Runbook 和跨子 Runbook“弹出”错误的问题,并且您更多地了解了有关 Runbook 中的错误处理问题。下次再见!