堆栈断点

https://blueprints.launchpad.net/heat/+spec/stack-breakpoint

编排模板在工作时是一种强大的自动化工具;然而,当它失败时,故障排除可能非常困难。在开发过程中,调试失败的模板只是流程的一部分,但在生产环境中,先前可用的模板也可能由于许多原因而失败。提供对模板故障排除的支持不仅可以提高生产力,还可以通过允许用户“查看幕后”并更好地掌握自动化来帮助采用 Heat 模板。

通常,用户会首先检查日志以了解错误的线索。如果可能,用户可以通过在脚本中添加更多日志消息来增强日志。这种初步方法应该可以解决许多错误,但困难的错误可能需要更积极的调试。用户需要在模板失败的点之前或在该点停止,检查变量,检查环境,手动运行命令或脚本等。由于模板是声明性的,用户需要能够一致地重现错误。

对故障排除的支持是广泛的,需要许多蓝图来实现不同的功能来控制模板流程,重现错误和检查元素。相关的蓝图包括 troubleshooting-low-level-controlresolve-failed-stack-attributesuser-visible-logsuser-friendly-template-errors。此蓝图涵盖了如何在故障排除时更好地控制堆栈部署的特定场景。

问题描述

对于失败的堆栈,目前我们可以通过禁用回滚在失败点停止:当资源失败时,堆栈将停止,并保留已成功创建的资源。可能会出现一些虚假失败,因为某些资源可能会被中止,但可以通过显示资源的状态轻松识别它们。这种技术适用于故障排除 stack-create;一旦实现了 update-failure-recovery 蓝图,stack-update 可以以类似的方式处理。

然而,在许多情况下,失败点可能太晚或太难调试,因为失败的根本原因可能不明显或环境可能已更改。如果我们可以在失败之前的一个点暂停堆栈,那么我们将处于更好的故障排除位置。例如,我们可以检查环境和堆栈的状态是否符合我们的预期,我们可以手动运行下一步以查看它如何失败等。

在开发新的模板或资源类型时,将堆栈提升到将在执行新代码之前的一个点也是有用的。然后,开发人员可以手动执行和调试新代码。

提议的变更

用法如下

  • 使用一个或多个指定为断点的资源名称运行 stack-create 或 stack-update,例如

    heat stack-create my_stack –template-file my_template.yaml –breakpoint failing_resource_name

    heat stack-update my_stack –template-file my_template.yaml –breakpoint failing_resource_name

  • 断点也可以在环境文件中编码,指向特定的资源,例如

    breakpoints

    resource: failing_resource_name

  • 当引擎遍历依赖关系图时,它将停止在断点资源和所有依赖资源。没有依赖关系的其他资源将在停止之前完成。

  • 运行 resource-list 或 resource-show 将显示断点处的资源为“CREATE.INPROGRESS”或“UPDATE.INPROGRESS”,并且资源尚未创建或更新。运行 event-list 将显示已发生断点,event-show 将提供有关断点的更多详细信息。

  • 可以通过以下方式在命令行中删除断点

    heat stack-update my_stack –template-file my_template.yaml –nobreakpoint failing_resource_name

  • 在环境文件中,可以通过简单地删除断点属性中的资源名称来删除断点。这将在下次指定环境文件时生效。用户可能更倾向于使用命令行选项。

  • 调试完成后,继续堆栈(手动完成,但也可以通过高级调试器自动完成)

    • 步进:删除当前断点,为依赖关系图中下一个资源设置断点,恢复 stack-create(或 stack-update)。

    • 运行到完成:删除当前断点,通过使用相同的模板和参数运行 stack-update 来恢复 stack-create 或 stack-update。

对于嵌套堆栈,断点将以嵌套模板的名称为前缀。

该更改将包括 heat 客户端、api 和环境以添加断点选项。为了使 Heat 引擎在资源处停止,我们将利用蓝图 lifecycle-callbacks。需要一些代码来设置和与回调接口,详细信息将在实现此蓝图时确定。

备选方案

手动方法只是编辑模板并删除任何失败的资源,直到剩余的资源可以成功创建。然后,可以通过将其添加回模板并运行 stack-update 来逐步完成每个资源。每次迭代都需要删除并重新创建整个堆栈。这种手动技术不能合并到高级工具中。

实现

负责人

主要负责人

Ton Ngo

里程碑

完成目标里程碑

Juno-3 或更高版本

工作项

  • Heat 客户端:添加指定断点的选项

  • Heat API:添加指定断点的选项

  • 环境:添加指定断点的选项

  • lifecycle-callbacks 接口

依赖项

https://wiki.openstack.org/wiki/Heat/Blueprints/lifecycle-callbacks