web-dev-qa-db-ja.com

複数のTerraformプロバイダーを順番に使用する方法

プロバイダーごとに毎回「terraforminit」を実行せずに、Terraform 0.10.1で2つの異なるプロバイダーをサポートするにはどうすればよいですか?

Terraformを使用して

1)「DigitalOcean」プロバイダーを使用してAPIサーバーをプロビジョニングします

2)その後、「Docker」プロバイダーを使用してコンテナーを起動します

助言がありますか? Terraformをラップするオーケストレーションスクリプトを作成する必要がありますか?

9
cgiacomi

Terraformの現在の設計は、あるプロバイダーから別のプロバイダーに動的設定を渡す必要があるため、単一の構成で「マルチレイヤー」アーキテクチャを作成するのに苦労しています。

resource "digitalocean_droplet" "example" {
  # (settings for a machine running docker)
}

provider "docker" {
  Host = "tcp://${digitalocean_droplet.example.ipv4_address_private}:2376/"
}

ドキュメントで見たように、動的な値をプロバイダー構成に渡すことは完全には機能しません。実際には部分的に注意して使用すれば機能するので、これを行う1つの方法は、上記のような構成を使用してから、Terraformに最初に液滴を作成します。

$ terraform plan -out=tfplan -target=digitalocean_droplet.example

上記は、Dockerリソースを無視して、ドロップレットとその依存関係のみを処理するプランを作成します。 Dockerドロップレットが起動して実行されたら、通常どおりTerraformを再実行してセットアップを完了することができます。これにより、ドロップレットのipv4_address_private属性が認識されるため、期待どおりに機能するはずです。液滴が交換されない限り、この後は通常どおりTerraformを使用できます。

-targetの使用は面倒なので、現在の推奨事項は、そのようなシステムを複数の構成に分割し、概念的な「レイヤー」ごとに1つにすることです。ただし、これには2つの別々の作業ディレクトリを初期化する必要があります。これは、質問で実行したくないことを示しています。この-targetトリックを使用すると、最初にブートストラップするための型破りなワークフローを犠牲にして、単一の構成内でそれを実行できます。

6
Martin Atkins

たぶん、リソース/モジュール内のプロバイダーを使用して、さまざまなプロバイダーでさまざまなリソースをセットアップできます。

https://www.terraform.io/docs/configuration/providers.html#multiple-provider-instances

このドキュメントでは、同じプロバイダーの複数のインスタンスについて説明していますが、異なるプロバイダーでも同じことができるはずです。

1
Anshu Prateek

少し遅れて...

さて、同じ問題が発生しました。私の回避策は、モジュールを作成することです。

まず、ip変数を使用してDockerプロバイダー用のモジュールが必要です。

# File: ./docker/main.tf
variable "ip" {}

provider "docker" {
    Host = "tcp://${var.ip}:2375/"
}

resource "docker_container" "www" {
    provider = "docker"
    name  = "www"
}

次の1つは、ルート構成にそのモジュラスをロードすることです。

# File: .main.tf
module "docker01" {
    source = "./docker"
    ip = "192.169.10.12"
}

module "docker02" {
    source = "./docker"
    ip = "192.169.10.12"
}

確かに、すべてのノードで同じコンテナーを作成しますが、私の場合はそれが必要でした。私は現在、個別の構成でホストを構成する方法を見つけていません。ネストされたモジュールかもしれませんが、最初の試行では機能しませんでした。

0
skelle