我怎样才能让Terraform 0.10.1支持两个不同的提供商,而不必每次为每个提供商运行'terraform init'?
我正在尝试使用Terraform
1)使用'DigitalOcean'提供商
配置API服务器2)随后使用'Docker'提供程序来启动我的容器
有什么建议吗?我是否需要编写一个包装Terraform的编排脚本?
答案 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"
}
是的,您将在每个节点上创建相同的容器,但在我的情况下,这就是我想要的。我目前还没有找到一种方法来配置具有单独配置的主机。也许嵌套模块,但在第一次尝试时不起作用。