云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code

[复制链接]
发表于 2022-9-21 20:38:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前言

工欲善其事,必先利其器。本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes
 
关键词:IaC, Infrastructure as Code, Terraform, 基础架构即代码,Terraform 例子, Terraform 入门,Terraform 简介
 
Terraform 是什么?

Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成,这样的做的结果非常明显:高效、不易出错。
Terraform 绝对是一个非常好用的工具,目前各大云平台也都支持的不错,我很看好它的未来。Terraform 也是用 Go 语言开发的开源项目,你可以在 github 上访问到它的源代码以及各种文档。
###  https://www.cnblogs.com/wade-xu/p/16709133.html ### 安装

我这里强烈推荐tfenv, 下面介绍如何在Mac上利用 tfenv 来安装Terraform。
安装 tfenv
  1. brew install tfenv
  2. brew link tfenv
复制代码
利用tfenv 安装 Terraform
  1. # install latest version<br>tfenv install latest<br><br># install specific version<br>tfenv install 1.2.9<br><br>
复制代码
列出所有版本
  1. % tfenv list                                                                                                
  2.   1.2.9
  3.   1.0.0
  4.   0.14.2
  5.   0.13.7
  6. * 0.13.5 (set by /usr/local/Cellar/tfenv/2.0.0/version)
复制代码
* 表示当前使用的版本
切换版本 
  1. # switch to 1.2.9<br>tfenv use 1.2.9<br><br>Switching default version to v1.2.9<br>Switching completed
复制代码
卸载
  1. tfenv uninstall 0.14.2
  2. tfenv uninstall latest
复制代码
 ###  https://www.cnblogs.com/wade-xu/p/16709133.html ###
 
Provider

我们公司主要用GCP 谷歌云, 所以这里也用 google 的 provider 来入门Terraform
安装 Google Cloud SDK Install https://cloud.google.com/sdk/docs/quickstarts
Configure the environment for gcloud:
  1. gcloud auth login
  2. gcloud auth list
复制代码

确保你的账号有权限操作GCP的Project
 
我的目录结构如下

 
providers.tf
  1. 1 terraform {
  2. 2   required_version = ">= 1.2.9"
  3. 3
  4. 4   required_providers {
  5. 5     google = {
  6. 6       source  = "hashicorp/google"
  7. 7       version = "~> 4"
  8. 8     }
  9. 9   }
  10. 10 }
  11. 11
  12. 12 provider "google" {
  13. 13   project = local.project.project_id
  14. 14   region  = local.project.region
  15. 15 }
复制代码
backend.tf
  1. terraform {
  2.   backend "gcs" {
  3.     bucket = "wadexu007"
  4.     prefix = "demo/state"
  5.   }
  6. }
复制代码
这里的bucket要提前建好用来存放Terraform state文件。
 
network.tf
  1. resource "google_compute_network" "default" {
  2.   project                 = local.project.project_id
  3.   name                    = local.project.network_name
  4.   auto_create_subnetworks = true
  5.   routing_mode            = "GLOBAL"
  6. }
复制代码
Network资源各个参数参考官方文档。
 
locals.tf
  1. locals {
  2.   # project details
  3.   project = {
  4.     project_id       = "demo-eng-cn-dev"
  5.     region           = "asia-east2"
  6.     network_name     = "wade-test-network"
  7.   }
  8. }
复制代码
 ###  https://www.cnblogs.com/wade-xu/p/16709133.html ###
 
init

在此目录下执行
  1. terraform init
复制代码

此目录下会生成 .terraform 文件夹,init其实就安装依赖插件到 .terraform 目录中:
 Plan

plan 命令会检查配置文件并生成执行计划,如果发现配置文件中有错误会报错。
  1. terraform plan
复制代码
结果如下
  1. % terraform plan
  2. Acquiring state lock. This may take a few moments...
  3. Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  4.   + create
  5. Terraform will perform the following actions:
  6.   # google_compute_network.default will be created
  7.   + resource "google_compute_network" "default" {
  8.       + auto_create_subnetworks         = true
  9.       + delete_default_routes_on_create = false
  10.       + gateway_ipv4                    = (known after apply)
  11.       + id                              = (known after apply)
  12.       + internal_ipv6_range             = (known after apply)
  13.       + mtu                             = (known after apply)
  14.       + name                            = "wade-test-network"
  15.       + project                         = "xperiences-eng-cn-dev"
  16.       + routing_mode                    = "GLOBAL"
  17.       + self_link                       = (known after apply)
  18.     }
  19. Plan: 1 to add, 0 to change, 0 to destroy.
