从Terraform状态文件中获取特定的值

时间:2019-09-05 19:03:37

标签: terraform

我已经使用Terraform部署了基础设施,我注意到我想要提取的terraform状态文件(terraform.tfstate)中有一些有趣的信息。例如

$ terraform state show 'packet_device.worker'
id                = 6015bg2b-b8c4-4925-aad2-f0671d5d3b13
billing_cycle     = hourly
created           = 2015-12-17T00:06:56Z
facility          = ewr1
...

我想将其转换为

$ terraform state show 'packet_device.worker.id'
6015bg2b-b8c4-4925-aad2-f0671d5d3b13

但是在末尾添加id似乎无效。有什么建议可以实现这种行为吗?

3 个答案:

答案 0 :(得分:1)

Terraform 状态显示命令用于检索给定资源的所有属性,并且由于参数为resource ADDRESS ,您将无法从中获取单个属性,用于专门引用资源。记录在https://www.terraform.io/docs/internals/resource-addressing.html

您可以做的是将资源属性存储在输出值中,并使用命令

地形输出{output-valaue-extractor}

引用:https://www.terraform.io/docs/configuration/outputs.html

答案 1 :(得分:1)

您可以利用 terraform show -jsonjq 从 Terraform 状态文件中获取特定值。

terraform show -json <state_file> | jq '.values.root_module.resources[] | select(.address=="<terraform_resource_name>") | .values.<property_name>'

您有一个名为 terraform.tfstate 的状态文件和一个名为 packet_device.worker 的 Terraform 资源,并且您想要获取 id。那么它会是这样的:

terraform show -json terraform.tfstate | jq '.values.root_module.resources[] | select(.address=="packet_device.worker") | .values.id'

terraform.tfstate 也可以省略,因为它是状态文件的默认名称。

答案 2 :(得分:0)

从Terraform配置导出信息的主要方法是在根模块中声明Output Values。申请完成后,您可以使用terraform output访问它们。如果您需要以机器可读的方式获取该信息,则可以从使用程序运行terraform output -json并将输出解析为JSON。

如果您处于不寻常的情况下,需要以编程方式访问状态中的所有值(例如,如果您正在实现某种通用的Terraform状态可视化工具),则可以改用terraform show -json,它将打印出a JSON format中状态的所有数据。

如果 仅访问特定值,也许要与自动化解决方案中的某些其他系统集成,我建议使用显式输出值,因为这样对将来的维护者而言,显式的与呼叫者是,因此他们不太可能通过例如意外中断呼叫者将packet_device.worker资源重构为子模块,这将导致该资源出现在状态中的其他位置。通常的假设是,模块内的资源是该模块的实现细节,因此只要输出值保持不变,就可以根据需要安全地重构它们。