只需四步,教你运用 KCL 验证 Terraform 装备

前言

Terraform 是一种广泛运用的根底设施即代码东西,它以声明性的方式协助开发团队界说和办理根底架构。但是,跟着根底架构规模的增大,Terraform 执行方案生成的装备文件变得越来越复杂,因而凭借东西主动化验证执行方案中的行为变得至关重要。

KCL 由于其独特的言语特性,能够供给超卓的装备验证才能。本文将介绍怎么运用 KCL 及其 vet 东西手动或主动执行 Terraform 装备验证,经过界说 KCL 战略来对Terraform 执行方案进行验证,来保证Terraform的执行方案契合希望。

什么是 Terraform

Terraform 是一种开源的根底设施即代码(Infrastructure as Code)东西,它允许开发团队以声明性的方式界说和办理根底架构,包括云服务、服务器、网络、存储等资源。

根底设施即代码是一种将根底设施的装备和办理与运用程序代码相结合的方法。经过运用 Terraform,开发人员能够运用简单的装备言语来描绘所需的根底设施资源,并将其存储在版别操控系统中。这样做的优点是能够完成根底设施的可重复性、可办理性和可追溯性。

Terraform 中一个重要概念是执行方案(Execution Plan)。执行方案是指在运用装备更改之前,Terraform 会生成一个详细的方案,展示即将创立、更新或删除的资源。执行方案能够协助开发人员了解 Terraform 将怎么修改根底设施,以及可能引起的变化和影响。

准备工作

首先咱们需要装置相关东西:

举个比如

咱们准备了一个比如。你能够经过下面指令下载这个事例。

git clone https://github.com/kcl-lang/kcl-lang.io.git/

下载完成后,进入事例的目录,并且检查 terraform 的装备。

cd ./kcl-lang.io/examples/terraform/validation
cat main.tf

假如您能看到如下输出,证明您已经正确下载了这个事例。

provider "aws" {
    region = "us-west-1"
}
resource "aws_instance" "web" {
  instance_type = "t2.micro"
  ami = "ami-09b4b74c"
}
resource "aws_autoscaling_group" "my_asg" {
  availability_zones        = ["us-west-1a"]
  name                      = "my_asg"
  max_size                  = 5
  min_size                  = 1
  health_check_grace_period = 300
  health_check_type         = "ELB"
  desired_capacity          = 4
  force_delete              = true
  launch_configuration      = "my_web_config"
}
resource "aws_launch_configuration" "my_web_config" {
    name = "my_web_config"
    image_id = "ami-09b4b74c"
    instance_type = "t2.micro"
}

接下来,您能够经过如下指令,在生成的 tfplan.json 文件中检查 terraform plan 对应的装备。

terraform init
terraform plan --out tfplan.binary
terraform show -json tfplan.binary > tfplan.json

编写对应的 KCL 验证战略

为了运用 KCL 验证上面比如中供给的装备,咱们需要在 KCL 程序编写装备的验证规矩。假设咱们现在在 AWS 资源组的主动扩缩操作中制止删除资源,咱们能够编写如下 KCL 程序:

schema TFPlan:
    # 疏忽其他特点
    [...str]: any
    resource_changes?: [AcceptableChange]
schema AcceptableChange:
    # 疏忽其他特点
    [...str]: any
    check:
        # 拒绝 AWS autoscaling group Resource delete action
        all action in change.actions {
            action not in ["delete"]
        } if type == "aws_autoscaling_group", "Disable AWS autoscaling group resource delete action for the resource ${type} ${name}"

咱们在校验规矩中,经过 actionnotin["delete"] 语句检查所有的操作是否不包括 deleteaction。假如没有包括 deleteaction 则经过验证,否则将会输出验证过错信息。

运用 KCL 验证 Terraform Plan 文件

您能够运用如下指令对 Terraform Plan 进行验证。

kcl-vet tfplan.json main.k

由于方案契合战略文件中包括的验证规矩,所以没有过错信息输出。

验证失利

咱们能够创立一个验证失利的 KCL 文件 main.policy.failure.k 来展示一下验证失利的作用,咱们在上面给出的 KCL 文件中调整验证规矩,将不能包括 deleta action对应的规矩 actionnotin["delete"]调整为不能包括 create action的规矩 actionnotin["delete"]

schema TFPlan:
    # 疏忽其他特点
    [...str]: any
    resource_changes?: [AcceptableChange]
schema AcceptableChange:
    # 疏忽其他特点
    [...str]: any
    check:
        # 拒绝 AWS autoscaling group Resource delete action
        all action in change.actions {
            action not in ["create"]
        } if type == "aws_autoscaling_group", "Disable AWS autoscaling group resource create action for the resource ${type} ${name}"

在上面的规矩中,咱们的规矩界说了生成的 tfplan.json 文件中不能够包括 “create action”,即制止创立资源, 经过如下指令对装备内容进行验证

kcl-vet tfplan.json main.policy.failure.k

因为上述生成的 tfplan.json 文件中包括对资源的创立操作 “create action”

"change": {
   "actions": [
      "create"
   ],
 ...
}

因而,咱们能够看到由于没有经过验证输出的过错提示信息

Error: EvaluationError
  --> main.policy.failure.k:13:1
   |
13 |         } if type == "aws_autoscaling_group", "Disable AWS autoscaling group resource create action for the resource ${type} ${name}"
   |  Check failed on the condition: Disable AWS autoscaling group resource create action for the resource aws_autoscaling_group my_asg
   |

总结

本文介绍怎么运用 KCL 及其 vet 东西验证 Terraform 装备。经过运用 KCL 和 vet 东西,咱们能够手动或主动执行 Terraform 装备验证,以确保数据与 KCL 战略代码的一致性。