当前位置:   article > 正文

Terraform 学习总结(3)——Terraform 命令详解_plan terraform是做什么

plan terraform是做什么

前言

Terraform 是用于安全有效地构建,更改和版本控制基础结构的工具。Terraform可以管理现有和流行的服务提供商以及定制的内部解决方案。配置文件向 Terraform 描述了运行单个应用程序或整个数据中心所需的组件。Terraform 生成执行计划,以描述达到预期状态所需执行的操作,然后执行该计划以构建所描述的基础结构。随着配置的更改,Terraform 能够确定更改的内容并创建可以应用的增量执行计划。Terraform 可以管理的基础结构包括低级组件,例如计算实例,存储和网络,以及高级组件,例如 DNS 条目,SaaS 功能等。

Terraform 主要功能

基础架构即代码, 使用高级配置语法描述基础结构。这样就可以像对待任何其他代码一样对数据中心的蓝图进行版本控制和处理。此外,基础架构可以共享和重复使用。执行计划, Terraform 有一个“计划”步骤,在其中生成执行计划。执行计划将显示 Terraform 在您调用 apply 时将执行的操作。这样可以避免 Terraform 操纵基础结构时出现任何意外。-资源图, Terraform 构建所有资源的图形,并并行化所有非依赖资源的创建和修改。因此,Terraform 尽可能高效地构建基础架构,并且操作员可以洞悉其基础架构中的依赖性。变更自动化, 可以将复杂的变更集应用于您的基础架构,而无需进行过多的人工干预。使用前面提到的执行计划和资源图,您可以准确地知道 Terraform 将要更改的内容和顺序,从而避免了许多可能的人为错误。

Terraform 安装

terraform 安装非常简单,只需要到 https://www.terraform.io/downloads.html 下载后解压文件放置到工作目录,也可以配置 path 指定 terafrom。安装 Terraform,找到与你系统匹配的软件包然后下载。Terraform被打包为一个 zip 归档文件。下载完 zip 文件以后,解压这个包。Terraform 是一个名为 terraform 的独立文件。包里其他所有的文件都可以安全删掉,Terraform 依然可以正常工作。最后一步确保 terraform 二进制文件在 PATH 上可用。

校验安装

Terraform 安装完以后,确认该安装在新开的终端中可运行,并检验 terraform 可用。通过执行 terraform 你将看到类似如下的输出的帮助信息:

  1. $ terraform
  2. Usage: terraform [--version] [--help] <command> [args]
  3. The available commands for execution are listed below.
  4. The most common, useful commands are shown first, followed by
  5. less common or more advanced commands. If you're just getting
  6. started with Terraform, stick with the common commands. For the
  7. other commands, please read the help and docs before usage.
  8. Common commands:
  9. apply Builds or changes infrastructure
  10. console Interactive console for Terraform interpolations
  11. # ...

如果你遇到一个terraform 未找到的错误,(因为)你的PATH环境变量没有设置正确。请回去检查确保你的PATH环境变量包含你terraform的安装目录。

Backend

Terraform 中的“后端”确定如何加载状态以及如何执行诸如此类的操作 apply。这种抽象可以实现非本地文件状态存储,远程执行等。默认情况下,Terraform 使用“本地”后端,这是您惯常使用的 Terraform 的正常行为。这是在整个引言中被调用的后端。这是后端的一些好处:

团队合作:后端可以远程存储其状态,并使用锁保护该状态以防止损坏。某些后端(例如 Terraform Cloud)甚至会自动存储所有状态修订的历史记录。将重要文件置于安全位置:根据需要从后端检索状态,并且仅将其存储在内存中。如果您使用的是后端(例如 Amazon S3),则状态一直保持不变的唯一位置是S3。

远程操作:对于较大的基础架构或某些更改, terraform apply 可能需要很长时间。一些后端支持远程操作,这些操作使该操作可以远程执行。然后,您可以关闭计算机,然后操作仍将完成。配合远程状态存储和上方锁定,这也有助于团队环境。

  1. terraform {
  2. required_version = “>= 0.12”
  3. backend “s3” {
  4. bucket = “” //S3 桶用于存储状态文件
  5. dynamodb_table = “” //用于状态锁定和一致性的DynamoDB表的名称。该表必须有一个名为一个主键LockID与类型string。如果未配置,则将禁用状态锁定。
  6. key = “” // state 文件key路径和名称,包含后缀名
  7. encrypt = true
  8. }
  9. }

