Terraform 学习总结—— Terraform 常用命令再总结

Posted 科技D人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Terraform 学习总结—— Terraform 常用命令再总结相关的知识,希望对你有一定的参考价值。

一、资源管理常用命令

Terraform 是一个管理 IT 资源的客户端工具,我们可以使用 Terraform 提供的命令来实现对所有资源的管理。Terraform 对资源的管理主要是对资源生命周期的管理,即通过命令实现对 Terraform 模板中所定义资源的创建,修改,查看和删除。

  • terraform plan:资源的预览plan命令用于对模板中所定义资源的预览,主要用于以下几个场景:
    • 预览当前模板中定义的资源是否符合管理预期,和 Markdown 的预览功能类似。
    • 如果当前模板已经存在对应的 state 文件,那么 plan 命令将会展示模板定义与 state 文件内容的 diff 结果,如果有变更,会将结果在下方显示出来。
    • 对 DataSource 而言,执行 plan 命令,即可直接获取并输出所要查询的资源及其属性。
  • terraform apply:资源的新建和变更。apply 命令用于实际资源的新建和变更操作,为了安全起见,在命令运行过程中增加了人工交互的过程,即需要手动确认是否继续,当然也可以通过 --auto-approve 参数来跳过人工确认的过程。apply 命令适用于以下几种场景:
    • 创建新的资源。
    • 通过修改模板参数来修改资源的属性。
    • 如果从当前模板中删除某个资源的定义,apply命令会将该资源彻底删除。可以理解为“资源的移除也是一种变更”。
  • terraform show:资源的展示。show 命令用于展示当前 state 中所有被管理的资源及其所有属性值。
  • terraform destroy:资源的释放。destroy 命令用于对资源的释放操作,为了安全起见,在命令执行过程中,也增加了人工交互的过程,如果想要跳过手动确认操作,可以通过 --force 参数来跳过。terraform destroy 默认会释放当前模板中定义的所有资源,如果只想释放其中某个特定的资源,可以通过参数 -target=<资源类型>.<资源名称> 来指定。
  • terraform import:资源的导入 import 命令用于将存量的云资源导入到 terraform state 中,进而加入到 Terraform 的管理体系中,适用的场景包含但不限于以下几种:
    • 从来没有使用 Terraform 管控过任何资源,当前所有的存量云资源都是通过控制台,阿里云 CLI,ROS 或者直接调用 API 创建和管理的,现在想要切换为 Terraform 管理。
    • 在不影响资源正常使用的前提下,重构资源模板中的资源定义。
    • 阿里云的 Provider 进行了兼容性升级,新版 Provider 对原有模板中所定义的资源支持了更多的参数,需要把最新的参数同步进来。
  • terraform taint:标记资源为被污染。taint 命令用于把某个资源标记为被污染状态,当再次执行 apply 命令时,这个被污染的资源将会被先释放,然后再创建一个新的,相当于对这个特定资源做了先删除后新建的操作。命令的详细格式为: terraform taint <资源类型>.<资源名称> ,如:
    $ terraform taint alicloud_vswitch.this
    Resource instance alicloud_vswitch.this has been marked as tainted.
  • terraform untaint:取消被污染标记 untaint 命令是 taint 的逆向操作,用于取消被污染标记,使其恢复到正常的状态。命令的详细格式和 taint 类似为:terraform untaint <资源类型>.<资源名称> ,如:
    $ terraform untaint alicloud_vswitch.this
    Resource instance alicloud_vswitch.this has been successfully untainted.
  • terraform output:打印出参及其值如果在模板中显示定义了 output 参数,那么这个 output 的值将在 apply 命令之后展示,但 plan 命令并不会展示,如果想随时随地快速查看 output 的值,可以直接运行命令 terraform output :
    $ terraform output
    vswitchId = vsw-gw8gl31wz********

二、状态管理常用命令

Terraform 对资源状态的管理,实际上是对 State 文件中数据的管理。State 文件保存了当前 Terraform 管理的所有资源及其属性,内容都是由 Terraform 自动存储的,为了保证数据的完整性,不建议手动修改 State 内容。对 State 数据的操作可以通过 terraform state 命令来完成。

  • terraform state list:列出当前 state 中的所有资源 state list 命令会按照 <资源类型>.<资源名称> 的格式列出当前 state 中存在的所有资源(包括 datasource),例如:
    $ terraform state list
    data.alicloud_slbs.default
    alicloud_vpc.default
    alicloud_vswitch.this
  • terraform state show:展示某一个资源的属性 state show 命令按照 Key-Value 的格式展示出特定资源的所有属性及其值,命令的完整格式为 terraformstate 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*******"
    
  • terraform state pull:获取当前 state 内容并展示 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",
              ***
        
      ]
    
  • terraform state rm:移除特定的资源 state rm 命令用于将 state 中的某个资源移除,但是实际上并不会真正删除这个资源,命令格式为:terraformstate rm <资源类型>.<资源名称> ,例如:
    $ terraform state rm alicloud_vswitch.this
    Removed alicloud_vswitch.this
    Successfully removed 1 resource instance(s).

    移除后,如果模板内容不变并且再次执行 apply 命令,将会新增一个同样的资源。移除后的资源可以再次通过 import 命令再次加入。

  • terraform state mv:变更特定资源的存放地址如果想调整某个资源所在的 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”。

  • terraform refresh:刷新当前 state。refresh 命令可以用来刷新当前 State 的内容,即再次调用 API 并拉取最新的数据写入到 state 文件中。

三、其他常用命令

除了资源和状态的管理命令外,还有一些常用的应用在模板,Provider 等多种场景下的命令。

  • terraform init:初始化加载模块。init用来初始化加载所需的模块,包括 Provider,Provisioner,Module 等。
  • terraform graph:输出当前模板定义的资源关系图每个模板定义的资源之间都存在不同程度的关系,如果想看资源关系图,可以使用命令 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 validate:验证模板语法是否正确。Terraform 模板的编写需要遵循其自身定义的一套简单的语法规范,编写完成后,如果想要检查模板是否存在语法错误或者在运行 plan 和 apply 命令的时候报语法错误,可以通过执行命令 terraform validate 来检查和定位错误出现的详细位置和原因。

以上是关于Terraform 学习总结—— Terraform 常用命令再总结的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习总结—— Terraform 常用命令再总结

Terraform 学习总结—— Terraform 常用命令再总结

Terraform 学习总结—— Terraform 常用命令再总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结