农村四月闲人少,勤学苦攻把名扬。这篇文章主要讲述terraform-远程状态存储相关的知识,希望能为你提供帮助。
默认情况下,terraform在运行完后,会在当前目录下生成state状态文件,里面存储的是上一次执行成功后的资源状态。
但是在生产环境,通常会有多名SRE/DevOps负责运维,基于本地state的方式,可能造成terraform的资源文件版本上的分叉。
那么为啥不把state文件放到git上,这样大家都可以更改?
原因是,如果多个人并发执行了terraform的修改,还是会导致state的不一致。
这种时候,我们最容易想到的一个解决方法,就是把这个state放到类似数据库中,A运维在执行时先对这个记录加锁,完成后才释放,B运维才能继续执行。
terraform这里,对于remote state的存储,目前已经支持了s3、阿里云的oss,consul 这些(可能列的不全)。
下面以网上的一个例子来说:
vim /root/.zshrc 添加下aws的ak,类似如下:
export AWS_ACCESS_KEY_ID = AKIA2PA4F44444Q7C72XJ
export AWS_SECRET_ACCESS_KEY = RnckzT427mR222222nZRHHA3333kRV
克隆示例代码
git clone https://github.com/loujaybee/terraform-aws-github-action-bootstrap.git
cd terraform-aws-github-action-bootstrap/
我这里简单修改了下 main.tf,如下:
provider "aws" {
region= "us-east-1"
}terraform {
backend "s3" {
bucket = "lee-terraform-project-name-bootstrap-terraform-state"
key= "default-infrastructure"
region = "us-east-1"
}
}#resource "aws_s3_bucket" "terraform_state" {
#bucket = "lee-terraform-project-name-bootstrap-terraform-state"
#versioning {
#enabled = true
#}
#}
然后执行
terraform init
terraform apply
完成后,将会创建一个s3bucket,名称为 lee-terraform-project-name-bootstrap-terraform-state ,如下图:
文章图片
然后,我们把terraform的状态文件存储到远程s3中
修改 main.tf修改后的文件如下:
provider "aws" {
region= "us-east-1"
}terraform {
backend "s3" {
bucket = "lee-terraform-project-name-bootstrap-terraform-state"
key= "default-infrastructure"
region = "us-east-1"
}
}resource "aws_s3_bucket" "terraform_state" {
bucket = "lee-terraform-project-name-bootstrap-terraform-state"versioning {
enabled = true
}
}
然后,执行下如下命令,使其生效:
terraform init
terraform apply
到s3的存储上,可以看到产生了一个state文件。感兴趣的可以下载下来看看,是一个json文件。
文章图片
我们还可以尝试去开一个ec2主机,修改后代码如下:
provider "aws" {
region= "us-east-1"
}terraform {
backend "s3" {
bucket = "lee-terraform-project-name-bootstrap-terraform-state"
key= "default-infrastructure"
region = "us-east-1"
}
}resource "aws_s3_bucket" "terraform_state" {
bucket = "lee-terraform-project-name-bootstrap-terraform-state"versioning {
enabled = true
}
}resource "aws_instance" "app_server" {
ami= "ami-087c17d1fe0178315"
instance_type = "t2.nano"
count= 1
tags = {
Name = "prod-devops-dba-01"
}
}
运行一下,即可开一台ec2实例出来
terraform plan
terraform apply
每次变动后,执行apply后都会把最新的state传到s3中,运行多次的s3,s3中的记录的版本如下:
文章图片
最后,测试完成后,记得 terraform destroy 销毁相关资源,避免开着浪费钱,哥可是吃过大亏的!
【terraform-远程状态存储】
推荐阅读
- Git 配置使用代理
- Win8系统“设备管理器"中显示驱动损坏处理办法
- Win8系统运用admin管理员账户登陆的办法
- 近半数用户在尝试Win10浏览版后选择回滚至WP8.1
- Windows 8系统如何通过注册表将应用程序添加到右键菜单
- 微软WP8.1手机低端战略获得局部成功
- WP8.1用户通过IE保存密码存在严重安全漏洞
- WP8.1用户音乐应用更新:OneDrive新增音乐盒子
- Win8系统查看文件夹图片详细信息的技巧