直播笔记 - 使用Terragrunt优化Terraform代码

点击上方蓝字⭐️关注“DevOps云学堂”,接收最新技术实践

8e170a8479a69ee36932b9e7597a4e59.gif

3月21日晚上8:00 

分享《Ansible如何使用异步和轮询加速Playbook运行》 

点击下方预约按钮,预约直播

今天是「DevOps云学堂」与你共同进步的第 3 

关注公众号,回复 devops,免费加入DevOps学习群

获得问题解析、DevOps解决方案指导


关注视频号,获取直播回放视频

在本文中,我们将讨论Terragrunt它如何帮助我们减少Terraform 代码中的代码冗余。我们将讨论了它的基本原理和使用案例。

b3e65bfcb8b5a2096e204ba1373a1c02.png

Terragrunt是一个开源的基于命令行的扩展IaC(基础设施即代码)工具,它是Terraform的一个封装器,使得Terraform代码更易于管理,尤其在处理大型复杂基础设施时更为方便。它提供了诸多便利功能,例如自动化环境管理,管理重复代码,自动验证IAM和VPC等等。

本次实验为了演示效果,我们创建模块module-alicloud-dns用于后面各个环境引用。然后先通过terraform原始代码进行发布,最后terragrunt优化代码并发布资源。代码库:https://jihulab.com/terraform3

cda58a58b53835ecefa511c653007590.png
配置AK、SK、Region认证信息

export ALICLOUD_ACCESS_KEY="LTAI5B"
export ALICLOUD_SECRET_KEY="soXvKoF6G"
export ALICLOUD_REGION="cn-beijing"

使用Terraform代码发布基础设施

63167b3782e9ad0fadc959418cff1c33.png
图片.png

部署Backend

main.tf 定义阿里云的OSS bucket 和tablestore. (oss\tablestore的命名可以自定义,唯一)

provider "alicloud" {
  region     = "cn-beijing"
}

## oss
resource "alicloud_oss_bucket" "tfbucket" {
  bucket = "tf-backend-datas"
  acl    = "private"
}

## tablestore
resource "alicloud_ots_instance" "tftable" {
  name        = "tftablenew"
  description = "terraform tablestore"
  accessed_by = "Any"
  tags = {
    Created = "TF"
    For     = "Building table"
  }
}

resource "alicloud_ots_table" "basic" {
  instance_name = alicloud_ots_instance.tftable.name
  table_name    = "myterraformtable"
  primary_key {
    name = "LockID"
    type = "String"
  }
  time_to_live                  = -1
  max_version                   = 1
  deviation_cell_version_in_sec = 1
}

使用命令部署:(注意先把.backend.tf移动到其他目录)

terraform init 
terraform plan 
terraform apply --auto-approve

将状态文件从本地转换成OSS -- 加入backend.tf  (将backend.tf放回原处)后运行terraform init

terraform {
  backend "oss" {
    bucket              = "tf-backend-datas"   #要和部署的一致
    prefix              = "global/backend"
    key                 = "terraform-global-backend.tfstate"
    region              = "cn-beijing"
    tablestore_endpoint = "https://tftablenew.cn-beijing.ots.aliyuncs.com"  #注意tablestore的命名
    tablestore_table    = "myterraformtable"
  }
}
577f371d42c78d224ea439c264b8b4fe.png
image.png

在阿里云控制台进行验证,如图所示。
c43ddb4f456be61e9b51623709d705c4.png

部署Dev环境

进入dev目录,可以看到backend.tf、main.tf、variables.tf、versions.tf。
6b0efc6db99de21b1fff5da81b19e2da.png

检查backend.tf中的oss和tablestore的命名是否和部署的backend是否一致。
验证一致后, 运行部署命令:

terraform init 
terraform plan 
terraform apply --auto-approve
4ba73144db868c9b34f02096847a6f27.png
image.png

在阿里云控制台进行验证,如图所示。
ed552b4e1f631da2639a0fd4f8044d45.png

此处不再重复演示STG和PRD环境的发布,如有需要可以自行参考DEV环境进行发布STG和PRD环境。

Terraform的问题

  • versions.tf 代码重复

  • module 导入的代码重复

  • backend.tf配置代码重复

  • provider配置重复

Terragrunt

Terragrunt是由 Gruntwork 维护的Terraform 的包装器,允许管理远程状态和 Terraform 模块。它旨在减少代码重复。此外,它非常易于使用,因为您只需安装它并在所有 Terraform CLI 命令中替换terraform为terragrunt即可。
9c5aa99a9eaa1e95e8826aa2be9c70eb.png
让我们看看我们可以用 Terragrunt 做些什么来改进我们的 Terraform 代码库!将 Terraform 代码的逻辑与其实现分离:
Terragrunt 的主要优点是它允许将代码 Terraform 的逻辑(位于Terraform模块中)与其实现(位于调用 Terraform 模块的不同环境的配置)分离。因此,Terragrunt 可以被视为编排 Terraform 模块的工具。
7e32d2a5e020d2edc8bea10fefad7572.png
具体来说,我们会将*.tf 配置中的传统文件替换为 Terragrunt.hcl配置文件。通过这样做,我们将能够定义module-alicloud-dns在我们存储库中的任何地方调用模块时传递的输入值。在此配置中,值分解很简单!
0a85ab8910ab3592663f4b5de18c27d4.png

