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 = "tutorial"
ports {
internal = 80
external = 8080
}
}
确保你的配置与此匹配,并且你已经在 learn-terraform-docker-container 目录中运行了 terraform init。
使用变量设置容器名称
当前配置包含许多硬编码值。 Terraform 变量允许你编写灵活且易于重用的配置。
添加一个变量来定义容器名称。
创建一个名为 variables.tf 的新文件,其中包含一个定义新的 container_name 变量的块。
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
在 main.tf 中,更新 docker_container 资源块以使用新的变量。 container_name 变量块将默认为其默认值("ExampleNginxContainer"),除非你声明不同的值。
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
- name = "tutorial"
+ name = var.container_name
ports {
internal = 80
external = 8080
}
}
应用你的配置
应用配置。使用 yes 回应确认提示。
$ terraform apply
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=e1df62aa5ae5cf9e31e59066c9e686fe0980b1eed7712b417551bed6b04f364a]
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.
现在再次应用配置,这次通过使用 -var 标志覆盖默认容器名称,并传入变量。 Terraform 将使用新名称更新容器的 name 属性。 使用 yes 回应确认提示。
$ terraform apply -var "container_name=YetAnotherName"
docker_image.nginx: Refreshing state... [id=sha256:d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdeenginx:latest]
docker_container.nginx: Refreshing state... [id=ee653c84b8208dc141d0d79e1e4a276e3989a3359337ec5433e6a052279ed525]
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.
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=ee653c84b8208dc141d0d79e1e4a276e3989a3359337ec5433e6a052279ed525]
docker_container.nginx: Destruction complete after 1s
docker_container.nginx: Creating...
docker_container.nginx: Creation complete after 2s [id=a7a6d308b8d4f77cda08ce20729f899530264d487cc1fd8ca92f9eb591ebcc6d]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
通过命令行设置变量不会保存其值。 Terraform 支持许多使用和设置变量的方法,这样你就可以避免在执行命令时重复输入它们。 要了解更多信息,请参阅我们的深入教程 使用变量自定义 Terraform 配置。