定义资源

LinuxBeginner
立即练习

简介

在上一个实验中,我们搭好了厨房,也就是安装了 Terraform。现在,是时候编写菜单了。

在 Terraform 中,你通常不需要手动描述每个底层操作步骤,而是描述所需的基础设施对象。每个由 Terraform 管理的对象都表示为一个资源。

资源是 Terraform 管理基础设施的主要单位,也是 .tf 文件中的代码与目标平台中实际对象之间的桥梁。

可以把它想象成在餐厅点餐。你不会告诉厨师「切一个洋葱、翻炒、打两个鸡蛋……」,而只会说「我想要一份煎蛋卷」。Terraform 就像服务员,负责接收你的订单(配置),并确保厨房(Docker)准确准备出你要求的内容。

这就是 Terraform 的核心工作流:定义资源、预览计划中的更改,然后应用这些更改。

定义镜像

先说明需要哪些原料。在 Docker 中,运行容器之前,需要先准备一个镜像。镜像可以理解为软件的固定打包版本。

首先进入项目目录,并创建订单文件 main.tf。

cd ~/project
touch main.tf

使用文本编辑器 nano 打开 main.tf。

nano main.tf

我们总是先告诉 Terraform 由谁来执行工作,也就是配置 Provider。将下面这个标准代码块复制并粘贴到文件顶部,用于配置 Docker provider:

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

现在添加第一个请求:Nginx 镜像。将下面的代码追加到 main.tf 中 provider 代码块的下方(使用方向键向下移动):

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

粘贴代码后保存文件。按下 Ctrl + O,再按 Enter 确认,然后按下 Ctrl + X 退出编辑器。

下面解释这段配置:

  • resource:这个关键词告诉 Terraform:「我想订购某个资源。」
  • "docker_image":这是所订购项目的类型。如果要集成 AWS,这里可能会写成 aws_instance。
  • "nginx":这是我们在配置文件中为该项目指定的名称,方便后续引用。它不会改变现实环境中的任何内容。
  • name = "nginx:latest":这是传递给 Docker 的具体参数,用于准确指定要下载的镜像。

现在,你的基础配置中已经包含一个 provider 和一个资源定义。

定义容器

镜像存储在磁盘上,而容器是正在运行的应用程序。这就像食谱与摆在盘子上的实际菜肴之间的区别。

现在将第二个资源添加到 main.tf 文件中。这个新资源依赖于第一个资源。

再次使用 nano 打开 main.tf:

nano main.tf

使用方向键移动到文件底部,并将下面的代码块粘贴到末尾:

resource "docker_container" "web" {
  image = docker_image.nginx.image_id
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

注意这一行中的引用:

image = docker_image.nginx.image_id

这个引用不仅是为了方便。它允许 Terraform 构建依赖关系图,从而自动确定资源的创建顺序。

我们没有再次输入 "nginx:latest",而是引用了之前定义的资源(docker_image.nginx)。这会告诉 Terraform:「准备好镜像之前,不要尝试创建这个容器。」这就是创建依赖关系的方式。

我们还添加了一个 ports 代码块。它会将你计算机上的端口 8000 映射到容器中的端口 80,让你能够访问容器中的网站。

初始化并生成计划

在让 Terraform 修改环境之前,需要先初始化项目(下载所需工具),然后预览执行计划。

首先运行 init,安装 Docker provider 插件:

terraform init

现在想象一下,如果服务员不确认订单就立刻把食物端上来,那会很有风险!Terraform 提供了一个名为计划(Plan)的安全功能。它会检查你的配置、检查当前已经存在的资源,然后计算两者之间的差异。

运行 plan 命令:

terraform plan

仔细查看输出。你会在资源旁边看到绿色的 + 号。这个符号表示「Terraform 将创建此资源」。

计划阶段是 Terraform 最有价值的安全功能之一。它可以让你在实际环境发生任何修改之前,检查计划中的更改。

重要提示:始终阅读 plan 输出。在错误变成实际基础设施之前,这是你最后一次发现错误的机会。

应用更改

计划看起来没有问题。现在是时候告诉服务员:「开始执行吧!」

apply 命令会执行计划中的更改。

terraform apply

Terraform 会非常谨慎。它会再次显示计划,并要求你进行最终确认。你必须输入 yes 才能继续。

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

输入 yes 并按下 Enter 后,Terraform 会连接 Docker、拉取镜像并启动容器。

检查操作是否成功。你可以使用标准 Docker 命令查看容器是否正在运行:

docker ps

你还可以测试刚刚部署的网站。由于我们映射了端口 8000,因此可以使用 curl 访问它:

curl localhost:8000

如果看到包含「Welcome to nginx!」的 HTML 代码,就说明你已经成功使用代码部署了第一个基础设施!

总结

恭喜!你已经完成了 Terraform 的核心工作流。

在本实验中,你学习了:

  • 定义资源:如何在 main.tf 中指定所需的资源(镜像和容器)。
  • 引用:如何将资源关联起来,例如告诉容器要使用哪个镜像。
  • 计划(Plan):在提交更改之前预览「账单」。
  • 应用(Apply):创建实际的基础设施。

编写 → 计划 → 应用这一循环正是专业人士管理大规模云基础设施的方式。你已经迈出了成为 DevOps 工程师的第一步。