首先是Terraform的安装,这里选择利用二进制方式进行安装

下载对应的二进制包https://developer.hashicorp.com/terraform/downloads

然后直接将二进制包unzip之后mv到path路径即可

安装完成后键入 terraform进行校验安装是否完成

之后查看其提供的基本使用文档

也就是启动一个Nginx docker容器,其主要代码存在于main.tf中

terraform {

required_providers {

docker = {

source  = “kreuzwerker/docker”

version = “~> 3.0.1”

}

}

}

provider “docker” {}

resource “docker_image” “nginx” {

name         = “nginx”

keep_locally = false

}

resource “docker_container” “nginx” {

image = docker_image.nginx.image_id

name  = “tutorial”

ports {

internal = 80

external = 8000

}

}

那么我们的主要结构也就是这样

声明一个提供商,然后声明多重依赖的resource

并给resource配置不同的ports

给人的感觉是抽象了很多层,语法简洁,但需要经常翻他们的语法文档

之后最重要的是terraform init和terraform apply

接下来我们看下如何利用terraform来启动一个AWS资源

还是以一个单一的tf文件来查看,直接是main.tf

terraform {

required_providers {

aws = {

source  = “hashicorp/aws”

version = “~> 4.16”

}

}

required_version = “>= 1.2.0”

}

provider “aws” {

region  = “us-west-2”

}

resource “aws_instance” “app_server” {

ami           = “ami-830c94e3”

instance_type = “t2.micro”

tags = {

Name = “ExampleAppServerInstance”

}

}

required_version 声明要求的terraform的版本

在提供商中声明了要求的提供商是AWS

然后在资源中声明了一个EC2实例

资源后面跟着两个字符串名字,资源类型,资源名称

两者共同构成了一个唯一ID

之后就可以初始化目录 terraform init

最后terraform apply

之后如果我们改变了项目,那么会在apply的时候进行,进行修改。如果遇到了无法修改的参数,比如EC2的AMI,那么会先摧毁旧的实例在创建一个新的实例。

之后由于我们经常需要在Aws上部署和管理资源,所以需要查看AWS 资源提供商提供的一些配置参数

Docs overview | hashicorp/aws | Terraform | Terraform Registry

对于其中的变量,可以利用variables.tf来声明,在tfvars文件中赋值

比如

variable “instance_name” {

description = “Value of the Name tag for the EC2 instance”

type        = string

default     = “ExampleAppServerInstance”

}

并在resource中声明使用

resource “aws_instance” “app_server” {

ami           = “ami-08d70e59c07c61a3a”

instance_type = “t2.micro”

tags = {

–    Name = “ExampleAppServerInstance”

+    Name = var.instance_name

}

}

同时还支持在其中apply的时候利用-var 来进行覆盖

terraform apply -var “instance_name=YetAnotherName”

在terraform中,还支持保存输出,方便我们和云上资源进行校验

比如我们希望获取到resource中常见的ec2主机的public_ip和id,那么可以如下定义output

resource “aws_instance” “app_server” {

ami           = “ami-08d70e59c07c61a3a”

instance_type = “t2.micro”

tags = {

Name = var.instance_name

}

}

output “instance_id” {

description = “ID of the EC2 instance”

value       = aws_instance.app_server.id

}

output “instance_public_ip” {

description = “Public IP address of the EC2 instance”

value       = aws_instance.app_server.public_ip

}

接下来我们来查看一些terraform的最佳实践

在互联网上,关于terraform的使用五花八门,故terraform的使用没有固定方式,而是适合于自己的项目和团队即可。

就比如一个小项目就可以只包含 mian.tf, variables.tf, README.md

其中 main.tf是主要入口类,可以在其中添加所有资源,

variables.tf 中定义变量,并在terraform.tfvars 中为它们赋值

同时

而在大型项目中,就需要定义不同的模块,并为每个模块定义其输入和输出来进行记录。

而在大型项目中,如何管理不同的环境的方法也千奇百怪。常见的方式有为不同的环境配置不同的模块,或者所有的配置划分文件,根据环境变量初始化不同的环境配置。

发表评论

邮箱地址不会被公开。 必填项已用*标注