Terraform 有一个 Azure 提供程序,尽管我认为在您提出原始问题时它尚未开发。
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