7

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. すべての引用符をエスケープする必要があります

  2. すべてを 1 行にする必要があります (?)

  3. 構文の強調表示やテキスト エディターからの同様のヘルプはありません

または、外部プログラム ( などenvsubst) を使用してテンプレートをレンダリングするか、組み込みformat関数をファイル関数と一緒に使用することを検討しましたが、それぞれが面倒です。

私が望むものを達成するための簡単な方法はありますか?

4

3 に答える 3

-1

1年以上経ちました...おそらく、問題の解決策をすでに見つけているでしょう。

私は決して Terraform の専門家ではありませんが、この特定の状況では、必要な情報がドロップレットに含まれているため、必要な構成を作成するスクリプトをドロップレットに渡すことができます...

$ addr=`ip addr show eth1 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1`
$ tee consul.json <<EOF
{
  "server": true,
  "data_dir": "/var/consul/data",
  "ui": true,
  "bind_addr": "$addr"
}
EOF

$ echo 'YES!!' ## LOL

これは、user_data、remote-exec プロビジョナーなどとして機能します...

于 2019-09-12T03:08:40.677 に答える