我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶!

简介

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

Terraform系列文章如下:

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

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

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

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

Terraform常用命令

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

先通过示例感受一下State

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

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

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操作:

$ 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,它会什么都不生成,因为状态文件与实际基础设施一样,而配置又没有改动,所以可以认为配置与实际一样,不需要变更:

$ terraform apply
No changes. Your infrastructure matches the configuration.

我把NodePort改为30301,再重新apply

$ 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操作删除资源时,也是要读状态文件的,如果状态文件丢失了,它就无法正常删除了。

$ 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.

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

$ 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查看状态,主要命令有:

$ 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

操作如下:

$ 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的配置:

terraform {
backend "gcs" {
bucket = "tf-state-prod"
prefix = "terraform/state"
}
}

阿里云oss的配置:

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"
}
}

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

Terraform状态State管理,让变更有记录的更多相关文章

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

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...

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

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: T ...

  3. 状态(State)模式

    状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的 ...

  4. Java并发框架——同步状态的管理

    整个AQS框架核心功能都是围绕着其32位整型属性state进行,一般可以说它表示锁的数量,对同步状态的控制可以实现不同的同步工具,例如闭锁.信号量.栅栏等等.为了保证可见性此变量被声明为volatil ...

  5. 使用 dbdeploy.net 管理数据库变更

    使用 dbdeploy.net 管理数据库变更 没有包含数据库的持续集成都是假的.这可不是我说的.一直以来都没能找到一个理想的数据库变更管理工具.直到转了 java 再回来,才发现 dbdeploy ...

  6. React-本地状态(state)

    在类组件中添加本地状态(state): 1.创建一个继承自 React.Component 类的 ES6 class 同名类: 2.添加一个 类构造函数(class constructor) 初始化 ...

  7. Centos下磁盘管理的常用命令记录(如查找大文件)

    Centos下磁盘管理的常用命令记录 查看系统磁盘空间占用,使用命令: df -h 结果: 查看磁盘inode使用情况,如果inode用完了,磁盘就没法写入新的内容了: df -i 结果: 如何查找磁 ...

  8. Java 实现状态(State)模式

    /** * @author stone */ public class WindowState { private String stateValue; public WindowState(Stri ...

  9. 状态(State)模式--设计模式

    定义与特点 1.1 定义 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 1.2 特点 状态模式优点: 封装了转换规则,并枚举可能的状态,它将所有与某个状 ...

随机推荐

  1. golang:面向对象总结

    所谓的面向对象其实就是找一个专门做这个事的人来做,不用关心具体怎么实现的.所以说,面向过程强调的是过程,步骤.而面向对象强调的是对象,也就是干事的人. Go语言:面向对象语言特性 方法 嵌入 接口 没 ...

  2. golang:指针理解总结

    指针的定义 指针是一个代表着某个内存地址的值.这个内存地址往往是在内存中存储的另一个变量的值的起始位置. go指针是提供操作数据的基本桥梁.因为go很多调用,往往复制一份对象,例如函数的参数,如果没有 ...

  3. [刷题] PTA 03-树3 Tree Traversals Again

    用栈实现树遍历 1 #include<stdio.h> 2 #include<string.h> 3 #define MAXSIZE 30 4 5 int Pre[MAXSIZ ...

  4. [c++] 分号的使用

    加分号的情况: 语句结束加分号(否则编译器不知道在哪里结束语句,编译器不识别换行,写代码时换行和退格只是为了看着舒服,但本质上代码是写给编译器看的) 声明语句后加分号(也是一种语句) 结构体.类定义后 ...

  5. localectl set-locale LANG=en_US.UTF-8

    localectl set-locale LANG=en_US.UTF-8    

  6. Docker的镜像及容器常用操作(2)

    一.docker镜像 镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器 ...

  7. Could not open device at /dev/ipmi0

    Could not open device at /dev/ipmi0 分类: LINUX 2013-09-02 17:01:37   Could not open device at /dev/ip ...

  8. Java 单例模式:懒加载(延迟加载)和即时加载

    引言 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制(或懒加载.延时加载),也就是说只有当使用到这个实例的时候才会创建这个实例,这个好处在单例模式中得到了广泛应用.这 ...

  9. LTC4020锂电池充电模块开发记录

    前期不断的查找手册 翻译LTC4020的英文手册 同时在论坛上找帖子 参照比较多的帖子如下: http://adi.eefocus.com/module/forum/forum.php?mod=vie ...

  10. linux中级之lvs配置(命令)

    一.nat模式配置 环境说明: DS:nat网卡(自动获取也可以,充当vip): 192.168.254.13 255.255.255.0 vmnet3网卡(仅主机): 172.16.100.1 25 ...