模块中的Terraform提供程序/变量共享

问题描述 投票:6回答:3

有没有一种方法可以为项目中定义的所有模块提取提供程序。

例如,我有这个项目

├── modules
│   ├── RDS
│   └── VPC
└── stacks
    ├── production
    │   └── main.tf
    └── staging
        └── main.tf

它工作得很好......问题在于模块的定义

├── RDS
│   ├── README.md
│   ├── main.tf
│   ├── providers.tf
│   └── variables.tf
└── VPC
    ├── README.md
    ├── main.tf
    ├── providers.tf
    └── variables.tf

这两个模块中的提供者完全相同

# providers.tf
provider "aws" {
  region = "${var.region}"
  version = "~> 1.26"
}

并且每个模块中的变量都不同,但它们都具有region变量。

# variables.tf
variable "region" {
  default     = "eu-central-1"
  description = "AWS region."
}
# other module dependent variables...

有没有办法在模块级别定义那些信息位,以便我最终得到类似于此的东西

├── modules
│   ├── providers.tf  <<< include the *shared* provider definition block
│   ├── variables.tf  <<< include the *shared* region vaiable definition block
│   ├── RDS
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── variables.tf
│   └── VPC
│       ├── README.md
│       ├── main.tf
│       └── variables.tf

最后一点,大多数时候模块定义都有一个资源属性(从terraform注册表中提取一个模块......因此我不知道从注册表和基础模块继承源代码是否可行)

terraform terraform-provider-aws terragrunt
3个回答
3
投票

现在,它无法实现这一目标。之前有关github的讨论涉及以下问题中的同一主题:

TL; DR 模块之间共享变量是违反terraform核心清晰度/明确性原则的。

解决方法 解决方法是将*shared*文件放在父目录中,并使用符号链接将它们添加到模块中。


2
投票

如果你知道terragrunt,这将是没有问题的。

Terragrunt是Terraform的薄包装器,可为多个Terraform模块提供额外的工具。

它专为您遇到的问题而设计。

account
 └ _global
 └ region
    └ _global
    └ environment
       └ resource

Quick start

查看terragrunt-infrastructure-modules-exampleterragrunt-infrastructure-live-example repos以获取演示这些功能的完整工作示例代码

你可以使用prod/terraform.tfvarsprod/account.tfvars作为全局变量,或者将tfvars文件放在_global文件夹下。


1
投票

您可以通过传入要使用的提供程序别名来从模块中抽象提供程序参数。这允许您创建一个模块而不引用Region之类的东西,然后在调用时传递这些细节。

对于您的用例,您可以在堆栈文件夹中定义别名提供程序(可能最好在文件中定义它并为每个堆栈文件夹创建符号链接):

# stacks/{staging,production}/providers.tf
provider "aws" {
  alias  = "us-east-1"
  region = "us-east-1"
}

provider "aws" {
  alias   = "us-east-2"
  region  = "us-east-2"
}

然后,当您调用模块时,传入要使用的提供程序别名(这假定模块仅使用任何特定提供程序类型中的1个):

# stacks/{staging,production}/main.tf
module "VPC-us-east-1" {
  source = "../../modules/VPC"

  providers = {
    aws      = "aws.us-east-1"
  }
}

module "VPC-us-east-2" {
  source = "../../modules/VPC"

  providers = {
    aws      = "aws.us-east-2"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.