复制代码
 
Apply

在使用 apply 命令执行实际的部署时,默认会先执行 plan 命令并进入交互模式等待用户确认操作。
  1. terraform apply
复制代码

输入 Yes

Tips: 可以使用 -auto-approve 选项跳过这些步骤直接执行部署操作。
  1. terraform apply -auto-approve
复制代码
 
GCS bucket 里面的 Terraform 状态文件  gs://wadexu007/demo/state/default.tfstate 如下
  1. {
  2.   "version": 4,
  3.   "terraform_version": "1.2.9",
  4.   "serial": 1,
  5.   "lineage": "30210d18-6dd5-a542-5b0d-xxxxxxxx",
  6.   "outputs": {},
  7.   "resources": [
  8.     {
  9.       "mode": "managed",
  10.       "type": "google_compute_network",
  11.       "name": "default",
  12.       "provider": "provider["registry.terraform.io/hashicorp/google"]",
  13.       "instances": [
  14.         {
  15.           "schema_version": 0,
  16.           "attributes": {
  17.             "auto_create_subnetworks": true,
  18.             "delete_default_routes_on_create": false,
  19.             "description": "",
  20.             "enable_ula_internal_ipv6": false,
  21.             "gateway_ipv4": "",
  22.             "id": "projects/demo-eng-cn-dev/global/networks/wade-test-network",
  23.             "internal_ipv6_range": "",
  24.             "mtu": 0,
  25.             "name": "wade-test-network",
  26.             "project": "demo-eng-cn-dev",
  27.             "routing_mode": "GLOBAL",
  28.             "self_link": "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network",
  29.             "timeouts": null
  30.           },
  31.           "sensitive_attributes": [],
  32.           "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2xxxxxxxxxxxxxxxxxxxxx9"
  33.         }
  34.       ]
  35.     }
  36.   ]
  37. }
复制代码
GCP控制台查看新建的资源

 
Destory
  1. terraform destroy
复制代码
销毁资源,务必小心
  1. % terraform destroy
  2. Acquiring state lock. This may take a few moments...
  3. google_compute_network.default: Refreshing state... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network]
  4. Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  5.   - destroy
  6. Terraform will perform the following actions:
  7.   # google_compute_network.default will be destroyed
  8.   - resource "google_compute_network" "default" {
  9.       - auto_create_subnetworks         = true -> null
  10.       - delete_default_routes_on_create = false -> null
  11.       - enable_ula_internal_ipv6        = false -> null
  12.       - id                              = "projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
  13.       - mtu                             = 0 -> null
  14.       - name                            = "wade-test-network" -> null
  15.       - project                         = "demo-eng-cn-dev" -> null
  16.       - routing_mode                    = "GLOBAL" -> null
  17.       - self_link                       = "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
  18.     }
  19. Plan: 0 to add, 0 to change, 1 to destroy.
  20. Do you really want to destroy all resources?
  21.   Terraform will destroy all your managed infrastructure, as shown above.
  22.   There is no undo. Only 'yes' will be accepted to confirm.
  23.   Enter a value: yes
  24. google_compute_network.default: Destroying... [id=projects/xperiences-eng-cn-dev/global/networks/wade-test-network]
  25. google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 10s elapsed]
  26. google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 20s elapsed]
  27. google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 30s elapsed]
  28. google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 40s elapsed]
  29. google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 50s elapsed]
  30. google_compute_network.default: Destruction complete after 54s
  31. Releasing state lock. This may take a few moments...
  32. Destroy complete! Resources: 1 destroyed.
复制代码
 
附上我的learning by doing 代码 供参考。
 
总结

Terraform 用法很简单,支持的云厂商也很多,只要查看对应文档创建你的资源就行, 上述例子仅仅入门,玩法很多,还可以module化,这样不同的环境只需要source一下module,传入不同的参数就行。
除了建云资源,其它比如 Jenkins,Spinnaker, DNS,Vault 都可以用Terraform来建,所有infra 用代码来实现,人管代码,代码管基础设施,避免管理员直接控制台操作基础设施,后面再运用上Atlantis 将Terraform 在Git上运行,所有change走PR, review之后apply change, 这也是GitOps的一种最佳实践。
另外,Terraform 也支持开发自己的provider。

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。

 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表