首先是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 中为它们赋值
同时
而在大型项目中,就需要定义不同的模块,并为每个模块定义其输入和输出来进行记录。
而在大型项目中,如何管理不同的环境的方法也千奇百怪。常见的方式有为不同的环境配置不同的模块,或者所有的配置划分文件,根据环境变量初始化不同的环境配置。