Terraform を使用して、DigitalOcean で Consul を実行する複数のドロップレットをセットアップしています。おそらく私は何か基本的なことを見逃していますが、それらに適切な設定を提供することは驚くほど難しいようです.
resource "digitalocean_droplet" "prime" {
count = 3
image = "${data.digitalocean_image.prime.image}"
name = "${format("%s-%02d-%s", "prime", count.index + 1, var.region)}"
private_networking = true
# ...
}
各マシンには、パブリックとプライベートの 2 つのネットワーク インターフェイスがあります。bind_addr
このセットアップでは、各ドロップレットのプライベート IP アドレスを指定する必要があるようです。そうしないと、複数のプライベート (?!) アドレスがあるというエラーで consul が終了します。
bind_addr
最も簡単な解決策は、次のように、それぞれの場合でほぼ同じであるが、フィールドの値が異なる構成ファイルを使用して各マシンをプロビジョニングすることです。
{
"server": true,
"data_dir": "/var/consul/data",
"ui": true,
"bind_addr": "${ private_ipv4_address }"
}
それはテンプレートの目的ではありませんか?それらをそのように使用する方法がわかりません。テンプレートの変数は、テンプレートが定義されているときに一度だけ提供できるようです。
data "template_file" "consul-config" {
template = "${file("templates/consul-config.json.tpl")}"
vars {
private_ipv4_address = "10.0.0.1" # At this point the real address is not known
}
}
resource "digitalocean_droplet" "prime" {
...
provisioner "file" {
content = "${data.template_file.consul-config.rendered}"
destination = "/etc/consul.d/server.json"
# At this point the address is known: ${ self.private_ipv4_address },
# but is it possible to pass it to the template?
}
}
リソース ブロックにデータ ブロックをネストしようとしましたが、次のようなエラーが発生します。
Error: resource 'digitalocean_droplet.prime' provisioner file (#7): unknown resource 'data.template_file.consul-config' referenced in variable data.template_file.consul-config.rendered
私が現在使用している回避策は、構成を 2 つの部分 (サーバーとカスタム) に分割し、ファイル プロビジョナーでカスタムの内容をインライン化することです。
resource "digitalocean_droplet" "prime" {
# ...
provisioner "file" {
content = "${data.template_file.consul-config.rendered}"
destination = "/etc/consul.d/server.json"
}
# This is a custom configuration for each particular droplet
provisioner "file" {
content = "{ \"bind_addr\": \"${ self.ipv4_address_private }\", \"bootstrap\": ${ count.index == 0 } }"
destination = "/etc/consul.d/custom.json"
}
}
機能しますが、いくつかの理由で読みやすさが妨げられます。
すべての引用符をエスケープする必要があります
すべてを 1 行にする必要があります (?)
構文の強調表示やテキスト エディターからの同様のヘルプはありません
または、外部プログラム ( などenvsubst
) を使用してテンプレートをレンダリングするか、組み込みformat
関数をファイル関数と一緒に使用することを検討しましたが、それぞれが面倒です。
私が望むものを達成するための簡単な方法はありますか?