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

时间:2017-07-03 05:48:18

标签: digital-ocean devops terraform configuration-management infrastructure

(请注意:收到初步答案后,这个问题似乎不仅仅是传递变量的问题,但是通过模块化我的配置,请注意底部我对值进行硬编码,但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,以查看是否存在任何模仿它们的奇怪行为,具有相同的行为。

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

3 个答案:

答案 0 :(得分:3)

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

the docs

  

如果当前目录中存在terraform.tfvars文件,Terraform会自动加载它以填充变量。如果文件名为其他名称,则可以直接使用-var-file标志指定文件。这些文件与Terraform配置文件的语法相同。和Terraform配置文件一样,这些文件也可以是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}"

答案 1 :(得分:0)

在“Digital_ocean模块”和“cloudflare提供程序”下,您声明了两个额外的变量(“令牌”和“电子邮件”)但您没有在变量中捕获相应的值.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"

我希望有帮助

答案 2 :(得分:-2)

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

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