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)}",
]
}
}
null リソースの 3 つのコピーはすべて、3 つのリソースすべてに依存しているazure_instance
ため、すべてのインスタンスの準備が整うまで作成およびプロビジョニングされません。インスタンスの準備がすべて整ったら、各 null リソースは対応するインスタンスに (インデックスによって) 接続するように構成されconfigure-cluster
、そのインスタンスで架空のコマンドを実行して、クラスター IP アドレスの完全なセットを引数として渡します。
プロビジョナーは、リソースの最初の作成時にのみ実行されることに注意してください。リソースを更新しても、プロビジョナーは再実行されません。null リソースは実際には実際のインフラストラクチャ リソースを表していないため、Terraform が次のリソースを再作成できるように、プロビジョニング手順を簡単に「汚染」して再実行できますapply
。
terraform taint null_resource.provision