我已经使用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
似乎无效。有什么建议可以实现这种行为吗?
答案 0 :(得分:1)
Terraform 状态显示命令用于检索给定资源的所有属性,并且由于参数为resource ADDRESS ,您将无法从中获取单个属性,用于专门引用资源。记录在https://www.terraform.io/docs/internals/resource-addressing.html
中您可以做的是将资源属性存储在输出值中,并使用命令
地形输出{output-valaue-extractor}
答案 1 :(得分:1)
您可以利用 terraform show -json
和 jq
从 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
资源重构为子模块,这将导致该资源出现在状态中的其他位置。通常的假设是,模块内的资源是该模块的实现细节,因此只要输出值保持不变,就可以根据需要安全地重构它们。