如何通过 CLI 或 tfvars 文件将变量传递给 Terraform 模块?

How to pass Variables to Terraform modules via CLI or tfvars file?

(请注意:在收到初步答复后,这个问题似乎不仅仅是传递变量的问题,而是模块化我的配置的问题,请注意底部我对值进行硬编码的地方 UI提示我提供值)

Code example here

我有一个项目我已经分解成以下目录结构

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  ="service@email.com"
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 "cloudflare_email=service@email.com" \
  -var "cloudflare_token=TOKEN_STRING" \
  -var "do_token=${DO_PAT}"

有了上面的声明,它会让我进入 UI 模式并提示我输入这些变量,而不是自动读取它们。我已经在 Terraform v0.9.8 和 v0.9.10 上复制了这种行为。

在我开始将所有内容分解成单独的模块之前,传入变量没有任何问题。

我已经尝试将提供者声明拉入 master.tf 以查看是否有任何奇怪的行为与模块化它们,具有相同的行为。

我还尝试将这些值硬编码到提供者声明中,并且遇到了相同的行为。

在你的 "Digital_ocean module" 和 "cloudflare provider" 下,你声明了两个额外的变量(即 "token" 和 "email")但是你没有在你的variables.tfvars

您的 vairables.tfvars 应捕获令牌和电子邮件的值,如下所示。这样你就可以使用 terraform apply -var-file="variables.tfvars" 而不会出现问题

cloudflare_email  ="service@email.com"
cloudflare_token  ="TOKEN_STRING"
do_token          ="${DO_PAT}"
token             ="token_string"
email             ="another@email.com"

或如下用 var 明确提及

terraform apply -var "cloudflare_email=service@email.com" -var "cloudflare_token=TOKEN_STRING" -var "do_token=${DO_PAT}" -var "token=TOKEN_string -var "email=another@email.com"

希望对您有所帮助

您的 variables.tfvars 文件应命名为 terraform.tfvars.

根据 the docs:

If a terraform.tfvars file is present in the current directory, Terraform automatically loads it to populate variables. If the file is named something else, you can use the -var-file flag directly to specify a file. These files are the same syntax as Terraform configuration files. And like Terraform configuration files, these files can also be JSON.

如果您想使用自己的文件命名约定,您可以设置一个带有 -var-file 标志的替代 tfvars 文件,如下所示(根据 linked docs):

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

对于 CLI,您应该只引用变量的值,如下所示:

terraform apply \ 
-var cloudflare_email="service@email.com" \ 
-var cloudflare_token="TOKEN_STRING" \ 
-var do_token="${DO_PAT}"

这是错误的 terraform apply -var-file="variables.tfvars"

terraform apply 没有这个选项 var-file ,只有 plan 有。