如何按顺序使用多个Terraform Providers

cgi*_*omi 8 terraform

如何让Terraform 0.10.1支持两个不同的提供商而不必每次为每个提供商运行'terraform init'?

我正在尝试使用Terraform

1)使用'DigitalOcean'提供程序提供API服务器

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

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

Mar*_*ins 7

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

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

provider "docker" {
  host = "tcp://${digitalocean_droplet.example.ipv4_address_private}:2376/"
}
Run Code Online (Sandbox Code Playgroud)

如您在文档中所见,将动态值传递到提供程序配置中并不能完全起作用。如果谨慎使用它,它实际上确实可以部分起作用,因此完成此操作的一种方法是使用上述配置,然后通过强制Terraform首先创建液滴来解决“鸡与蛋”问题:

$ terraform plan -out=tfplan -target=digitalocean_droplet.example
Run Code Online (Sandbox Code Playgroud)

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

使用-target很麻烦,因此当前的建议是将这样的系统分成多个配置,每个概念“层”一个。但是,这确实需要初始化两个单独的工作目录,您在问题中表示不想这样做。此-target技巧使您可以在单个配置中完成它,而以非常规的工作流为代价来使其最初启动。

  • 有一个 github 问题描述了如何最终解决此问题的当前想法:https://github.com/hashicorp/terraform/issues/4149 (2认同)