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

28
请注意:在收到最初答案后,此问题似乎不仅仅是传递变量的问题,而且与模块化我的配置有关。请注意底部,在那里我硬编码了值,但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中。

我在我的变量文件variables.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中,以查看是否存在模块化时的任何奇怪行为,结果出现相同的行为。

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


你如何初始化状态文件?你是否正确运行了 terraform init 命令? - BMW
我对Terraform还不熟悉,不知道init命令,但即使运行init也无法解决问题。 - codewizard
对于 CLI,至少应该只引用变量的值,如下所示:terraform apply \ -var cloudflare_email="service@email.com" \ -var cloudflare_token="TOKEN_STRING" \ -var do_token="${DO_PAT}" - vageli
我已经尝试过了,但仍然无法解决这个问题。 - codewizard
你能解决这个问题吗?我在 v0.11.14 上遇到了相同的问题。 - Aurimas Stands with Ukraine
3个回答

43

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

根据文档的说明:

如果当前目录中存在一个名为 terraform.tfvars 的文件,Terraform 就会自动加载它以填充变量。如果文件命名为其他名称,则可以直接使用 -var-file 标志指定文件。这些文件与 Terraform 配置文件具有相同的语法。并且像 Terraform 配置文件一样,这些文件也可以是 JSON。

如果您想使用自己的文件命名约定,可以按照以下方式设置替代 tfvars 文件(根据链接文档):

$ 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}"

抱歉,那是一个打字错误。我会更新它以反映variables.tfvars。让我在0.9.6中测试一下,看看是否解决了这个问题。 - codewizard
嗯,切换到0.9.6似乎不能解决问题。有没有可能说服你上传一个公共的git仓库,展示你所做的工作?我会尝试削减掉我代码中不必要的部分,并将其放在网上。 - codewizard
我在问题的顶部提供了一个指向 Github 存储库的链接。您介意看一下它与您的有何不同吗? - codewizard
在您的代码库中运行代码时,我只被提示输入Digital Ocean令牌。 - vageli
@codewizard 在 master.tf 文件中直接使用 digitalocean 提供程序对我很有帮助。你的问题非常类似于我的同事遇到的一个问题:https://github.com/terraform-providers/terraform-provider-aws/issues/1043 - vageli
显示剩余3条评论

4
在您的“Digital_ocean模块”和“cloudflare提供程序”下,您声明了两个额外的变量(即“token”和“email”),但您没有在variables.tfvars中捕获相应的值。
您的variables.tfvars应该如下所示捕获token和email的值。这样,您就可以使用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"

我希望你能够从中受益。

很遗憾,这不是答案。在调用master.tf中的模块时,我传递了令牌和电子邮件变量。如果我使tfvars到提供程序定义的变量名称一致,也没有帮助。 - codewizard
很好,但是你的master.tf配置文件中没有提到对应值的token和email变量。"${DO_PAT}"的值在哪里传递? - Innocent Anigbo
我不确定我理解你的意思,当我调用模块时,它们在master.tf文件中吗?module "cloud_flare" { source = "./providers/cloud_flare" email = "${var.cloudflare_email}" token = "${var.cloudflare_token}" }DO_PAT是一个环境变量。我猜大概不会被tfvars自动获取,这个变量只是从命令行传递时复制过来的。 - codewizard

-4

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

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


2
请参阅此链接:https://www.terraform.io/docs/language/values/variables.html#variable-definitions-tfvars-files#:~:text=terraform%20apply%20-var-file=%22testing.tfvars%22 - Ked Mardemootoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接