1.7.20.1. validate

terraform validate 命令可以检查目录下 Terraform 代码,只检查语法文件,不会访问诸如远程 Backend、Provider 的 API 等远程资源。

validate 检查代码的语法是否合法以及一致,不管输入变量以及现存状态。

自动运行此命令是安全的,例如作为文本编辑器中的保存后检查或作为 CI 系统中可复用的测试步骤。

validate 命令需要已初始化的工作目录,所有引用的插件与模块都被安装完毕。如果只想检查语法而不想与 Backend 交互,可以这样初始化工作目录:

$ terraform init -backend=false

要验证特定运行上下文中的配置(特定目标工作空间、输入变量值等),请改用 terraform plan 命令,其中包括隐式验证检查。

1.7.20.1.1. 用法

terraform validate [options]

默认情况下 validate 命令不需要任何参数就可以在当前工作目录下进行检查。

可以使用如下可选参数:

  • -json:使用 JSON 格式输出机器可读的结果
  • -no-color:禁止使用彩色输出

1.7.20.1.2. JSON 输出格式

当您使用 -json 选项时,Terraform 将生成 JSON 格式的验证结果,使得我们可以将之与验证结果的工具进行集成,例如在文本编辑器中突出显示错误。

与所有 JSON 输出选项一样,Terraform 在开始验证任务之前就可能会遇到错误,因此输出的错误可能不会是 JSON 格式的。因此,使用 Terraform 输出的外部软件应该准备好在 stdout 上读取到非有效 JSON 的数据,然后将其视为一般错误情况。

输出包含一个 format_version 键,从 Terraform 1.1.0 开始,其值为“1.0”。该版本的语义是:

  • 对于向后兼容的变更或新增字段,我们将增加 minor 版本号,例如 "1.1"。这种变更会忽略所有不认识的对象属性,以保持与未来其他 minor 版本的前向兼容。
  • 对于不向后兼容的变更,我们将增加 major 版本,例如 "2.0"。不同的 major 版本之间的数据无法直接传递。

我们只会在 Terraform 1.0 兼容性承诺的范围内更新 major 版本。

在正常情况下,Terraform 会将 JSON 对象打印到标准输出流。顶级 JSON 对象将具有以下属性:

  • valid(bool):总体验证结果结论,如果 Terraform 认为当前配置有效,则为 true;如果检测到任何错误,则为 false
  • error_count(number):零或正整数,给出 Terraform 检测到的错误计数。如果 validtrue,则 error_count 将始终为零,因为错误的存在表明配置无效。
  • warning_count(number):零或正整数,给出 Terraform 检测到的警告计数。警告不会导致 Terraform 认为配置无效,但用户应考虑并尝试解决它们。
  • diagnostics(对象数组):嵌套对象的 JSON 数组,每个对象描述来自 Terraform 的错误或警告。

diagnostics 中的对象拥有如下属性:

  • severity(string):字符串关键字,可以是 "error""warning",指示诊断严重性。 error 的存在会导致 Terraform 认为配置无效,而 warning 只是对用户的建议或警告,不会阻止代码运行。Terraform 的后续版本可能会引入新的严重性等级,因此解析错误信息时应该准备好接受并忽略他们不了解的 severity 值。
  • summary(string):诊断报告的问题性质的简短描述。

在 Terraform 易于阅读的的诊断消息中,summary 充当诊断的一种“标题”,打印在 "Error:" 或 "Warning:" 指示符之后。

摘要通常是简短的单个句子,但如果返回错误的子系统并没有设计成返回全面的诊断信息时,就只能把整个错误信息作为摘要返回,导致较长的摘要。这种情况下,摘要可能包含换行符,渲染摘要信息时需要注意。

  • detail(string):可选的附加消息,提供有关问题的更多详细信息。

在 Terraform 易于阅读的的诊断消息中,详细信息提供了标题和源位置引用之后出现的文本段落。

详细消息通常是多个段落,并且可能散布有非段落行,因此旨在向用户呈现详细消息的工具应该区分没有前导空格的行,将它们视为段落,以及有前导空格的行,将它们视为预格式化文本。然后,渲染器应该对段落进行软换行以适合渲染容器的宽度,但保留预格式化的行不换行。

一些 Terraform 详细消息包含使用 ASCII 字符来标记项目符号的近似项目符号列表。这不是官方承诺,因此渲染器应避免依赖它,而应将这些行视为段落或预格式化文本。此格式的未来版本可能会为其他文本约定定义附加规则,但将保持向后兼容性。

  • range(对象):引用与诊断消息相关的配置源代码的一部分的可选对象。对于错误,这通常指示被检测为无效的特定块头、属性或表达式的边界。

源范围是一个具有 filename 属性的对象,该 filename 为当前工作目录的相对路径,然后两个属性 startend 本身都是描述源位置的对象,如下所述。

并非所有诊断消息都与配置的特定部分相关,因此对于不相关的诊断消息,range 将被省略或为 null

snippet(对象):可选对象,包括与诊断消息相关的配置源代码的摘录。

snippet 信息包括了:

  • context(string):诊断的根上下文的可选摘要。例如,这可能是包含触发诊断的表达式的 resource 块。对于某些诊断,此信息不可用,并且此属性将为空。
  • code(string):Terraform 配置的片段,包括诊断源。可能包含多行,并且可能包括触发诊断的表达式周围的附加配置源代码。
  • start_line(number):从一开始的行计数,表示源文件中代码摘录开始的位置。该值不一定与 range.start.line 相同,因为 code 可能在诊断源之前包含一行或多行上下文。
  • highlight_start_offset(number):代码字符串中从零开始的字符偏移量,指向触发诊断的表达式的开头。
  • highlight_end_offset(number):代码字符串中从零开始的字符偏移量,指向触发诊断的表达式的末尾。
  • values(对象数组):包含零个或多个表达式值,帮助我们理解复杂表达式中的诊断来源。这些表达式值对象如下所述。

1.7.20.1.2.1. 源位置(Source Position)

在诊断对象的 range 属性中源位置对象具有以下属性:

  • byte(number):指定文件中从零开始的字节偏移量。
  • line(number):从一开始的行计数,指向文件中相关位置的行。
  • column(number):从一开始的列计数,指向 line 对应的行开头开始的 Unicode 字符计数位置。 start 位置是包含的(数学的 []),而 end 位置是不包含的(数学的 ())。用于特定错误消息的确切位置仅供人类解读。

1.7.20.1.2.2. 表达式值

表达式值对象提供有关触发诊断的表达式一部分的值的附加信息。当使用 for_each 或类似结构时,这特别有用,以便准确识别哪些值导致错误。该对象有两个属性:

  • traversal (string):类似 HCL 的可遍历表达式字符串,例如 var.instance_count。复杂的索引键值可能会被省略,因此该属性并非总是合法、可解析的 HCL。该字符串的内容旨在便于人类阅读。
  • statement(string):一个简短的英语片段,描述触发诊断时表达式的值。该字符串的内容旨在便于人类阅读,并且在 Terraform 的未来版本中可能会发生变化。

results matching ""

    No results matching ""