terraform init

  1. -input=true如有必要,请输入。如果为false,则在需要输入时将出错。
  2. -lock=false 在与状态相关的操作期间,禁用状态文件的锁定。
  3. -lock-timeout=覆盖Terraform等待获取状态锁的时间。默认值为0s(零秒),如果另一个进程已经锁定,则会立即失败。
  4. -no-color 在命令输出中禁用颜色代码。
  5. -upgrade 将以前安装的所有插件更新为符合配置版本限制的最新版本。此选项不适用于手动安装的插件。
  6. -get-plugins=false—跳过插件安装。Terraform将使用安装在用户plugins目录中的插件,以及已为当前工作目录安装的所有插件。如果安装的插件不足以进行配置,则初始化失败。

terraform plan

该 terraform plan 命令用于创建执行计划。除非明确禁用,否则Terraform会执行刷新,然后确定要实现配置文件中指定的所需状态需要执行哪些操作。该命令是检查一组更改的执行计划是否符合您的期望而不对实际资源或状态进行任何更改的便捷方法。例如,terraform plan 可以在将更改提交到版本控制之前运行,以建立对其将按预期方式运行的信心。可选 -out 参数可用于将生成的计划保存到文件中,以供以后执行 terraform apply,这在自动化运行 Terraform 时很有用 。

  1. -destroy -如果设置,则生成销毁所有已知资源的计划。
  2. -input=true -如果未直接设置,则要求输入变量。
  3. -lock=true -支持锁定时锁定状态文件。
  4. -no-color -禁用带有颜色的输出。
  5. -out=path-保存生成的执行计划的路径。然后可以使用该计划,terraform apply以确保仅应用此计划中显示的更改。阅读下面有关已保存计划的警告。
  6. -parallelism=n-在Terraform遍历图形时限制并发操作的数量 。默认为10
  7. -refresh=true -在检查差异之前更新状态。
  8. -state=path-状态文件的路径。默认为“ terraform.tfstate”。使用远程状态时忽略。
  9. -target=resource- 要定位的资源地址。该标志可以多次使用。请参阅下面的详细信息。
  10. -var 'foo=bar'-在Terraform配置中设置一个变量。可以多次设置此参数。变量值被解释为 HCL,因此可以通过此标志指定列表和映射值。
  11. -var-file=foo-从变量文件配置中设置变量。如果当前目录中存在terraform.tfvars或任何.auto.tfvars文件,它们将被自动加载。terraform.tfvars首先加载,然后.auto.tfvars按字母顺序加载文件。指定的任何文件将-var-file覆盖从工作目录中的文件自动设置的任何值。该参数可以多次使用。

terraform apply

默认情况下,apply 在当前目录中扫描配置,并适当地应用更改。但是,可以提供另一种配置或执行计划的路径。显式执行计划文件可用于拆分计划,并将其应用于自动化系统中的单独步骤 。如果在命令行上未提供明确的计划文件,terraform apply 将自动创建一个新计划并提示您批准以应用该计划。如果创建的计划不包括对资源或根模块输出值的任何更改,terraform apply 则将立即退出,而不会提示。

  1. -backup=path-备份文件的路径。默认为-state-out带有“ .backup”扩展名。通过设置为“-”禁用。
  2. -compact-warnings -如果Terraform产生没有错误的警告,则以更紧凑的形式显示警告,仅包含摘要消息。
  3. -lock=true -支持锁定时锁定状态文件。
  4. -lock-timeout=0s -重试状态锁定的持续时间。
  5. -input=true -如果未直接设置,则要求输入变量。
  6. -auto-approve -申请前跳过计划的交互式批准。
  7. -no-color -禁用带有颜色的输出。
  8. -parallelism=n-在Terraform遍历图形时限制并发操作的数量 。默认为10
  9. -refresh=true-在计划和应用之前,更新每个资源的状态。如果直接给出计划文件以应用,则这无效。
  10. -state=path-状态文件的路径。默认为“ terraform.tfstate”。使用远程状态时忽略。此设置不会保留,其他命令(例如init)可能无法识别备用状态文件。要配置可用于所有terraform命令的备用状态文件路径,请使用local backend。
  11. -state-out=path-写入更新的状态文件的路径。默认情况下,-state将使用该 路径。使用远程状态时忽略 
  12. -target=resource- 要定位的资源地址。有关更多信息,请参阅中 的定位文档terraform plan。
  13. -var 'foo=bar'-在Terraform配置中设置一个变量。可以多次设置此标志。变量值被解释为 HCL,因此可以通过此标志指定列表和映射值。
  14. -var-file=foo-从变量文件在Terraform配置中设置变量。如果当前目录中存在a terraform.tfvars或任何.auto.tfvars文件,它们将被自动加载。terraform.tfvars首先加载,然后.auto.tfvars按字母顺序加载文件。指定的任何文件将-var-file覆盖从工作目录中的文件自动设置的任何值。该标志可以多次使用。

