Terraform
使用输出查询数据
在之前的教程中,您使用了一个输入变量来参数化您的 Terraform 配置。在本教程中,您将使用输出值来组织数据,以便于查询和向 Terraform 用户显示。
如果您尚未完成 定义输入变量 教程,请先完成该教程,然后再进行本教程。
初始配置
完成之前的教程后,您将拥有一个名为 learn-terraform-docker-container 的目录,其中包含以下配置。
# main.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = var.container_name
ports {
internal = 80
external = 8080
}
}
# variables.tf
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
确保您的配置与此匹配,并且您已在 learn-terraform-docker-container 目录中初始化了您的配置。
$ terraform init
在继续本教程之前,应用该配置。对确认提示回复 yes。
$ terraform apply
输出 Docker 容器配置
在您的 learn-terraform-docker-container 目录中创建一个名为 outputs.tf 的文件。
将以下配置添加到 outputs.tf 以定义容器 ID 和镜像 ID 的输出。
output "container_id" {
description = "ID of the Docker container"
value = docker_container.nginx.id
}
output "image_id" {
description = "ID of the Docker image"
value = docker_image.nginx.id
}
检查输出值
您必须应用此配置才能使用这些输出值。现在应用您的配置。对确认提示回复 yes。
$ terraform apply
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=a7a6d308b8d4f77cda08ce20729f899530264d487cc1fd8ca92f9eb591ebcc6d]
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement
Terraform will perform the following actions:
# docker_container.nginx must be replaced
-/+ resource "docker_container" "nginx" {
##...
Plan: 1 to add, 0 to change, 1 to destroy.
Changes to Outputs:
+ container_id = (known after apply)
+ image_id = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest"
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
docker_container.nginx: Destroying... [id=a7a6d308b8d4f77cda08ce20729f899530264d487cc1fd8ca92f9eb591ebcc6d]
docker_container.nginx: Destruction complete after 1s
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 2s [id=e5fff27c62e26dc9504d21980543f21161225ab483a1e534a98311a677b9453a]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
container_id = "e5fff27c62e26dc9504d21980543f21161225ab483a1e534a98311a677b9453a"
image_id = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest"
Terraform 在您应用配置时将输出值打印到屏幕上。使用 terraform output 命令查询输出。
$ terraform output
container_id = "e5fff27c62e26dc9504d21980543f21161225ab483a1e534a98311a677b9453a"
image_id = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest"
您可以使用 Terraform 输出将您的 Terraform 项目与其他基础设施部分或与其他 Terraform 项目连接起来。要了解更多信息,请遵循我们的深入教程 从 Terraform 输出数据。
销毁基础设施
销毁您的基础设施。对确认提示回复 yes。
$ terraform destroy
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=3a81c009ce50689663c80b8af5f45453543e192d0c23c24e7e883f9391489b1f]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
- destroy
Terraform will perform the following actions:
# docker_container.nginx will be destroyed
- resource "docker_container" "nginx" {
##...
# docker_image.nginx will be destroyed
- resource "docker_image" "nginx" {
##...
Plan: 0 to add, 0 to change, 2 to destroy.
Changes to Outputs:
- container_id = "3a81c009ce50689663c80b8af5f45453543e192d0c23c24e7e883f9391489b1f" -> null
- image_id = "sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest" -> null
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
docker_container.nginx: Destroying... [id=3a81c009ce50689663c80b8af5f45453543e192d0c23c24e7e883f9391489b1f]
docker_container.nginx: Destruction complete after 1s
docker_image.nginx: Destroying... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_image.nginx: Destruction complete after 1s
Destroy complete! Resources: 2 destroyed.
下一步
完成了 Terraform 的入门教程。希望您现在不仅能够了解 Terraform 的用途,而且能够利用这些知识来改进您自己的基础设施构建。
要获得更多 Terraform 配置语言的实践经验,或了解 Terraform 的更多构建块,请查阅以下教程。
配置语言 - 进一步熟悉变量、输出、依赖项、元参数和其他语言特性,以编写更复杂的 Terraform 配置。
模块 - 使用模块组织和重用 Terraform 配置。
配置 - 使用 Packer 或 Cloud-init 自动配置 SSH 密钥和 Web 服务器到由 Terraform 在 AWS 中创建的 Linux 虚拟机上。
导入 - 将现有基础设施导入 Terraform。
要了解更多可用的配置选项,请参阅 Terraform 文档。
了解更多关于 HCP Terraform 的信息
虽然 HCP Terraform 可以充当标准的远程后端来支持本地机器上的 Terraform 运行,但它作为远程运行环境时效果更好。它支持两种主要的 Terraform 运行工作流程
- 基于 VCS 的工作流程,每当配置的 VCS 仓库提交更改时,它会自动排队计划。
- 基于 API 的工作流程,CI 管道或其他自动化工具可以直接上传配置。
要了解 HCP Terraform 基于 VCS 的工作流程的实践介绍,请遵循 HCP Terraform 入门教程。HCP Terraform 还提供 商业解决方案,其中包括团队权限管理、策略实施、代理等。