我稍微深入研究了Terraform Cloud的Run Tasks

首先

大家好,我是热爱Terraform Cloud的@kuroseets。
今年剩下的时间只有不到1个星期了,时间过得真快。
这篇文章是terraform Advent Calendar 2021中的第21天的文章。
包括今天在内,还有5天才结束,希望在此之前大家能一直陪伴着。

现在,我要介绍一下我对最近在 Terraform Cloud 上实施的 Run Tasks 功能进行的一些调查,希望大家能够喜欢。

跑任务是什么?

目前仍处于Beta版阶段,但在今年九月份,Terraform Cloud团队与治理功能以及Terraform Cloud商业版已经发布。
简单来说,这个功能是在Terraform Cloud的Plan和Apply之间发送事件到外部系统,并接收其响应。
通过这个功能,可以在Terraform的Plan后通知第三方或自定义的部署工具,接收来自Terraform外部部署的结果,从而决定是否继续执行Apply。

设置和操作验证

设定步骤

由于在官方页面上已经详细写明,所以在本文中将省略这部分内容。
基本上,我们会通过屏幕上的点击来操作。

Run Tasks API已经被实现,但是Terraform Enterprise Provider尚未实现,所以说要等到它被正式发布吧……大概是这个意思吧。

真实的交流

为了窥探有什么样的请求,我决定构建一个简单的网络服务器,只需将收到的请求记录到日志中,并在上述步骤页面的第四步中将该服务器的端点URL指定为Endpoint URL。然后,在执行Apply时,在Plan和Apply之间暂停处理,并在服务器端收到以下请求:

{
    "payload_version": "1",
    "access_token": "examplePo3Bodw.atlasv1.URceefTMN9cyJcSMZtoz1cjy29ORl8BU7H1AnvoPTwMfxWFUExOD1nLBFtA8example",
    "task_result_id": "taskrs-examplefXexample",
    "task_result_enforcement_level": "advisory",
    "task_result_callback_url": "https://app.terraform.io/api/v2/task-results/example3-6a0e-4645-aa10-30eb1example/callback",
    "run_app_url": "https://app.terraform.io/app/ORGNAME/WORKSPACENAME/runs/run-exampleZUexample",
    "run_id": "run-exampleZUexample",
    "run_message": "test",
    "run_created_at": "2021-mm-ddTHH:MM:SS.SSSZ",
    "run_created_by": "kuroseets",
    "workspace_id": "ws-exampletJexample",
    "workspace_name": "WORKSPACENAME",
    "workspace_app_url": "https://app.terraform.io/app/ORGNAME/WORKSPACENAME",
    "organization_name": "ORGNAME",
    "plan_json_api_url": "https://app.terraform.io/api/v2/plans/plan-exampleu3example/json-output",
    "vcs_repo_url": "https://github.com/GITORG/REPOSITORY.git",
    "vcs_branch": "main",
    "vcs_pull_request_url": "",
    "vcs_commit_url": "https://github.com/GITORG/REPOSITORY/-/commit/example3e1681e0e286ad0ad6f9caf56bexample"
}

我认为外部应用程序可以使用 run_id 和 plan_json_api_url 来通过REST API 引用计划,因此可以根据结果来判断如何继续处理。

使用 access_token 在 task_result_callback_url 上发送 PATCH 请求,以通知正在进行的 Terraform Apply。请求的请求体中的 data.type.attributes.status 值将表示处理的成功或失败(passed/failed)。通过从适当的位置发送 curl 请求,我认为 Terraform 会恢复处理。

curl \
  -X PATCH \
  --header "Authorization: Bearer examplePo3Bodw.atlasv1.URceefTMN9cyJcSMZtoz1cjy29ORl8BU7H1AnvoPTwMfxWFUExOD1nLBFtA8example" \
  --header "Content-Type: application/vnd.api+json" \
  -d '{
  "data": {
    "type": "task-results",
      "attributes": {
        "status": "passed",
        "message": "messages here"
      }
  }
}' \
  https://app.terraform.io/api/v2/task-results/example3-6a0e-4645-aa10-30eb1example/callback

最后,
最终,
终究,
最近.

我之前已经提到了 Run Tasks,但它仍然是在测试阶段,尚未正式发布。
这个功能的规格也可能会发生变化,而且第三方的扩展也将在以后进行。
尽管如此,我认为如果功能更全面,它肯定会很方便。
另外,Terraform Cloud还在不断进行各种功能扩展,所以明年如果有机会的话,我还想进行各种调查。
祝大家新年快乐!

广告
将在 10 秒后关闭
bannerAds