azure - 如何以与云无关的方式使用 Terraform

标签 azure amazon-web-services terraform

我见过很多关于如何使用 Terraform 启动 AWS 资源的示例。我还看到许多声称 Terraform 与云无关的说法。

我还没有看到如何使用单个 tf 文件在 AWS 或 Azure 中启动包含一些子网、一些实例、一些 ELB 和一些数据库的 VPC 的示例。

有人有这方面的例子吗?

最佳答案

虽然 Terraform 作为一种工具与云无关(因为它将支持任何公开其 API 的内容,并且有足够的开发人员支持来为其创建“提供者”),但 Terraform 本身根本不会对此进行抽象,我认为认真考虑这是否是一个好主意,除非您有一个非常好的用例。

如果您确实需要这样做,则需要在从模块用户抽象云层的基础上构建一堆模块,并允许他们将云提供商指定为变量(可能可以从外部控制)脚本)。

作为抽象 DNS 的基本示例,您可能有这样的内容(未经测试):

modules/google/dns/record/main.tf

variable "count" = {}

variable "domain_name_record" = {}
variable "domain_name_zone" = {}
variable "domain_name_target" = {}

resource "google_dns_record_set" "frontend" {
  count = "${variable.count}"
  name  = "${var.domain_name_record}.${var.domain_name_zone}"
  type  = "CNAME"
  ttl   = 300

  managed_zone = "${var.domain_name_zone}"

  rrdatas = ["${var.domain_name_target}"]
}

模块/aws/dns/record/main.tf

variable "count" = {}

variable "domain_name_record" = {}
variable "domain_name_zone" = {}
variable "domain_name_target" = {}

data "aws_route53_zone" "selected" {
  count = "${variable.count}"
  name  = "${var.domain_name_zone}"
}

resource "aws_route53_record" "www" {
  count   = "${variable.count}"
  zone_id = "${data.aws_route53_zone.selected.zone_id}"
  name    = "${var.domain_name_record}.${data.aws_route53_zone.selected.name}"
  type    = "CNAME"
  ttl     = "60"
  records = [${var.domain_name_target}]
}

modules/generic/dns/record/main.tf

variable "cloud_provider" = { default = "aws" }

variable "domain_name_record" = {}
variable "domain_name_zone" = {}
variable "domain_name_target" = {}

module "aws_dns_record" {
  source             = "../../aws/dns/record"
  count              = "${var.cloud_provider == "aws" ? 1 : 0}"
  domain_name_record = "${var.domain_name_record}"
  domain_name_zone   = "${var.domain_name_zone}"
  domain_name_target = "${var.domain_name_target}"
}

module "google_dns_record" {
  source             = "../../google/dns/record"
  count              = "${var.cloud_provider == "google" ? 1 : 0}"
  domain_name_record = "${var.domain_name_record}"
  domain_name_zone   = "${var.domain_name_zone}"
  domain_name_target = "${var.domain_name_target}"
}

显然,这会很快变得复杂,但这确实意味着您可以向其他人公开“通用”模块,并允许他们使用您在事物上构建的抽象。如何处理不同云之间功能不一致的情况是一个完全独立的问题,并且可能不是最适合 StackOverflow。

关于azure - 如何以与云无关的方式使用 Terraform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789247/

相关文章:

azure - 持久 Azure Functions 是否可以跨编程语言(C# 到 Python Azure Functions)进行通信?

node.js - Socket.io + Nginx + AWS Application Load Balancer 连接在建立之前关闭

sql - AWS Redshift 可以删除包含在事务中的表吗?

apache - 在 AWS EC2 实例上启用 SSL

azure - 使用 Azure Terraform AzApi 提供程序为容器应用程序环境启用内部负载平衡模式

python - 如何使用 azure-sdk-for-python 删除磁盘?

Azure 实时登录可以在本地主机上使用,但在部署到 Azure 时则无法使用

php - 无法登录 TeSTLink - 未保存 session /cookie

list - 如何 append 到 Terraform 中的列表?

azure - Terraform with Azure - 强制资源的唯一名称的问题