网站建设网页制作,凡科建站多少钱,宁波建工工程集团有限公司,专业商城网站建设《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新#xff0c;书中的示例代码也是放在GitHub上#xff0c;方便大家参考查看。 军书十二卷#xff0c;卷卷有爷名。 为什么需要状态管理
Terraform的主要作用是管理云平台上的资源#xff… 《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新书中的示例代码也是放在GitHub上方便大家参考查看。 军书十二卷卷卷有爷名。 为什么需要状态管理
Terraform的主要作用是管理云平台上的资源通过声明式的HCL配置来映射资源如果云平台上没有资源则需要创建如果有则不用。那Terraform要实现这个功能有多种方式。
一种是每次执行apply命令时都调用API接口检查一下远程的云资源是否与配置文件一致如果没有则创建如果有但不同则需要修改如果有且相同则不用变更。这种机制能保证云平台的资源与HCL配置是一致的。缺点也是非常明显的每次都需要调用API去检查远程资源效率很低特别是当资源特别多的场景。
另一种方式是每次变更资源的时候都会创建一个映射文件它保存云平台资源的状态。这样每次执行apply命令时只需要检查HCL配置与映射文件的差异即可。
Terraform选择的是第二种方式通过映射文件来保存资源状态在Terraform的世界里叫状态文件。Terraform这样做是基于以下考虑
云平台真实状态的映射解析状态文件即可以知道真实情况。元数据存储如资源之间的依赖关系需要通过依赖关系来知道创建或销毁顺序。提升性能特别是在大规模云平台上多次调用API去查询资源状态是很费时的。同步状态通过远程状态文件来同步状态这也是Terraform最佳的实践。
讲到这里已经回答了之前在第一章留下的思考题 如果再次执行apply会不会再次创建一个文件呢还是创建失败因为文件已存在为什么 答案不会创建因为通过状态文件记录了变更Terraform判断不再需要创建了。
状态管理的示例
为了更多注意力放在状态管理上我们还是使用最简单的例子local_file具体代码如下
resource local_file terraform-introduction {content https://www.pkslow.comfilename ${path.root}/terraform-guides-by-pkslow.txt
}
我们以实际操作及现象来讲解状态文件的作用和工作原理
操作现象及说明terraform apply生成资源第一次生成terraform apply没有变化状态文件生成不需要再创建terraform destroy删除资源根据状态文件的内容删除terraform apply生成资源状态显示没有资源再次生成删除状态文件没有变化terraform apply生成资源没有状态文件直接生成资源和状态文件插件做了容错处理已存在也会新生成覆盖删除状态文件没有变化terraform destroy无法删除资源没有资源存在的状态
我们一直在讲状态文件我们先来看一下它的真面目。首先它的默认文件名是terraform.tfstate默认会放在当前目录下。它是以json格式存储的信息示例中的内容如下
{version: 4,terraform_version: 1.0.11,serial: 1,lineage: acb408bb-2a95-65fd-02e6-c23487f7a3f6,outputs: {},resources: [{mode: managed,type: local_file,name: test-file,provider: provider[\registry.terraform.io/hashicorp/local\],instances: [{schema_version: 0,attributes: {content: https://www.pkslow.com,content_base64: null,directory_permission: 0777,file_permission: 0777,filename: ./terraform-guides-by-pkslow.txt,id: 6db7ad1bbf57df0c859cd5fc62ff5408515b5fc1,sensitive_content: null,source: null},sensitive_attributes: [],private: bnVsbA}]}]
}
可以看到它记录了Terraform的版本信息还有资源的详细信息包括类型、名字、插件、属性等。有这些信息便可直接从状态文件里解析出具体的资源。
状态管理命令
可以通过terraform state做一些状态管理
显示状态列表
$ terraform state list
local_file.test-file
查看具体资源的状态信息
$ terraform state show local_file.test-file
# local_file.test-file:
resource local_file test-file {content https://www.pkslow.comdirectory_permission 0777file_permission 0777filename ./terraform-guides-by-pkslow.txtid 6db7ad1bbf57df0c859cd5fc62ff5408515b5fc1
}
显示当前状态信息
$ terraform state pull
重命名
$ terraform state mv local_file.test-file local_file.pkslow-file
Move local_file.test-file to local_file.pkslow-file
Successfully moved 1 object(s).$ terraform state list
local_file.pkslow-file
要注意这里只是修改状态文件的名字代码里的HCL并不会修改。
删除状态里的资源
$ terraform state rm local_file.pkslow-file
Removed local_file.pkslow-file
Successfully removed 1 resource instance(s).
远程状态
状态文件默认是在本地目录上的terraform.tfstate文件在团队使用中每个人的电脑环境独立的那么需要保证每个人当前的状态文件都是最新且与现实资源真实对应简直是天方夜谭。而状态不一致所带的灾难也是极其可怕的。所以状态文件最好是要存储在一个独立的大家可共同访问的位置。对于状态的管理的配置Terraform称之为Backends。
Backend是两种模式分别是local和remote。local模式很好理解就是使用本地路径来存储状态文件。配置示例如下
terraform {backend local {path pkslow.tfstate}
}
通过这样配置后不再使用默认的terraform.tfstate文件而是使用自定义的文件名pkslow.tfstate。
对于remote模式则有多种配置方式Terraform支持的有
s3gcsossetcdpghttpkubernetes
等能满足主流云平台的需求。每一个配置可以参考官网在本地我采用数据库postgresql的方式让大家都能快速实验。
我通过Docker的方式启动PostgreSQL命令如下
$ docker run -itd \--name terraform-postgres \-e POSTGRES_DBterraform \-e POSTGRES_USERpkslow \-e POSTGRES_PASSWORDpkslow \-p 5432:5432 \postgres:13
在terraform块中配置backend这里指定数据库连接信息即可更多参数请参考https://www.terraform.io/language/settings/backends/pg
terraform {backend pg {conn_str postgres://pkslow:pkslowlocalhost:5432/terraform?sslmodedisable}
}
当然把敏感信息直接放在代码中并不合适可以直接在命令行中传入参数
terraform init -backend-configconn_strpostgres://pkslow:pkslowlocalhost:5432/terraform?sslmodedisable
执行init和apply之后连接数据库查看会创建一个叫terraform_remote_state的Schema在该Schema下有一张states表来存储对应的状态信息如下 表中字段name是namespace而data是具体的状态信息如下
{version: 4,terraform_version: 1.0.11,serial: 0,lineage: de390d13-d0e0-44dc-8738-d95b6d8f1868,outputs: {},resources: [{mode: managed,type: local_file,name: test-file,provider: provider[\registry.terraform.io/hashicorp/local\],instances: [{schema_version: 0,attributes: {content: https://www.pkslow.com,content_base64: null,directory_permission: 0777,file_permission: 0777,filename: ./terraform-guides-by-pkslow.txt,id: 6db7ad1bbf57df0c859cd5fc62ff5408515b5fc1,sensitive_content: null,source: null},sensitive_attributes: [],private: bnVsbA}]}]
}
Workspace 工作区
如果我们用Terraform代码生成了dev环境但现在需要uat环境该如何处理呢
首先不同环境的变量一般是不一样的我们需要定义各种的变量文件如dev.tfvars、uat.tfvars和prod.tfvars等。但只有各自变量是不够的因为还有状态。状态也必须要隔离而Workspace就是Terraform用来隔离状态的方式。默认的工作区为default如果没有指定则表示工作于default工作区中。而当指定了工作区状态文件就会与工作区绑定。
创建一个工作区并切换
$ terraform workspace new pkslow
切换到已存在的工作区
$ terraform workspace select pkslow
而当我们处于某个工作区时是可以获取工作区的名字的引用为${terraform.workspace}示例如下
resource aws_instance example {count ${terraform.workspace default ? 5 : 1}# ... other arguments
}
之前讲过默认的状态文件名为terraform.tfstate而在多工作区的情况下只要你创建了一个非默认工作区状态文件就会存在terraform.tfstate.d目录下。而在远程状态的情况下也会有一个映射Key为工作区名Value一般是状态内容。
敏感数据
本地状态文件都是明文存储状态信息的所以要保护好自己的状态文件。对于远程状态文件有些存储方案是支持加密的会对敏感数据sensitive进行加密。
状态锁
本地状态文件下不需要状态锁因为只有一个人在变更。而远程状态的情况下就可能出现竞争了。比如一个人在apply而另一个人在destroy那就乱了。而状态锁可以确保远程状态文件只能被一个人使用。但不是所有远程状态的方式都支持锁的一般常用的都会支持如GCS、S3等。
所以每当我们在执行变更时Terraform总会先尝试去拿锁如果拿锁失败就该命令失败。可以强制解锁但要非常小心一般只建议在自己明确知道安全的时候才使用比如死锁了。
共享状态-数据源
既然远程状态文件是可以共享的那状态信息也是可以共享的。这样会带来的一个好处是即使两个根模块也是可以共享信息的。比如我们在根模块A创建了一个数据库而根模块B需要用到数据库的信息如IP这样通过远程状态文件就可以共享给根模块B了。 注意这里我强调的是根模块因为如果A和B在同一个根模块下那就不需要通过远程状态的方式来共享状态了。 远程状态的示例
data terraform_remote_state vpc {backend remoteconfig {organization hashicorpworkspaces {name vpc-prod}}
}resource aws_instance foo {# ...subnet_id data.terraform_remote_state.vpc.outputs.subnet_id
}
本地状态的示例
data terraform_remote_state vpc {backend localconfig {path ...}
}resource aws_instance foo {# ...subnet_id data.terraform_remote_state.vpc.outputs.subnet_id
}
要注意的是只有根模块的输出变量才能被共享子模块是不能被获取的。 文章转载自: http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.xhddb.cn.gov.cn.xhddb.cn http://www.morning.nqlx.cn.gov.cn.nqlx.cn http://www.morning.rzmsl.cn.gov.cn.rzmsl.cn http://www.morning.jtmql.cn.gov.cn.jtmql.cn http://www.morning.hkpyp.cn.gov.cn.hkpyp.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.yjknk.cn.gov.cn.yjknk.cn http://www.morning.fhykt.cn.gov.cn.fhykt.cn http://www.morning.frpm.cn.gov.cn.frpm.cn http://www.morning.ntgjm.cn.gov.cn.ntgjm.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.zdmrf.cn.gov.cn.zdmrf.cn http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn http://www.morning.syxmx.cn.gov.cn.syxmx.cn http://www.morning.wdply.cn.gov.cn.wdply.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.gwyml.cn.gov.cn.gwyml.cn http://www.morning.wfcqr.cn.gov.cn.wfcqr.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.rmyqj.cn.gov.cn.rmyqj.cn http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn http://www.morning.xkyst.cn.gov.cn.xkyst.cn http://www.morning.hqbk.cn.gov.cn.hqbk.cn http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn http://www.morning.sxfmg.cn.gov.cn.sxfmg.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.cjwkf.cn.gov.cn.cjwkf.cn http://www.morning.wzdjl.cn.gov.cn.wzdjl.cn http://www.morning.tmnyj.cn.gov.cn.tmnyj.cn http://www.morning.xqcbz.cn.gov.cn.xqcbz.cn http://www.morning.xcbnc.cn.gov.cn.xcbnc.cn http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn http://www.morning.iiunion.com.gov.cn.iiunion.com http://www.morning.wdqhg.cn.gov.cn.wdqhg.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.dqrhz.cn.gov.cn.dqrhz.cn http://www.morning.qsxxl.cn.gov.cn.qsxxl.cn http://www.morning.qytyt.cn.gov.cn.qytyt.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.xsszn.cn.gov.cn.xsszn.cn http://www.morning.rmdsd.cn.gov.cn.rmdsd.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.dfckx.cn.gov.cn.dfckx.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.nmkbl.cn.gov.cn.nmkbl.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.mqghs.cn.gov.cn.mqghs.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.bkjhx.cn.gov.cn.bkjhx.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.gxcym.cn.gov.cn.gxcym.cn http://www.morning.fydsr.cn.gov.cn.fydsr.cn http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn http://www.morning.mrlkr.cn.gov.cn.mrlkr.cn http://www.morning.kxryg.cn.gov.cn.kxryg.cn http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com http://www.morning.mdmc.cn.gov.cn.mdmc.cn http://www.morning.cxryx.cn.gov.cn.cxryx.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.kghhl.cn.gov.cn.kghhl.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.sftrt.cn.gov.cn.sftrt.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.rdpps.cn.gov.cn.rdpps.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.qjtbt.cn.gov.cn.qjtbt.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.ymhzd.cn.gov.cn.ymhzd.cn