terraform destroy

Terraform 管理的基础架构将被破坏。这将在销毁前要求确认。该命令接受 apply 命令接受的所有参数和标志,但计划文件参数除外。如果 -auto-approve 设置为,则不会显示销毁确认。
该 -target 标志不会影响“依赖关系”,而是会破坏依赖于指定目标的所有资源。任何 terraform destroy 命令的行为都可以使用等效 terraform plan -destroy 命令随时进行预览。

  1. -lock=true -支持锁定时锁定状态文件。
  2. -lock-timeout=0s -重试状态锁定的持续时间。
  3. -input=true -如果未直接设置,则要求输入变量。
  4. -auto-approve -申请前跳过计划的交互式批准。
  5. -no-color -禁用带有颜色的输出。
  6. -parallelism=n-在Terraform遍历图形时限制并发操作的数量 。默认为10
  7. -refresh=true-在计划和应用之前,更新每个资源的状态。如果直接给出计划文件以应用,则这无效。
  8. -state=path-状态文件的路径。默认为“ terraform.tfstate”。使用远程状态时忽略。此设置不会保留,其他命令(例如init)可能无法识别备用状态文件。要配置可用于所有terraform命令的备用状态文件路径,请使用local backend。
  9. -state-out=path-写入更新的状态文件的路径。默认情况下,-state将使用该 路径。使用远程状态时忽略 
  10. -target=resource- 要定位的资源地址。有关更多信息,请参阅中 的定位文档terraform plan。
  11. -var 'foo=bar'-在Terraform配置中设置一个变量。可以多次设置此标志。变量值被解释为 HCL,因此可以通过此标志指定列表和映射值。
  12. -var-file=foo-从变量文件在Terraform配置中设置变量。如果当前目录中存在a terraform.tfvars或任何.auto.tfvars文件,它们将被自动加载。terraform.tfvars首先加载,然后.auto.tfvars按字母顺序加载文件。指定的任何文件将-var-file覆盖从工作目录中的文件自动设置的任何值。该标志可以多次使用。

terraform taint

