Terraform配置中的变量设置问题

39次阅读
没有评论

问题描述

在使用Terraform时遇到了一个问题:在配置文件中的多个位置都需要设置变量,如果从其中一个位置删除变量定义,就会出现“Unsupported argument”错误。用户不清楚在这种情况下哪个变量会起作用,也不明白为什么需要同时设置两组变量。

解决方案

请注意以下操作可能受版本差异影响,如有需要请查阅官方文档或更新的资源。

方案1

Terraform中每个模块都有自己的输入变量。根模块的输入变量是在运行Terraform时设置的,比如可以使用命令行的-var选项。而子模块的输入变量则在module块内设置。

对于你的场景,根模块使用了一个名为env的变量,子模块(module "logs")也使用了同样的名字的变量。尽管这对人类读者来说是合理的,因为它们表示相同的概念,但是Terraform认为这两个变量是完全独立的,所以需要在两个位置都定义和设置它们。

可以将模块类比为编程语言中的函数。每个函数都定义了自己的参数,两个函数可能会有相同名称的参数,但它们仍然是不同的,因为它们属于不同的函数:

# 在这个类比中,module "logs" 就相当于一个函数
function main(env: string) {
  logs(env)
}

function logs(env: string) {
  // 这里的 "env" 变量是 "test",因为它通过参数传递给了这两个函数,
  // 而不是因为这两个函数中的参数偶然具有相同的名称。
}

// 对于这个类比,运行 main 相当于执行 terraform apply -var="env=test"
main("test")

方案2

另一种方法是使用脚本或工具来管理容器的启动顺序。这可能会增加一些复杂性,但是可以精确控制容器A和容器B的启动顺序。以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

这种方法需要手动管理容器的启动顺序,但可以确保容器B在容器A之后启动。

请注意,具体操作可能因Docker版本、容器镜像等因素而有所不同,请根据实际情况做相应的调整。

正文完