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

cod*_*ard 5 infrastructure configuration-management digital-ocean terraform devops

(请注意:在收到初始答案后,此问题似乎不仅仅是传递变量的问题,而是通过模块化配置,请注意底部我对值进行硬编码,但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
Run Code Online (Sandbox Code Playgroud)

我试图将我的Digital Ocean和Cloudflare令牌作为变量传递给它们各自的模块。根目录下的所有内容均master.tf作为模块加载。

我的varaibles.tfvars文件中包含以下内容:

cloudflare_email  ="service@email.com"
cloudflare_token  ="TOKEN_STRING"
do_token          ="${DO_PAT}"
Run Code Online (Sandbox Code Playgroud)

以下行出现在我的 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}"
}
Run Code Online (Sandbox Code Playgroud)

我的digital_ocean模块看起来像

variable "token" {}

provider "digitalocean" {
  token = "${var.token}"
}
Run Code Online (Sandbox Code Playgroud)

而cloudflare提供程序看起来像

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

provider "CloudFlare" {
    email = "${var.email}"
    token = "${var.token}"
}
Run Code Online (Sandbox Code Playgroud)

在DO上设置我的jenkins主服务器

resource "digitalocean_droplet" "jenkins-master" {
...
}
Run Code Online (Sandbox Code Playgroud)

从命令行运行 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}"
Run Code Online (Sandbox Code Playgroud)

使用以上声明,它将使我进入UI模式并提示我输入这些变量,而不是自动读取它们。我已经在Terraform v0.9.8和v0.9.10上复制了此行为。

在我将所有内容分解为单独的模块之前,传入变量都没有问题。

我尝试将提供程序声明放入其中,master.tf以查看是否存在将它们模块化的任何奇怪行为,并且行为相同。

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

vag*_*eli 5

您的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"
Run Code Online (Sandbox Code Playgroud)

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

terraform apply \ 
-var cloudflare_email="service@email.com" \ 
-var cloudflare_token="TOKEN_STRING" \ 
-var do_token="${DO_PAT}"
Run Code Online (Sandbox Code Playgroud)