只需四步,教你使用 KCL 验证 Terraform 配置

前言

Terraform 是一种广泛使用的基础设施即代码工具,它以声明性的方式帮助开发团队定义和管理基础架构。然而,随着基础架构规模的增大,Terraform 执行计划生成的配置文件变得越来越复杂,因此借助工具自动化验证执行计划中的行为变得至关重要。

KCL 由于其独特的语言特性,能够提供出色的配置验证能力。本文将介绍如何使用 KCL 及其 vet 工具手动或自动执行 Terraform 配置验证,通过定义 KCL 策略来对 Terraform 执行计划进行验证,来保证 Terraform 的执行计划符合期望。

什么是 Terraform

Terraform 是一种开源的基础设施即代码(Infrastructure as Code)工具,它允许开发团队以声明性的方式定义和管理基础架构,包括云服务、服务器、网络、存储等资源。

基础设施即代码是一种将基础设施的配置和管理与应用程序代码相结合的方法。通过使用 Terraform,开发人员可以使用简单的配置语言来描述所需的基础设施资源,并将其存储在版本控制系统中。这样做的好处是可以实现基础设施的可重复性、可管理性和可追溯性。

Terraform 中一个重要概念是执行计划(Execution Plan)。执行计划是指在应用配置更改之前,Terraform 会生成一个详细的计划,展示将要创建、更新或删除的资源。执行计划可以帮助开发人员了解 Terraform 将如何修改基础设施,以及可能引起的变化和影响。

准备工作

首先我们需要安装相关工具:

举个例子

我们准备了一个例子。你可以通过下面命令下载这个案例。

shell 复制代码
git clone https://github.com/kcl-lang/kcl-lang.io.git/

下载完成后,进入案例的目录,并且查看 terraform 的配置。

shell 复制代码
cd ./kcl-lang.io/examples/terraform/validation
cat main.tf

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

hcl 复制代码
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 对应的配置。

shell 复制代码
terraform init
terraform plan --out tfplan.binary
terraform show -json tfplan.binary > tfplan.json

编写对应的 KCL 验证策略

为了使用 KCL 验证上面例子中提供的配置,我们需要在 KCL 程序编写配置的验证规则。假设我们现在在 AWS 资源组的自动扩缩操作中禁止删除资源,我们可以编写如下 KCL 程序:

python 复制代码
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 进行验证。

shell 复制代码
kcl-vet tfplan.json main.k

由于计划符合策略文件中包含的验证规则,所以没有错误信息输出。

验证失败

我们可以创建一个验证失败的 KCL 文件 main.policy.failure.k 来展示一下验证失败的效果,我们在上面给出的 KCL 文件中调整验证规则,将不能包含 deleta action对应的规则 actionnotin["delete"]调整为不能包含 create action的规则 actionnotin["delete"]。

python 复制代码
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",即禁止创建资源, 通过如下命令对配置内容进行验证

shell 复制代码
kcl-vet tfplan.json main.policy.failure.k

因为上述生成的 tfplan.json 文件中包含对资源的创建操作 "create action"

json 复制代码
"change": {
   "actions": [
      "create"
   ],
 ...

}

因此,我们可以看到由于没有通过验证输出的错误提示信息

sql 复制代码
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 策略代码的一致性。

相关推荐
mklpo14712 分钟前
在 安卓手机 上通过termux运行 gentoo 和 宝塔面板。2026.10.19
linux·运维·服务器
狗凯之家源码网14 分钟前
陪玩接单财务系统源码全开源版本评测大纲
开源
xatu1 小时前
ubuntu容器在redhat系统下使用大模型API问题
linux·运维·ubuntu
AI砖家1 小时前
DeepSeek V4.1 Flash vs. GPT-5.6 Sol:前沿闭源与高效开源,路线已经分叉
gpt·开源·deepseek
GitCode官方2 小时前
直播预告:华为云码道实战|Agentic DevOps 与昇腾 CANN 算子 AI 开发
人工智能·华为云·devops·atomgit
雪落漂泊2 小时前
Linux基础开发工具(三)gcc/g++与make/makefile篇
linux·运维·服务器
Sayai2 小时前
Neo4j 社区版高可用实战:DRBD 块级复制 + Keepalived 虚拟 IP 冷备切换(附启停 SOP 与脑裂防范)
运维·neo4j·keepalived·高可用·drbd
miofly2 小时前
NVIDIA 将 Run:ai 平台全面开源,纳入 DSX AI Factory 体系
开源·github
爱吃辣椒的小豆豆2 小时前
Linux-sshd-实战-白名单与跳板机
linux·运维·服务器
万物智能信息科技3 小时前
鸿蒙RS232驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