如何按顺序使用多个Terraform Providers

时间:2017-08-17 12:18:28

标签: terraform

我怎样才能让Terraform 0.10.1支持两个不同的提供商,而不必每次为每个提供商运行'terraform init'?

我正在尝试使用Terraform

1)使用'DigitalOcean'提供商

配置API服务器

2)随后使用'Docker'提供程序来启动我的容器

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

3 个答案:

答案 0 :(得分:6)

Terraform目前的设计正在努力创造"多层"单一配置中的体系结构,因为需要将动态设置从一个提供者传递到另一个提供者:

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

provider "docker" {
  host = "tcp://${digitalocean_droplet.example.ipv4_address_private}:2376/"
}

正如您在文档中看到的那样,将动态值传递给提供程序配置并不完全有效。如果你小心使用它,它实际上部分工作,所以完成这项工作的一种方法是使用如上所述的配置,然后解决"鸡蛋和鸡蛋"通过强制Terraform首先创建Droplet来解决问题:

$ terraform plan -out=tfplan -target=digitalocean_droplet.example

以上将创建一个仅处理Droplet及其任何依赖项的计划,忽略docker资源。一旦Docker Droplet启动并运行,您就可以正常重新运行Terraform以完成设置,然后设置应该按预期工作,因为Droplet的ipv4_address_private属性将会被知道。只要液滴永远不会被替换,Terraform就可以在此之后正常使用。

使用-target非常繁琐,因此目前的建议是将这些系统分成多个配置,每个配置一个用于概念"层"。但是,这需要初始化两个单独的工作目录,您在问题中表明了您不想这样做。这个-target技巧允许您在单个配置中完成它,但代价是非常规的工作流程,以使其最初被引导。

答案 1 :(得分:0)

也许您可以在资源/模块中使用提供程序来设置各种提供程序的各种资源。

https://www.terraform.io/docs/configuration/providers.html#multiple-provider-instances

该文档讨论了同一个提供者的多个实例,但我认为同样的提供者也应该可以使用不同的提供者。

答案 2 :(得分:0)

有点晚了......

好吧,得到了同样的问题。我的解决方法是创建模块。

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

# 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"
}

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