Terraform有an Azure provider,虽然我认为它还没有在你问你原来的问题的时候开发。
Terraform允许创建同一资源的多个“副本”,这对于创建群集很有用。但是,将所有主机的IP地址一起传递到这些实例中可能会非常棘手,因为提供步骤必须等到所有实例都完成为止。这种排序的常见解决方法是使用未公开的null_resource
在主机上运行独立配置步骤。例如:
resource "azure_instance" "web" {
name = "terraform-test"
hosted_service_name = "${azure_hosted_service.example.name}"
image = "Ubuntu Server 14.04 LTS"
size = "Basic_A1"
storage_service_name = "yourstorage"
location = "West US"
username = "terraform"
password = "Pass!admin123"
# Tell Terraform to create 3 identical instances.
count = 3
endpoint {
name = "SSH"
protocol = "tcp"
public_port = 22
private_port = 22
}
}
resource "null_resource" "provision" {
count = 3
connection {
host = "${lookup(azura_instance.web.*.ip_address, count.index)}"
user = "terraform"
password = "Pass!admin123"
}
provisioner "remote-exec" {
inline = [
"/usr/local/bin/configure-cluster ${join(" ", azura_instance.web.*.ip_address)}",
]
}
}
空资源都依赖于所有三种azure_instance
资源的三个副本,这样就不会被创建并置备直到所有的情况下都准备好了。一旦实例都准备好了,每个空资源都被配置为连接到其相应的实例(按索引),然后在其实例上运行虚拟的configure-cluster
命令,传入整组集群IP地址作为参数。
请注意,提供者仅在最初创建资源时运行。对资源的更新不会重新运行置备程序。由于空资源实际上并不代表真实的基础设施资源,供应的步骤很容易被“玷污”它使Terraform将在下一个apply
重新创建它重新运行:
terraform taint null_resource.provision