经过前几篇文章的介绍,相信你们对Terraform已经有了大体的熟悉和了解,本文将从实践开始,向你们介绍Terraform的几个常见命令。安全
Terraform是一个面向客户端的工具,因此对全部资源的管理都是经过Terraform命令来实现的。本文将主要围绕资源的管理和状态的管理来两个方面来介绍涉及到的经常使用命令。app
Terraform 对资源的管理主要是对资源生命周期的管理,即经过命令实现对Terraform模板中所定义资源的建立,修改,查看和删除。对这部分的讲解,在以前的文章《Terraform 一分钟部署阿里云ECS集群》的 #3.3
章节有过详细的介绍和代码的演示,你们可移步了解。本文只作基本的回顾。ide
plan
命令用于对模板中所定义资源的预览,主要用于如下几个场景:svg
plan
命令将会展现模板定义与state文件内容的diff结果,若是有变动,将会展现结果并在下方显示出来plan
命令,便可直接获取并输出所要查询的资源及其属性apply
命令用于实际资源的新建和变动操做,为了安全起见,在命令运行过程当中增长了人工交互的过程,即须要手动确认是否继续,固然也能够经过 --auto-approve
参数来跳过人工确认的过程。
apply
命令适用于如下几种场景:工具
apply
命令会将该资源完全删除。能够理解为“资源的移除也是一种变动”show
命令用于展现当前state中全部被管理的资源及其全部属性值。学习
destroy
命令用于对资源的释放操做,为了安全起见,在命令执行过程当中,也增长了人工交互的过程,若是想要跳过手动确认操做,能够经过 --force
参数来跳过。
terraform destroy
默认会释放当前模板中定义的全部资源,若是只想释放其中某个特定的资源,能够经过参数 -target=<资源类型>.<资源名称>
来指定。this
import
命令用于将存量的云资源导入到terraform state中,进而加入到Terraform的管理体系中,适用的场景包含但不限于如下几种:阿里云
有关 import
如何实现存量资源的管理,已经在文章《一文揭秘存量云资源的管理难题》中有过详细的阐述,此处再也不赘述。spa
taint
命令用于把某个资源标记为“被污染”状态,当再次执行 apply
命令时,这个被污染的资源将会被先释放,而后再建立一个新的,至关于对这个特定资源作了先删除后新建的操做。
命令的详细格式为: terraform taint <资源类型>.<资源名称>
,如:code
$ terraform taint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been marked as tainted.
untaint
命令是 taint
的逆向操做,用于取消“被污染”标记,使其恢复到正常的状态。命令的详细格式和 taint
相似为: terraform untaint <资源类型>.<资源名称>
,如:
$ terraform untaint alicloud_vswitch.this Resource instance alicloud_vswitch.this has been successfully untainted.
若是在模板中显示定义了 output
参数,那么这个output的值将在 apply
命令以后展现,但 plan
命令并不会展现,若是想随时随地快速查看output的值,能够直接运行命令 terraform output
:
$ terraform output vswitchId = vsw-gw8gl31wz********
Terraform 对资源状态的管理,其实是对State文件中数据的管理。State文件保存了当前Terraform管理的全部资源及其属性,内容都是由Terraform自动存储的,为了保证数据的完整性,不建议手动修改State内容。
对State数据的操做能够经过 terraform state
命令来完成。
state list
按照 <资源类型>.<资源名称>
的格式列出当前state中存在的全部资源(包括datasource),如:
$ terraform state list data.alicloud_slbs.default alicloud_vpc.default alicloud_vswitch.this
state show
命令按照Key-Value的格式展现出特定资源的全部属性及其值,命令的完整格式为 terraform state show <资源类型>.<资源名称>
,如:
$ terraform state show alicloud_vswitch.this # alicloud_vswitch.this: resource "alicloud_vswitch" "this" { availability_zone = "eu-central-1a" cidr_block = "172.16.0.0/24" id = "vsw-gw8gl31wz******" vpc_id = "vpc-gw8calnzt*******" }
state pull
命令用于原样展现当前state文件数据,相似与Shell下的cat命令,如:
$ terraform state pull { "version": 4, "terraform_version": "0.12.8", "serial": 615, "lineage": "39aeeee2-b3bd-8130-c897-2cb8595cf8ec", "outputs": { *** } }, "resources": [ { "mode": "data", "type": "alicloud_slbs", "name": "default", "provider": "provider.alicloud", *** }, { "mode": "managed", "type": "alicloud_vpc", "name": "default", "provider": "provider.alicloud", *** } ] }
state rm
命令用于将state中的某个资源移除,可是实际上并不会真正删除这个资源,命令格式为: terraform state rm <资源类型>.<资源名称>
,如:
terraform state rm alicloud_vswitch.this Removed alicloud_vswitch.this Successfully removed 1 resource instance(s).
移除后,若是模板内容不变而且再次执行 apply
命令,将会新增一个一样的资源。移除后的资源能够再次经过 import
命令再次加入,针对这部分的介绍,一样能够移步文章《一文揭秘存量云资源的管理难题》详细了解。
若是想调整某个资源所在的state文件,能够经过 state mv
命令来完成,相似于Shell下的mv命令,这个命令的使用有多种选项,能够经过命令 terraform state mv --help
来详细了解。本文只介绍最经常使用的一种: terraform state mv --state=./terraform.tfstate --state-out=<target path>/terraform-target.tfstate <资源类型>.<资源名称A> <资源类型>.<资源名称B>
,如:
$ terraform state mv -state-out=../tf.tfstate alicloud_vswitch.this alicloud_vswitch.default Move "alicloud_vswitch.this" to "alicloud_vswitch.default" Successfully moved 1 object(s).
如上命令省略了默认的 --state=./terraform.tfstate
选项,命令最终的结果是将当前State中的VSwitch 资源移动到了上层目录下名为 tf.tfstate
的State中,而且将VSwitch的资源名称由"this"改成了"default"。
refresh
命令能够用来刷新当前State的内容,即再次调用API并拉取最新的数据写入到state文件中。
除了资源和state的管理命令外,还有一些经常使用的应用在模板,provider等多种场景下的命令。
init
用来初始化加载所需的模块,包括Provider,Provisioner,Module等。
每一个模板定义的资源之间都存在不一样程度的关系,若是想看资源关系大图,可使用命令 terraform graph
:
$ terraform graph digraph { compound = "true" newrank = "true" subgraph "root" { "[root] alicloud_vpc.default" [label = "alicloud_vpc.default", shape = "box"] "[root] alicloud_vswitch.this" [label = "alicloud_vswitch.this", shape = "box"] ****** "[root] output.vswitchId" -> "[root] alicloud_vswitch.this" "[root] provider.alicloud (close)" -> "[root] alicloud_vswitch.this" ****** "[root] root" -> "[root] provider.alicloud (close)" } }
该命令的结果还能够经过命令 terraform graph | dot -Tsvg > graph.svg
直接导出为一张图片(须要提早安装graphviz: brew install graphviz
):
Terraform 模板的编写须要遵循其自身定义的一套简单的语法规范,编写完成后,若是想要检查模板是否存在语法错误或者在运行 plan
和 apply
命令的时候报语法错误,能够经过执行命令 terraform validate
来检查和定位错误出现的详细位置和缘由。
本文主要介绍了一些在使用Terraform过程常常会遇到的一些命令,这些命令覆盖了模块下载,模板的检查,资源的管理,资源状态的管理等几个方面。看得出这些命令使用起来并不复杂,不一样命令的组合使用能够知足不一样复杂的使用场景。本文只介绍了全部命令中的一部分,更多命令能够直接运行 terraform
或者 terraform --help
详细查看。
Terraform是面向客户端的工具,而且主要以命令驱动,所以对Terraform的学习最好的方法即是勤动手,多尝试,熟能生巧。
本文为云栖社区原创内容,未经容许不得转载。