Terraform – Module 模块的使用

在 Terraform 中,module(模块) 是一组组织良好的 Terraform 配置文件的集合,用于封装和复用基础设施代码。Terraform 模块的作用包括:

1. 代码复用
  • 模块可以封装常见的基础设施组件(如 VPC、EC2、RDS 等),使其可以在多个项目或环境中复用,而无需重复编写相同的代码。
2. 提高可维护性
  • 通过模块化设计,基础设施代码更加清晰,方便团队协作和管理。不同的模块可以独立开发和更新,而不会影响整个 Terraform 配置。
3. 简化配置
  • 使用模块可以将复杂的基础设施分解成多个小的、可管理的部分,使主配置文件更简洁,易于理解。
4. 支持参数化
  • 模块支持通过 输入变量(variables)输出变量(outputs) 进行参数化配置,使其更加灵活,适用于不同的环境或需求。
5. 版本控制
  • Terraform 允许对模块进行版本管理,确保在不同环境中可以使用稳定的版本,避免因配置变更导致的问题。
6. 提升一致性
  • 通过模块,可以确保不同环境(如开发、测试、生产)中的基础设施配置保持一致,减少人为错误。

Module Registry

可以从这里找到模块,有官方提供的module
https://registry.terraform.io/browse/modules

Module Sources

可以从不同的数据源拉去module,比如S3 / Github / Terraform Registry / 本地
可以从文档当中查询获取源的写法方式

https://developer.hashicorp.com/terraform/language/modules/sources

使用案例(本地module)
  1. 在本地创建这个文件夹和文件 modules/ec2/main.tf
terraform {
  required_version = ">= 1.0.0" # Ensure that the Terraform version is 1.0.0 or higher

  required_providers {
    aws = {
      source  = "hashicorp/aws" # Specify the source of the AWS provider
      version = "~> 5.0"        # Use a version of the AWS provider that is compatible with version
    }
  }
}


provider "aws" {
  region = var.region
}

resource "aws_instance" "myec2" {
  ami = var.ami
    instance_type = var.instance_type
}

variable "region" {}
variable "ami" {}
variable "instance_type" {}

2. 在外部使用本地的module

module "ec3" {
  source = "./modules/ec2"
  ami = "ami-0bb84b8ff87024d8"
  instance_type = "t3.micro"
  region = "us-east-1"
}

如果module有使用region了,外部再指定region,那么使用这个module的时候是使用哪个region?
  • 如果module内部没有自己显式定义 provider 配置,那么就会默认继承外部
  • 如果module内部已经有自定义的provider了之后那么就会使用内部的provider为主

Module 当中为什么需要required_provider?

每个module都需要明确声明它所依赖的 provider,这样 Terraform 才能在执行前自动下载并安装正确的 provider 插件。

如果module内部的required_providers使用aws 1.0 版本,但是外部使用aws 5.0 版本的,那么如果在外部应有这个module的话,是使用1.0还是5.0 ?
  • 如果模块内部声明的 aws 版本约束非常严格(例如 "~> 1.0",只允许 1.x 版本),而外部根模块要求使用 aws 5.0,那么这两个版本约束无法同时满足,Terraform 在执行 terraform init 时会报错,提示版本冲突。
  • 如果模块内部的约束比较宽松(例如 ">= 1.0"),那么外部指定的 aws 5.0 只要满足模块内部的约束,就会被选中作为全局使用的 provider 版本。

Loading

Facebook评论