命令手动将 Terraform 管理的资源标记为已污染,强制将其销毁并在下一次应用时重新创建。该命令不会修改基础结构,但是会修改状态文件,以将资源标记为已污染。将资源标记为已污染后,下一个 计划将显示该资源将被销毁并重新创建,而下一个 应用将实施此更改。当您想要某种在资源属性中不可见的重新创建的副作用时,强制重新创建资源很有用。例如:重新运行预配器将导致节点不同,或者从基本映像重新引导计算机将导致新的启动脚本运行。请注意,为娱乐而污染资源可能会影响依赖于新污染资源的资源。例如,可能需要修改使用服务器IP地址的DNS资源,以反映受污染服务器的潜在新IP地址。在这种情况下, plan 命令将显示此内容。

  1. -address参数是玷污了资源标记的地址。地址 采用资源地址语法语法,如其他命令的输出所示,例aws_instance.foo
  2. aws_instance.bar[1]
  3. aws_instance.baz[\"key\"] (资源地址中的引号必须在命令行上转义,以便您的shell不会解释它们)
  4. module.foo.module.bar.aws_instance.qux
  5. 命令行标志都是可选的。可用标志的列表为:
  6.  -allow-missing-如果指定,即使资源丢失,命令也将成功(退出代码0)。该命令仍然可以出错,但仅在严重错误的情况下才可以。
  7.  -backup=path-备份文件的路径。默认为-state-out带有“ .backup”扩展名。通过设置为“-”禁用。
  8.  -lock=true -支持锁定时锁定状态文件。
  9.  -lock-timeout=0s -重试状态锁定的持续时间。
  10.  -state=path-读取和写入状态文件的路径。默认为“ terraform.tfstate”。使用远程状态时忽略。
  11.  -state-out=path-写入更新的状态文件的路径。默认情况下,-state将使用该 路径。使用远程状态时忽略 

terraform force-unlock

手动解锁已定义配置的状态。这不会修改您的基础结构。此命令删除当前配置的状态锁定。此锁的行为取决于所使用的后端。本地状态文件不能由其他进程解锁。

-force -请勿输入解锁确认信息。

Terraform 配置文件

用 Terraform 的语言编写配置文件,告诉 Terraform 需要安装哪些插件、创建哪些基础设施。terroform 的主配置文件必须是在工作目录的顶级目录中所有的 .tf 文件。顶级目录的子目录被视为独立的模块,并且不会自动包含到配置中。默认情况下 terraform 会加载工作目录下所有 .tf 文件,并期望不同的 .tf 文件定义不同的资源。如果不同的 .tf 文件尝试定义同一个对象,那么 Terraform 将会报错。如果确实有需要定义配置文件覆盖的场景,可以将文件命名为 "override.tf / override.tf.json" 或以 "_override.tf / _override.tf.json" 结尾。配置文件的后缀通常为 .tf,或者使用 json 格式编写配置文件时其后缀为 .tf.json。配置文件的编码必须为UTF-8。terraform init 初始化工作空间后目录下会出现以下文件:

        .terraform                         目录下存放了依赖的providers的缓存文件
        .terraform.locl.hcl              依赖锁文件,锁定terraform配置依赖的适配的providers的版本
        terraform.tfstate                 记录terraform基础设施资源当前的状态
        terraform.tfstate.backup    记录terraform基础设施资源上一个状态
        xxx.tf                                  自定义的配置文件。理解为你期望的terraform基础设施资源的状态

配置文件语法

Terraform 语言的语法仅包含几个基本元素:

  1. <BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  2.   # Block body
  3.   <IDENTIFIER> = <EXPRESSION> # Argument
  4. }

<BOLCK> 是其他内容的容器,通常表示某种对象的配置。包括:<BOLCK TYPE>(如 resource);可以有零个或多个 <BOLCK LABEL>;主体可以包含任意数量的参数和嵌套块。
Argument 参数——由 <IDENTIFIER> 和 <EXPRESSION> 组成,存在于BLOCK 内,<EXPRESSION>,表示一个值或者用表达式表达的一个值。

provider

Terraform 依赖的组件成为 providers。Terraform 配置必须声明需要哪些 providers,以便可以安装和使用它们。provider 一般会提供 resource 的类型 和 DATA SOURCE。Terraform 具体支持哪些 provider 可以在这里查看:https://registry.terraform.io/browse/providers

示例如下:

  1.  provider "alicloud" {
  2.     access_key = "your_ak_xxx"
  3.     secret_key = "your_sk_xxx"
  4.     region = "cn-shenzhen"
  5. }

alias:同一提供者的多个配置,可以选择为同一个提供者定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域等场景。

  1. # The default provider configuration; resources that begin with `aws_` will use
  2. # it as the default, and it can be referenced as `aws`.
  3. provider "aws" {
  4.   region = "us-east-1"
  5. }
  6.  
  7. # Additional provider configuration for west coast region; resources can
  8. # reference this as `aws.west`.
  9. provider "aws" {
  10.   alias  = "west"
  11.   region = "us-west-2"
  12. }

resource 和 module 不指定提供者时,默认以 alias 值的第一个单词推断默认的 provider,多配置下,resource 可以用 provider 参数指定使用哪个提供者。

  1. resource "aws_instance" "foo" {
  2.   provider = aws.west
  3.  
  4.   # ...
  5. }

多配置下,子模块可以用 providers 参数指定使用哪些提供者

  1. module "aws_vpc" {
  2.   source = "./aws_vpc"
  3.   providers = {
  4.     aws = aws.west
  5.   }
  6. }