使用Terragrunt优化TF代码

1c60872d6ab42da1d69589f3de79026c.png
将旧(Terraform)代码中的Provider、Backend、Terraform、Module配置放到根目录下的terragrunt.hcl然后每个环境下的terragrunt.hcl配置集成root配置。

优化Provider配置

文件:/terragrunt.hcl

// define provider
generate "provider" {
    path = "provider.tf"
    if_exists = "overwrite_terragrunt"
    contents = <<EOF
    provider "alicloud" {
}
EOF
}

优化Terraform配置

文件:/terragrunt.hcl

// define terraform configuration
generate "versions" {
  path = "versions.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
terraform { 
  required_version = ">=1.1.8"
  required_providers {
    alicloud = {
      source  = "hashicorp/alicloud"
      version = "1.164.0"
    }
  }
}
EOF
}

优化Module配置

文件:/terragrunt.hcl

// define modules
terraform {
  source ="git::https://jihulab.com/terraform3/module-alicloud-dns.git?ref=v0.0.1"
}

优化Backend配置

文件:/terragrunt.hcl

// define backend 
remote_state {
  backend = "oss"
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite_terragrunt"
  }
  config = {
    bucket              = "tf-backend-datas"
    prefix              = "env/${path_relative_to_include()}"
    key                 = "terraform.tfstate"
    region              = "cn-beijing"
    tablestore_endpoint = "https://tftablenew2023.cn-beijing.ots.aliyuncs.com"
    tablestore_table    = "myterraformtable"
  }
}

Dev环境继承配置

文件:/dev/terragrunt.hcl

include "root" {
  path = find_in_parent_folders()
}

inputs = {
  dns_zone_name = "zeyang.site"
  dns_record    = "tgdev"
  eip           = "123.123.123.123"
  record_type   = "A"
}

运行命令:

terragrunt init
terragrunt plan
terragrunt apply

63348905c1eb4b83cfec0ed40febcada.png
52292d5d6fee33d8d8bf3d46a81a3c72.png
在阿里云控制台进行验证,如图所示。
662137d53430d16ea7c45541a075b066.png

Stg环境继承配置

文件:/stg/terragrunt.hcl

include "root" {
    path = find_in_parent_folders()
}

inputs = {
    dns_zone_name = "zeyang.site"
    dns_record    = "tgstg"
    eip           = "123.123.123.124"
    record_type   = "A"
}

运行terragrunt init命令后会生成.terragrunt-cache目录:
09dcbebe61d19db34bf0cb92478949d1.png
会自动生成这些文件:
55e667182307538f7bf3a9f571cbbb27.png

总结:

在本文中,我们发现了Terragrunt以及它如何帮助我们减少Terraform 代码中的代码冗余。我们讨论了它的基本原理和使用案例。


往期内容

f543ca88e5d7d784d268be13d8598a29.jpeg

Kubernetes 中模板化的正确方式 - Kustomize

a6d07b8c09f1e40e6d54b1781448b997.jpeg

实践:基于Azure部署Jenkins服务并开发MERN应用的CI/CD构建管道

a646025c4b31f60989d4b991addd5222.jpeg

基础设施即代码 - 使用Terraform创建AWS EC2实例并部署Jenkins服务

ddbedce94f93ac803b924ccd2a5b9308.jpeg

演讲实录(文字+视频)| 使用Vault管理Jenkins凭据

61eceb57f373d6acd759211ec95661af.jpeg

Pod 原地垂直伸缩 - 一个四年的KEP和两年的PR

7b80efec4d76aae0f94ad96307746a6b.jpeg

第⑥期DevOps训练营(本周开营)


如果这篇文章对您有帮助,欢迎转发点赞分享。您的关注是我持续分享的动力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用go-zero和Terraform实现自动化云平台部署的项目,可以分为以下几个步骤: 1. 安装go-zero和Terraform 在开始之前,您需要确保已经安装了go-zero和Terraform。您可以从官方网站下载和安装它们。 2. 创建go-zero项目 使用goctl命令创建一个新的go-zero项目: ``` goctl api new your_project ``` 这将在当前目录中创建一个新的go-zero项目。 3. 编写go-zero服务代码 在项目目录中,您可以使用goctl命令来创建一个新的服务: ``` goctl api add -plugin tf your_service ``` 这将在services目录中创建一个新的服务,该服务将使用Terraform插件。 现在,您可以在该服务中编写自己的业务逻辑代码。 4. 编写Terraform代码 在该服务的tf目录中,您可以编写Terraform代码来定义您的基础设施。 例如,您可以使用Terraform代码来定义一个新的云服务器实例: ``` resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" tags = { Name = "example-instance" } } ``` 5. 编写自动化脚本 最后,您可以编写一个自动化脚本来自动化部署您的服务和基础设施。 例如,您可以使用bash脚本来自动化部署: ``` #!/bin/bash # 编译服务 go build -o your_service # 初始化Terraform terraform init # 应用Terraform配置 terraform apply -auto-approve ``` 这将自动编译您的服务并应用您的Terraform配置来创建您的基础设施。 总之,使用go-zero和Terraform实现自动化云平台部署的项目可以简化部署流程并提高效率。但是,在使用自动化工具之前,您需要了解基础设施和自动化工具的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值