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 检测到的错误计数。如果valid
为true
,则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
为当前工作目录的相对路径,然后两个属性 start
和 end
本身都是描述源位置的对象,如下所述。
并非所有诊断消息都与配置的特定部分相关,因此对于不相关的诊断消息,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 的未来版本中可能会发生变化。