前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(转载非原创)Terraform状态State管理,让变更有记录

(转载非原创)Terraform状态State管理,让变更有记录

作者头像
xlj
修改2021-07-08 14:13:02
1.4K0
修改2021-07-08 14:13:02
举报
文章被收录于专栏:XLJ的技术专栏

简介

最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人。

Terraform系列文章如下:

Terraform入门教程,示例展示管理Docker和Kubernetes资源

Terraform插件Provider管理,搜索、定义、下载

Terraform状态State管理,让变更有记录

Terraform模块Module管理,聚合资源的抽取与复用

Terraform常用命令

State状态是Terraform用于管理基础设施和配置的,它是真实资源的映射,也可以提供大规模基础设施平台的效率。它的主要功能是绑定远程资源平台(如AWS)和本地代码配置的关系。说白了,就是它存储了在实际平台中各种资源的状态,现有的样子。

先通过示例感受一下State

如果概念不好理解,就先通过示例感受一下吧。

关键配置如下,具体请去GitHub参考我的代码:

代码语言:javascript
复制
provider "kubernetes" {
  config_path = "~/.kube/config"
}

module "pkslow-nginx" {
    source = "./nginx"
    namespace = "pkslow"
    applicationName = "pkslow-nginx"
    image = "nginx:1.19.5"
    replicas = 3
    nodePort = 30201
}

先执行apply操作:

代码语言:javascript
复制
$ terraform apply
module.pkslow-nginx.kubernetes_deployment.test: Creating...
module.pkslow-nginx.kubernetes_deployment.test: Creation complete after 4s [id=pkslow/pkslow-nginx]
module.pkslow-nginx.kubernetes_service.test: Creating...
module.pkslow-nginx.kubernetes_service.test: Creation complete after 0s [id=pkslow/pkslow-nginx]

它创建了两个资源,这里在项目的当前目录就会新生成一个terraform.tfstate,它是默认的状态文件。它是一个Json格式的文件,存储了apply新建的资源的状态,如叫什么名字、是什么属性、IP等。

这时,如果我们再次apply,它会什么都不生成,因为状态文件与实际基础设施一样,而配置又没有改动,所以可以认为配置与实际一样,不需要变更:

代码语言:javascript
复制
$ terraform apply
No changes. Your infrastructure matches the configuration.

我把NodePort改为30301,再重新apply

代码语言:javascript
复制
$ terraform apply
Plan: 0 to add, 1 to change, 0 to destroy.

module.pkslow-nginx.kubernetes_service.test: Modifying... [id=pkslow/pkslow-nginx]
module.pkslow-nginx.kubernetes_service.test: Modifications complete after 0s [id=pkslow/pkslow-nginx]

可以看到它只变更了两个资源中的其中一个。

通过destroy操作删除资源时,也是要读状态文件的,如果状态文件丢失了,它就无法正常删除了。

代码语言:javascript
复制
$ mv terraform.tfstate terraform.tfstate.bak

$ terraform destroy
No changes. No objects need to be destroyed.
Either you have not created any objects yet or the existing objects were already deleted outside of Terraform.
Destroy complete! Resources: 0 destroyed.

有对应的状态文件,就会根据状态文件删除:

代码语言:javascript
复制
$ terraform destroy
Plan: 0 to add, 0 to change, 2 to destroy.

module.pkslow-nginx.kubernetes_service.test: Destroying... [id=pkslow/pkslow-nginx]
module.pkslow-nginx.kubernetes_service.test: Destruction complete after 0s
module.pkslow-nginx.kubernetes_deployment.test: Destroying... [id=pkslow/pkslow-nginx]
module.pkslow-nginx.kubernetes_deployment.test: Destruction complete after 0s

查看状态

可以通过命令terraform state查看状态,主要命令有:

代码语言:javascript
复制
$ terraform state

Subcommands:
    list                List resources in the state
    mv                  Move an item in the state
    pull                Pull current state and output to stdout
    push                Update remote state from a local state file
    replace-provider    Replace provider in the state
    rm                  Remove instances from the state
    show                Show a resource in the state

操作如下:

代码语言:javascript
复制
$ terraform state list
module.pkslow-nginx.kubernetes_deployment.test
module.pkslow-nginx.kubernetes_service.test

$ terraform state show module.pkslow-nginx.kubernetes_deployment.test
# module.pkslow-nginx.kubernetes_deployment.test:
......

生产实践

在生产中,状态文件一般不会保存在本地,通常会保存在云存储中,如etcd、gcp、oss等。

如gcs的配置:

代码语言:javascript
复制
terraform {
  backend "gcs" {
    bucket  = "tf-state-prod"
    prefix  = "terraform/state"
  }
}

阿里云oss的配置:

代码语言:javascript
复制
terraform {
  backend "oss" {
    bucket = "bucket-for-terraform-state"
    prefix   = "path/mystate"
    key   = "version-1.tfstate"
    region = "cn-beijing"
    tablestore_endpoint = "https://terraform-remote.cn-hangzhou.ots.aliyuncs.com"
    tablestore_table = "statelock"
  }
}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 先通过示例感受一下State
  • 查看状态
  • 生产实践
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档