web-dev-qa-db-ja.com

CLIまたはtfvarsファイルを介して変数をTerraformモジュールに渡す方法は?

(注意:最初の回答を受け取った後、この問題は変数の受け渡しに関する問題だけでなく、構成のモジュール化に関する問題のようです。下部に値をハードコーディングしているのに、UIから値の入力を求められることに注意してください)

ここのコード例

次のディレクトリ構造に分割したプロジェクトがあります

master.tf
variables.tfvars
- providers/
-- digital_ocean/
--- digital_ocean.tf
--- variables.tf
-- cloud_flare/
--- cloud_flare.tf
--- variables.tf
- management/
-- jenkins/
--- jenkins-master.tf

Digital OceanトークンとCloudflareトークンを変数として、それぞれのモジュールに渡そうとしています。ルートディレクトリの下にあるものはすべて、モジュールとしてmaster.tfにロードされます。

Varaibles.tfvarsファイルに次のものがあります。

cloudflare_email  ="[email protected]"
cloudflare_token  ="TOKEN_STRING"
do_token          ="${DO_PAT}"

次の行が私のmaster.tfに表示されます

variable "do_token" {}
module "digital_ocean" {
    source          = "./providers/digital_ocean"
    token           = "${var.do_token}"
}


variable "cloudflare_email" {}
variable "cloudflare_token" {}
module "cloud_flare" {
    source          = "./providers/cloud_flare"
    email = "${var.cloudflare_email}"
    token = "${var.cloudflare_token}"
}

私のdigital_oceanモジュールは次のようになります

variable "token" {}

provider "digitalocean" {
  token = "${var.token}"
}

そしてcloudflareプロバイダーは次のようになります

variable "email" {}
variable "token" {}

provider "CloudFlare" {
    email = "${var.email}"
    token = "${var.token}"
}

DOでjenkinsマスターサーバーをセットアップする

resource "digitalocean_droplet" "jenkins-master" {
...
}

コマンドラインから実行していますterraform apply -var-file="variables.tfvars"

または、CLIを介してそれらを渡すことも試みました。

terraform apply \
  -var "[email protected]" \
  -var "cloudflare_token=TOKEN_STRING" \
  -var "do_token=${DO_PAT}"

上記の宣言を使用すると、UIモードになり、変数を自動的に読み取るのではなく、それらの変数の入力を求められます。この動作をTerraformv0.9.8とv0.9.10の両方で複製しました。

すべてを別々のモジュールに分割し始める前は、変数を渡しても問題はありませんでした。

プロバイダー宣言をmaster.tfにプルして、同じ動作でモジュール化することで奇妙な動作がないかどうかを確認しました。

また、値をプロバイダー宣言にハードコーディングしようとしましたが、同じ動作が発生しています。

5
codewizard

variables.tfvarsファイルの名前はterraform.tfvarsにする必要があります。

あたり ドキュメント

Terraform.tfvarsファイルが現在のディレクトリに存在する場合、Terraformはそれを自動的にロードして変数を設定します。ファイルに別の名前が付けられている場合は、-var-fileフラグを直接使用してファイルを指定できます。これらのファイルは、Terraform構成ファイルと同じ構文です。また、Terraform構成ファイルと同様に、これらのファイルもJSONにすることができます。

独自のファイル命名規則を使用する場合は、次のように--var-fileフラグを使用して代替のtfvarsファイルを設定できます( リンクされたドキュメント による):

$ terraform plan \
-var-file="secret.tfvars" \
-var-file="production.tfvars"

CLIの場合、次のように変数の値のみを引用する必要があります。

terraform apply \ 
-var cloudflare_email="[email protected]" \ 
-var cloudflare_token="TOKEN_STRING" \ 
-var do_token="${DO_PAT}"
5
vageli

「Digital_oceanモジュール」と「cloudflareプロバイダー」の下で、2つの追加変数(「ト​​ークン」と「メール」)を宣言しましたが、変数に対応する値をキャプチャしていません。tfvars

Vairables.tfvarsは、以下のようにトークンと電子メールの値をキャプチャする必要があります。そうすれば、問題なくterraform apply -var-file="variables.tfvars"を使用できます

cloudflare_email  ="[email protected]"
cloudflare_token  ="TOKEN_STRING"
do_token          ="${DO_PAT}"
token             ="token_string"
email             ="[email protected]"

または、以下のようにvarで明示的に言及します

terraform apply -var "[email protected]" -var "cloudflare_token=TOKEN_STRING" -var "do_token=${DO_PAT}" -var "token=TOKEN_string -var "[email protected]"

お役に立てば幸いです

1
Innocent Anigbo