如何在 Hashicorp Terraform 中配置环境变量

Posted

技术标签:

【中文标题】如何在 Hashicorp Terraform 中配置环境变量【英文标题】:How to configure environment variables in Hashicorp Terraform 【发布时间】:2019-07-29 19:59:48 【问题描述】:

我对 Terraform 还很陌生,尽管我已经浏览了 Hashicorp 网站上提供的所有教学模块。

目前,我正在努力理解如何设置环境变量。我知道如何在 main.tf 配置 (access_key = "$var.access_key") 中引用变量,并且我知道如何将该访问密钥保存到一个单独的文件并引用它,但是我不明白(并且找不到任何文档/instruction on) 是如何设置环境变量,所以我不必将访问密钥保存到文件中。

有谁知道如何最好地做到这一点?

【问题讨论】:

【参考方案1】:

Terraform 可以为 AWS 推断以下环境变量

export AWS_ACCESS_KEY_ID="anaccesskey"
export AWS_SECRET_ACCESS_KEY="asecretkey"

参考:https://www.terraform.io/docs/providers/aws/#environment-variables

但我建议尝试AWS Profile。 您可以将凭据添加到 ~/.aws/credentials 文件,如

[myprofile]
aws_access_key_id     = anaccesskey
aws_secret_access_key = asecretkey

然后你可以设置环境变量export AWS_PROFILE=myprofile。现在,如果你从这个 shell 运行 terraform,它应该会选择 myprofile 下列出的凭据。

另外,你可以让你AWS Provider 代码如下:

provider "aws" 
  profile = "myprofile"
  region  = "$var.region"

根据我的经验,使用 profile 与 AWS 交互比在每个 shell 上设置环境变量更简单且更好。

你可以在这里参考一个例子https://github.com/pradeepbhadani/tf-examples/blob/master/ex2/provider.tf

希望这会有所帮助。

【讨论】:

感谢您提供这些建议。不过,我正试图让这个在 Azure 中工作,只是作为概念证明。我可能会在未来的某个时候看看 AWS Vault。【参考方案2】:

您可以直接通过环境变量设置提供者凭据/配置。例如,对于 AWS 提供商,您可以使用 AWS SDK environment variables,如 AWS provider documentation 中所述:

您可以通过环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 提供您的凭证,分别代表您的 AWS 访问密钥和 AWS 密钥。

示例用法如下:

$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="asecretkey"
$ export AWS_DEFAULT_REGION="us-west-2"
$ terraform plan

对于Azure provider,大部分provider config可以通过环境变量设置,无需在provider配置中定义:

$ export ARM_CLIENT_ID="aclientid"
$ export ARM_SUBSCRIPTION_ID="asubscriptionid"
$ export ARM_TENANT_ID="atenantid"
$ terraform plan

在更一般的情况下,Terraform 将自动加载任何以TF_VAR_ 为前缀的已定义变量。

所以如果你有这样的事情:

variable "foo" 

您可以通过导出TF_VAR_foo 环境变量来设置值:

export TF_VAR_foo=bar

【讨论】:

感谢您的快速回复!只是为了提供更多细节,我正在使用 AzureRM Provider,作为参考,这里是我的一些 main.tf 配置: provider "azurerm" version = "=1.20.0" access_key = "$var.access_key " region = "$var.region" 这是我的 variables.tf 配置文件: variable "access_key" variable "region" default = "eastus" 我......我想我仍然不确定如何将我的访问密钥分配给 $var.access_key 变量。我肯定错过了什么。抱歉太密集了! 也很抱歉,不知道如何让格式与这些 cmets 配合! Azure 提供程序不采用access_key 参数。可能值得快速阅读AzureRM provider docs 以更好地了解如何使用它。 啊,有道理。也许我实际上是在错误地表达我的问题。所以,参考这篇文章(docs.microsoft.com/en-us/azure/terraform/terraform-backend),这基本上就是我想要做的。我只是想获取存储在 Azure Key Vault 中的 Azure 存储帐户访问密钥,我无法让 export ARM_ACCESS_KEY= 命令正确运行。 看起来你在做两件不同的事情。从 tf 文件中删除对“access_key”的任何引用,然后尝试在 tf plan 之前运行 export ARM_ACCESS_KEY=<your key>【参考方案3】:
    当我开始学习 tf 时,我使用了一个 terraform.tfvars 文件,我在其中放置了:
aws_access_key="myaccesskey"
aws_secret_key="mysecertkey"
region='aws-region'

main.tf:


variable "aws_access_key" 
variable "aws_secret_key" 
variable "private_key_path" 

provider "aws" 
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.region

确保两个文件在同一个目录中。

    然后我开始在 Mac 中使用环境变量:
$ export AWS_ACCESS_KEY_ID="AWS_ACCESS_KEY_ID"
$ export AWS_SECRET_ACCESS_KEY="AWS_SECRET_ACCESS_KEY"
$ terraform plan
    使用配置文件,~/.aws/credentials
aws configure
AWS Access Key ID: yourID
AWS Secret Access Key: yourSecert
Default region name : aws-region
Default output format : env

希望对你有帮助!

祝你好运,terraform 是一门很棒的学习!

【讨论】:

【参考方案4】:

Terraform 使用环境变量的方式,因此所有好东西 Terraform 的任意值是通过在 any environment 变量前面加上 TF_VAR_ 然后 Terraform 将自动使用它.

对于您的特定用例,这意味着您可以通过设置 **environment* 变量 TF_VAR_access_key 来设置 Terraform 变量 access_key

此技术内置于 Terraform 本身,因此独立于任何特定的提供者。

文档可以在https://www.terraform.io/docs/commands/environment-variables.html#tf_var_name 找到它也适用于 Terraform 版本(我已经用 0.11 对其进行了测试)。

【讨论】:

以上是关于如何在 Hashicorp Terraform 中配置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

译微软出品HashiCorp Terraform 和 Vault 系列视频

京东云携手HashiCorp,宣布推出Terraform Provider

json HashiCorp Terraform AWS和DOCKER正在运行

微软出品HashiCorp Terraform 和 Vault 系列视频

GMO Media 使用 HashiCorp Terraform Enterprise 自动配置基础

如何在 VS Code 中配置 terraform 代码的对齐和缩进?