required_providers,Terraform0.13 以及更高版本中,provider 块的 version 参数已启用。取而代之的似乎使用 required_providers 块指定 provider 的版本。required_providers 由本地名称、源位置、版本约束组成:本地名称(mycloud)、源位置(source)、版本约束(version)。

  1. terraform {
  2.   required_providers {
  3.     mycloud = {
  4.       source  = "mycorp/mycloud"
  5.       version = "~> 1.0"
  6.     }
  7.   }
  8. }
  9.  
  10. provider "mycloud" {
  11.   # ...
  12. }
  • 本地名称:优先使用provider建议的首选本地名称
  • 源位置: 缺省时,默认为 registry.terraform.io/hashicorp/<LOCAL NAME>
  • 版本约束:=>1.0 定义最低使用1.0版本;~>1.0定义 最高使用1.0版本

resource

  1. resource "aws_instance" "web" {
  2.   ami           = "ami-a1b2c3d4"
  3.   instance_type = "t2.micro"
  4. }
  • resource                        resource块
  • "aws_instance"              资源类型,由provider决定有哪些资源类型
  • "web"                             本地名称,仅用于在当前模块中引用此资源
  • {...}                                 参数,大多数参数取决于资源类型。系统也有元参数

元参数 Meta-Arguments

  • depends_on        用于指定隐藏的依赖项
  • count             用于根据计数创建多个资源实例
  • for_each          根据映射或字符串集创建多个实例
  • provider          用于选择非默认提供程序配置
  • lifecycle         用于生命周期自定义
  • provisioner       用于在资源创建后采取额外的行动

data

data 块可以根据 provider 提供的 DATA SOURCE,填写对应的参数。搜索到相对应的基础设施的信息,然后 data 块可以作为数据源提供相关数据信息。示例:resource 中引用本地名称为 "web" 的 data source 的 id。data 块中的各种参数只是为了找到对应的基础设施资源。

  1. data "aws_ami" "web" {
  2.   filter {
  3.     name   = "state"
  4.     values = ["available"]
  5.   }
  6.  
  7.   filter {
  8.     name   = "tag:Component"
  9.     values = ["web"]
  10.   }
  11.  
  12.   most_recent = true
  13. }
  14. resource "aws_instance" "web" {
  15.   ami           = data.aws_ami.web.id
  16.   instance_type = "t1.micro"
  17. }

variable

变量定义:variable 块只能声明变量,并不能指定变量的值

  1. variable "image_id" {
  2.   type        = string
  3.   description = "This is image id"
  4.   default     = "abcxxxx"
  5. }

支持参数

  • default        - 然后使变量可选的默认值。
  • type           - 此参数指定变量接受的值类型。
  • description    - 这指定输入变量的文档。
  • validation     - 定义验证规则的块,通常除了类型约束。
  • sensitive      - 在配置中使用变量时限制 Terraform UI 输出。
  • nullable       - 指定变量是否可以为空。

使用变量

  1. resource "some_resource" "a" {
  2.   name    = var.image_id
  3.   ...
  4. }

变量输入:变量输入有多种方式

  • terraform apply 执行时交互式输入
  • terraform apply -var"image_id=value"
  • 环境变量输入,格式:TF_VAR_image_id='value'
  • 最佳实践:通过.tfvars文件赋值,terraform apply -var-file="vars_file_path"
  • 编辑 xx.tfvars文件
  • image_id = "value"
  • 命令行引用 tfvars 文件
  • terraform apply -var-file="xx.tfvars"

output

output 就像函数的 retrun 返回值。执行完 terraform apply 之后输出的返回值。示例:创建一个vpc,使用output输出vpc的id 和 执行成功状态提示。

  1. #配置阿里云provider
  2. provider "alicloud" {
  3.     access_key = "your_ak_xxx"
  4.     secret_key = "your_sk_xxx"
  5.     region = "cn-shenzhen"
  6. }
  7.  
  8. #创建阿里云vpc
  9. resource "alicloud_vpc" "liqi-vpc-test" {
  10.     vpc_name = "liqi-vpc-test"
  11.     cidr_block = "10.100.0.0/16"
  12. }
  13.  
  14. output "apply_state" {
  15.     value = "apply successful"
  16. }
  17.  
  18. output "new_vpc_id" {
  19.     value = "${alicloud_vpc.liqi-vpc-test.id}"
  20. }

执行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/184864
推荐阅读
相关标签
  

闽ICP备14008679号