gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:31:48 27 4
gpt4 key购买 nike

我见过很多关于如何使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com