sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 2.13.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
快速使用docker创建Nginx
初始化项目,允许terraform下载与docker进行交互的插件
terraform init
如果出现下载失败的情况,需要访问国外网站
terraform apply
此时会输出一些需要我们确认的信息,如果没有问题,输入yes即可
我们访问8000端口即可看到Nginx页面
如果想要删除这个Nginx容器,那么需要使用以下命令即可
terraform destroy
确认无误后,输入yes即可
不过这里值得注意的是,可以看到使用docker ps -a 并没有找到我们停止的容器,所以这里是将这个容器删除了,因为我们正常停止一个容器的时候,使用docker stop,但是在docker ps -a中,我们可以看到已经停止的容器,可以使用docker start 重新将它启动,但是这里是直接将这个容器删除
Linux x86
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Linux Arm
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
MacOs
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
Windows
https://awscli.amazonaws.com/AWSCLIV2.msi
aws configure
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
分别解释以上定义的含义
1、terraform{} 定义了,想用哪家平台的提供程序,说白了就是比如我要用docker,那在source就写docker,想用aws就写Aws,而中间的source为什么是hashicorp/aws呢,因为这里写的是提供的源,从那里提供的,它的全称是:registry.terraform.io/hashicorp/aws
2、然后在required_version中定义了,上面我使用的这个源的版本,required_version这个参数不是强制需要,如果为空,那么将默认下载最新的版本
3、provider “aws”{} 用于定义指定用哪个厂商或者平台,这里使用的aws,profile=default指向了使用AWS使用本地~/.aws/credentials中的密钥配置来操作AWS,region为在哪个地区创建EC2
4、resource中的定义,主要是用来指定我们要用什么东西,例如这里用了EC2,并指定了AMI,也就是使用的服务器镜像ID,instance_type指定了Aws EC2的实例类型,targs中定义的name,就是我们创建的EC2名称
terraform init
初始化时会自动下载与AWS交互所需要的插件等(注意需要访问国外网站)
terraform fmt
为了保证编写的tf文件可读性强,使用该命令之后会自动更新文件中的格式和一致性
terrform validate
使用该命令可以检测当前.tf配置文件中的语法是否有效
terraform apply
创建EC2实例
terraform show
可以查看我们创建的EC2状态等信息
可以看到在俄勒冈州创建了一个EC2
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "app_server" {
- ami = "ami-830c94e3" # 更改为 ami = "ami-08d70e59c07c61a3a"
+ ami = "ami-08d70e59c07c61a3a"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
在创建好EC2之后,是无法更改镜像的,现在更换镜像,就相当于重装了
terraform apply
terraform destroy
可以看到全部都变成了null,输入yes即可
回到AWS控制台可以看到,EC2已经被停止
官方的机翻有一些生硬,不过理解下来就是,能在不同的文件中进行调用
比如在此之前,我们所有的操作都是通过一个main.tf进行启动的,那么中间有一些比如说名称,可以引用别的文件,也就相当于变量的引用
如下图
这里定义了实例名称,简介,类型,还有名称
variable "instance_name" {
description = "Value of the Name tag for the EC2 instance"
type = string
default = "ExampleAppServerInstance"
}
然后放在跟main.tf同一个目录中,然后再main.tf就可以调用这个变量,原理是,terraform会自动在同一个目录中找后缀为.tf的文件
在tags中可以把name改成var.instance_name,也就是我们在variable.tf中定义的变量名称
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.27"
}
}
required_version = ">= 0.14.9"
}
provider "aws" {
profile = "default"
region = "us-west-2"
}
resource "aws_instance" "app_server" {
ami = "ami-08d70e59c07c61a3a"
instance_type = "t2.micro"
tags = {
Name = var.instance_name
}
}
然后输入terraform apply即可
输入yes后等待即可
那么下次还想更改这个名称,可以通过命令行加上-var即可指定
terrform apply -var "instance_name=YetAnotherName"
可以看到更改的过程,输入yes即可
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
}
可以通过定义output,来输出当前实例的ID和IP地址
输入yes等待即可
随后使用以下命令即可查看实例的ID和IP
terraform output
对于这款工具的实现原理,个人理解是,通过调用不同的云厂商提供的SDK,来进行调用,这就跟自己用aws boto3这个库来进行调用aws服务一样。
在Github中搜索terraform可以看到一个官方提供的aws插件
在names.go中可以看到这里import了很多aws的sdk,那么就跟之前想的差不多了,相当于在实现原理上调用了SDK