前言

工欲善其事,必先利其器。本篇文章我们介绍下 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 上访问到它的源代码以及各种文档。

 

安装

我这里强烈推荐tfenv, 下面介绍如何在Mac上利用 tfenv 来安装Terraform。

安装 tfenv

brew install tfenv

brew link tfenv

利用tfenv 安装 Terraform

# install latest version
tfenv install latest

# install specific version
tfenv install 1.2.9

列出所有版本

% tfenv list
1.2.9
1.0.0
0.14.2
0.13.7
* 0.13.5 (set by /usr/local/Cellar/tfenv/2.0.0/version)

* 表示当前使用的版本

切换版本 

# switch to 1.2.9
tfenv use 1.2.9

Switching default version to v1.2.9
Switching completed

卸载

tfenv uninstall 0.14.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:

gcloud auth login

gcloud auth list

确保你的账号有权限操作GCP的Project

我的目录结构如下

providers.tf

 1 terraform {
2 required_version = ">= 1.2.9"
3
4 required_providers {
5 google = {
6 source = "hashicorp/google"
7 version = "~> 4"
8 }
9 }
10 }
11
12 provider "google" {
13 project = local.project.project_id
14 region = local.project.region
15 }

backend.tf

terraform {
backend "gcs" {
bucket = "wadexu007"
prefix = "demo/state"
}
}

这里的bucket要提前建好用来存放Terraform state文件。

network.tf

resource "google_compute_network" "default" {
project = local.project.project_id
name = local.project.network_name
auto_create_subnetworks = true
routing_mode = "GLOBAL"
}

Network资源各个参数参考官方文档

locals.tf

locals {
# project details
project = {
project_id = "demo-eng-cn-dev"
region = "asia-east2"
network_name = "wade-test-network"
}
}

###  https://www.cnblogs.com/wade-xu/p/16709133.html ###

init

在此目录下执行

terraform init

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

 

Plan

plan 命令会检查配置文件并生成执行计划,如果发现配置文件中有错误会报错。

terraform plan

结果如下

 % terraform plan
Acquiring state lock. This may take a few moments... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create Terraform will perform the following actions: # google_compute_network.default will be created
+ resource "google_compute_network" "default" {
+ auto_create_subnetworks = true
+ delete_default_routes_on_create = false
+ gateway_ipv4 = (known after apply)
+ id = (known after apply)
+ internal_ipv6_range = (known after apply)
+ mtu = (known after apply)
+ name = "wade-test-network"
+ project = "xperiences-eng-cn-dev"
+ routing_mode = "GLOBAL"
+ self_link = (known after apply)
} Plan: 1 to add, 0 to change, 0 to destroy.

Apply

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

terraform apply

输入 Yes

Tips: 可以使用 -auto-approve 选项跳过这些步骤直接执行部署操作。

terraform apply -auto-approve

GCS bucket 里面的 Terraform 状态文件  gs://wadexu007/demo/state/default.tfstate 如下

{
"version": 4,
"terraform_version": "1.2.9",
"serial": 1,
"lineage": "30210d18-6dd5-a542-5b0d-xxxxxxxx",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "google_compute_network",
"name": "default",
"provider": "provider[\"registry.terraform.io/hashicorp/google\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"auto_create_subnetworks": true,
"delete_default_routes_on_create": false,
"description": "",
"enable_ula_internal_ipv6": false,
"gateway_ipv4": "",
"id": "projects/demo-eng-cn-dev/global/networks/wade-test-network",
"internal_ipv6_range": "",
"mtu": 0,
"name": "wade-test-network",
"project": "demo-eng-cn-dev",
"routing_mode": "GLOBAL",
"self_link": "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network",
"timeouts": null
},
"sensitive_attributes": [],
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2xxxxxxxxxxxxxxxxxxxxx9"
}
]
}
]
}

GCP控制台查看新建的资源

Destory

terraform destroy 

销毁资源,务必小心

% terraform destroy
Acquiring state lock. This may take a few moments...
google_compute_network.default: Refreshing state... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
- destroy Terraform will perform the following actions: # google_compute_network.default will be destroyed
- resource "google_compute_network" "default" {
- auto_create_subnetworks = true -> null
- delete_default_routes_on_create = false -> null
- enable_ula_internal_ipv6 = false -> null
- id = "projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
- mtu = 0 -> null
- name = "wade-test-network" -> null
- project = "demo-eng-cn-dev" -> null
- routing_mode = "GLOBAL" -> null
- self_link = "https://www.googleapis.com/compute/v1/projects/demo-eng-cn-dev/global/networks/wade-test-network" -> null
} Plan: 0 to add, 0 to change, 1 to destroy. Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes google_compute_network.default: Destroying... [id=projects/xperiences-eng-cn-dev/global/networks/wade-test-network]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 10s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 20s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 30s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 40s elapsed]
google_compute_network.default: Still destroying... [id=projects/demo-eng-cn-dev/global/networks/wade-test-network, 50s elapsed]
google_compute_network.default: Destruction complete after 54s
Releasing state lock. This may take a few moments... 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。


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

云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code的更多相关文章

  1. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  2. 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis

    前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...

  3. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  4. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  5. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  6. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  7. 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes

    前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...

  8. 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

    前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...

  9. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

随机推荐

  1. Springboot 整合 MongoDB

    Springboot 整合 MongoDB 这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增. Mongo DB 的基本介绍和增删改查的用法可以参考我 ...

  2. PMP 考试常见工具与技术点总结

    转载请注明出处: 网络图:项目进度活动之间的逻辑关系,用来推算关键路径,最大浮动时间等: 横道图(甘特图):以图示的方式,通过活动列表和时间刻度,来展示项目获得那个顺序和持续时间 责任分配矩阵:每件事 ...

  3. 【Nim 游戏】 学习笔记

    前言 没脑子选手随便一道博弈论都不会 -- 正文 Nim 游戏引入 这里给出最简单的 \(Nim\) 游戏的题目描述: \(Nim\) 游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\ ...

  4. 意想不到的Python ttkbootstrap 制作账户注册信息界面

    嗨害大家好,我是小熊猫 今天给大家来整一个旧活~ 前言 ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的tkinter 桌 ...

  5. C++ 处理类型名(typedef,auto和decltype)

    随着程序越来越复杂,程序中用到的类型也越来越复杂,这种复杂性体现在两个方面.一是一些类型难于"拼写",它们的名字既难记又容易写错,还无法明确体现其真实目的和含义.二是有时候根本搞不 ...

  6. Java基础 | Stream流原理与用法总结

    Stream简化元素计算: 一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream: ...

  7. 【Java面试】Java有几种文件拷贝方式,哪一种效率最高?

    "Java有几种文件拷贝方式,哪一种效率最高?" 这个问题是京东一面的时候,针对4年经验的同学的一个面试题. 大家好,我是Mic,一个工作了14年的Java程序员. 关于这个问题的 ...

  8. Luogu2018 消息传递 (树形DP)

    贪心优先子树较多者. #include <iostream> #include <cstdio> #include <cstring> #include <a ...

  9. 简易的AutoPlayCarousel 轮播控件

    原理是使用StackPanel 的margin属性的偏移来实现轮播的效果 废话不多说直接上代码 AutoPlayCarousel核心代码 [ContentProperty(nameof(Childre ...

  10. C++ IO流_数据的旅行之路

    1. 前言 程序中的数据总是在流动着,既然是流动就会有方向.数据从程序的外部流到程序内部,称为输入:数据从程序内部流到外部称为输出. C++提供有相应的API实现程序和外部数据之间的交互,统称这类AP ...