只需四步,教你验证 Terraform Planning 配置 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
peefy
V2EX    程序员

只需四步,教你验证 Terraform Planning 配置

  •  
  •   peefy 2023-11-01 18:27:30 +08:00 832 次点击
    这是一个创建于 722 天前的主题,其中的信息可能已经有所发展或是发生改变。

    图片

    前言

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

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5217 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:43 PVG 15:43 LAX 00:43 JFK 03:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86