(请注意:收到初步答案后,这个问题似乎不仅仅是传递变量的问题,而是模块化我的配置,请注意在底部我硬编码值但 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 token 作为变量传递给它们各自的模块。根目录下的所有内容都加载到
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
看看模块化它们是否有任何奇怪的行为,具有相同的行为。我还尝试将值硬编码到提供程序声明中,并且遇到了相同的行为。
最佳答案
您的 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}"
关于digital-ocean - 如何通过 CLI 或 tfvars 文件将变量传递给 Terraform 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44878553/