Terraform 如何顺序使用多个地形提供程序

Terraform 如何顺序使用多个地形提供程序,terraform,Terraform,如何让Terraform 0.10.1支持两个不同的提供程序,而不必每次为每个提供程序运行“Terraform init” 我正在尝试使用地形来 1) 使用“DigitalOcean”提供程序设置API服务器 2) 随后,使用“Docker”提供程序启动容器 有什么建议吗?我是否需要编写一个编排脚本来包装Terraform?也许您可以使用资源/模块中的提供者实例来设置各种提供者的各种资源 文档中提到了同一提供商的多个实例,但我认为,对于不同的提供商,同样的做法也应该可行。Terraform当前

如何让Terraform 0.10.1支持两个不同的提供程序,而不必每次为每个提供程序运行“Terraform init”

我正在尝试使用地形来

1) 使用“DigitalOcean”提供程序设置API服务器

2) 随后,使用“Docker”提供程序启动容器


有什么建议吗?我是否需要编写一个编排脚本来包装Terraform?

也许您可以使用资源/模块中的提供者实例来设置各种提供者的各种资源


文档中提到了同一提供商的多个实例,但我认为,对于不同的提供商,同样的做法也应该可行。

Terraform当前的设计难以在单个配置中创建“多层”架构,因为需要将动态设置从一个提供商传递到另一个提供商:

resource "digitalocean_droplet" "example" {
  # (settings for a machine running docker)
}

provider "docker" {
  host = "tcp://${digitalocean_droplet.example.ipv4_address_private}:2376/"
}
正如您在文档中看到的,将动态值传递到提供程序配置中并不完全有效。如果你小心使用它,它实际上会部分起作用,因此实现这一点的一种方法是使用如上所述的配置,然后通过强制Terraform首先创建水滴来解决“鸡和蛋”问题:

$ terraform plan -out=tfplan -target=digitalocean_droplet.example
上面将创建一个只处理液滴及其任何依赖项的计划,而忽略docker资源。一旦Docker droplet启动并运行,您就可以正常地重新运行Terraform以完成设置,然后该设置应按预期工作,因为droplet的
ipv4\u address\u private
属性将被知道。只要不更换液滴,此后Terraform可以正常使用

使用
-target
非常灵活,因此当前的建议是将此类系统分成多个配置,每个概念“层”对应一个配置。但是,这确实需要初始化两个单独的工作目录,您在问题中指出不想这样做。此
-target
技巧允许您在单个配置中完成此任务,而牺牲了一个非常规的工作流来完成初始引导。

有点晚了

嗯,我也有同样的问题。我的解决方法是创建模块

首先,您需要为docker Provider提供一个带有ip变量的模块:

# File: ./docker/main.tf
variable "ip" {}

provider "docker" {
    host = "tcp://${var.ip}:2375/"
}

resource "docker_container" "www" {
    provider = "docker"
    name  = "www"
}
下一步是在根配置中加载该模块:

# File: .main.tf
module "docker01" {
    source = "./docker"
    ip = "192.169.10.12"
}

module "docker02" {
    source = "./docker"
    ip = "192.169.10.12"
}

的确,您将在每个节点上创建相同的容器,但在我的情况下,这正是我想要的。我目前还没有找到一种方法来配置具有单独配置的主机。可能是嵌套模块,但在第一次尝试中没有起作用。

您的目标是在DigitalOcean水滴上运行Docker吗?也就是说,您的
docker
提供商配置将包含使用
digitalocean
提供商创建的水滴的IP地址?没错,但我从terraform文档中知道,您不能将模块或资源的输出作为输入传递给提供商。如中所述:(参见本页末尾的注释),因此作为第一步,我只想让多个提供商在同一个terraform“项目”中共存。在我的例子中,“DigitalOcean”提供程序和“Docker”提供程序不必每次在提供程序之间切换时都运行“terraform init”。我现在正在查看terraform工作区,看看是否可以根据需要使用它们。感谢您的回答,但这仍然是一个多次使用的单一提供程序,相反,我希望多个提供商一个接一个地运行,而不是同时运行。感谢您的解决方案,我认为Terraform最终应该解决这个问题,但在此之前,这是解决这个问题的最干净的方法。github的一个问题描述了如何最终解决这个问题的当前想法: