Terraform
更改基础设施
在上一教程中,您使用 Terraform 创建了您的第一个基础设施:一个单独的 Docker 容器。 在本教程中,您将修改该资源,并学习如何将更改应用于您的 Terraform 项目。
基础设施在不断发展,Terraform 帮助您管理这种变化。 当您更改 Terraform 配置时,Terraform 会构建一个执行计划,该计划仅修改达到所需状态所需的更改。
在生产中使用 Terraform 时,我们建议您使用版本控制系统来管理您的配置文件,并将您的状态存储在远程后端,例如 HCP Terraform 或 Terraform Enterprise。
先决条件
本教程假定您正在继续使用之前的教程。 如果不是,请在继续之前按照以下步骤操作。
安装 Terraform CLI(0.15+)和 Docker CLI(配置为默认配置文件),如安装教程中所述。
创建一个名为 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 = "tutorial"
ports {
internal = 80
external = 8000
}
}
初始化配置。
$ terraform init
应用配置。使用 yes 回应确认提示。
$ terraform apply
成功应用配置后,您可以继续本教程的其余部分。
更新配置
现在更新容器的外部端口号。将 main.tf 文件中 provider 块下的 docker_container.nginx 资源的 ports.external 值从 8000 替换为 8080
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "tutorial"
hostname = "learn-terraform-docker"
ports {
internal = 80
- external = 8000
+ external = 8080
}
}
此更新更改了容器提供 nginx 服务器所使用的端口号。 Docker 提供程序知道无法在创建后更改容器的端口,因此 Terraform 将销毁旧容器并创建一个新容器。
应用更改
更改配置后,再次运行 terraform apply,查看 Terraform 将如何将此更改应用于现有资源。
$ terraform apply
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=5896c6cb7ae654503c36562472b573da8f49057fd466927be2870453a3b93e51]
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" {
##...
~ ports {
~ external = 8000 -> 8080 # forces replacement
# (3 unchanged attributes hidden)
}
}
Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
前缀 -/+ 表示 Terraform 将销毁并重新创建资源,而不是对其进行原地更新。 Terraform 可以原地更新某些属性(用 ~ 前缀表示),但更改 Docker 容器的端口需要重新创建它。 Terraform 会为您处理这些细节,并且执行计划会显示 Terraform 将执行的操作。
此外,执行计划显示端口的更改是强制 Terraform 替换容器的原因。利用此信息,您可以调整您的更改,以避免不必要的更新。
再次,Terraform 在继续操作之前提示您批准执行计划。回答 yes 以执行计划的步骤。
docker_container.nginx: Destroying... [id=5896c6cb7ae654503c36562472b573da8f49057fd466927be2870453a3b93e51]
docker_container.nginx: Destruction complete after 1s
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 1s [id=b2140f8c6aa79f62c8ac3c3d792f2044bcca8d5a0a08a4598ead1ade7aab7e6e]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
正如执行计划所示,Terraform 首先销毁了现有的容器,然后创建了一个新的容器来代替。您可以使用 terraform show 再次让 Terraform 打印与此容器关联的新值。