如何在 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 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 系列视频