Has*_*san 4 terraform terraform-remote-state terraform-provider-docker
我在 Terraform 中有以下资源:
provider "docker" {
host = "tcp://${digitalocean_droplet.docker_server.ipv4_address}:2376/"
}
Run Code Online (Sandbox Code Playgroud)
这依赖于在ipv4_address连接到 docker 机器之前要知道的值。在供应另一个资源之前,该值是未知的:
provider "docker" {
host = "tcp://${digitalocean_droplet.docker_server.ipv4_address}:2376/"
}
Run Code Online (Sandbox Code Playgroud)
当我运行时terraform plan,出现以下错误:
错误:初始化 Docker 客户端时出错:无法解析 docker 主机``
在 docker.tf 第 1 行,在提供者“docker”中:1:提供者“docker”{
它似乎ipv4_address是空的,因为 docker 插件在配置之前尝试连接到 docker 机器。我如何告诉它在尝试连接之前等待机器配置?
provider "docker" {
host = "tcp://${digitalocean_droplet.docker_server.ipv4_address}:2376/"
depends_on = [
digitalocean_droplet.docker_server.ipv4_address,
]
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到此错误:
错误:提供程序块中的保留参数名称
在 docker.tf 第 4 行,在提供者“docker”中:4:depends_on = [
提供程序参数名称“depends_on”保留供 Terraform 在未来版本中使用。
但是阅读更多内容depends_on,我认为无论如何这都不是解决方案。
提供程序配置文档中解释了此限制:
提供者定义的配置参数可以使用表达式进行分配,例如可以允许它们通过输入变量进行参数化。
但是,由于必须评估提供程序配置才能执行任何资源类型操作,因此提供程序配置可能仅引用应用配置之前已知的值。
特别是,避免引用其他资源导出的属性,除非它们的值直接在配置中指定。
例如,这会起作用(但不能解决您的问题):
variable "docker_host" {
type = string
}
provider "docker" {
host = "tcp://${var.docker_host}:2376/"
}
Run Code Online (Sandbox Code Playgroud)
但有出路。
解决方案分为两步:
从 Terraform 后端检索状态数据。这允许您使用一个或多个 Terraform 配置的根级输出作为另一配置的输入数据。
如果您还没有使用“真正的”远程后端,例如 S3 + DynamoDB,您仍然可以使用本地后端轻松进行实验,如下所示。
目录布局:
??? docker <== this performs docker operation
? ??? main.tf
? ??? terraform.tfstate
??? server <== this deploys the droplet
??? main.tf
??? terraform.tfstate
Run Code Online (Sandbox Code Playgroud)
下面的代码片段使用的是 AWS,但适应 DO 是微不足道的。
文件 server/main.tf 包含类似于
resource "aws_instance" "server" { <= equivalent to the Droplet
...
}
output "ipv4_address" {
value = aws_instance.server.public_ip
}
Run Code Online (Sandbox Code Playgroud)
文件 docker/main.tf 包含类似于
data "terraform_remote_state" "docker_server" {
backend = "local"
config = {
path = "${path.module}/../server/terraform.tfstate"
}
}
provider "docker" {
host = "tcp://${data.terraform_remote_state.docker_server.outputs.ipv4_address}:2376/"
}
Run Code Online (Sandbox Code Playgroud)
最后:
cd server
terraform apply
cd ../docker
terraform apply
Run Code Online (Sandbox Code Playgroud)
请记住:您还必须terraform destroy按 LIFO 顺序单独执行:首先 destroy docker,然后 destroy server。
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |