Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terraform 如何在地形中概括资源等?_Terraform - Fatal编程技术网

Terraform 如何在地形中概括资源等?

Terraform 如何在地形中概括资源等?,terraform,Terraform,我一直在试验terraform和AWS,做了如下工作: ... provider "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}" } resource "aws_instance" "bastion" { ami = "${var.image}" instance_type = "${var.inst_type}" key

我一直在试验terraform和AWS,做了如下工作:

...
provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

resource "aws_instance" "bastion" {
  ami = "${var.image}"
  instance_type = "${var.inst_type}"
  key_name = "My Keys"
  subnet_id = "${aws_subnet.my_public_subnet.id}"
  vpc_security_group_ids = [
    "${aws_security_group.my_vpc_security_group.id}"
  ]
  tags={
    Name="${var.inst_name}"
  }
}
...
但现在我想离开AWS一步,写一些与AWS无关的东西,但最好对所有云提供商都适用。有没有办法做到这一点?我真的希望能给我一些正确方向的建议

==编辑===


也许我需要进一步解释一下:我并不是要对AWS API中的所有内容进行全面概括。但是,由于大多数云环境(如果不是全部的话)允许您使用Linux创建VM,并且还可以通过terraform设置一些初始配置,因此应该可以参数化特定于提供商的部分,以便我可以编写基本的基础架构结构代码,并指定是否使用AWS、Azure、,谷歌等作为一组参数。我的问题是,我没有花足够长的时间研究terraform如何做到这一点。

这不可能推广解决方案。不同的云技术有不同的产品和不同的API供它们连接。这就是terraform在start中请求提供程序信息的原因,这样它就可以加载特定的提供程序SDK来与API通信。

您可以使用来构建一些东西。您可以尝试构建一个云不可知的VM模块,并根据一些交换机决定云提供商

然而,这并不是Terraform设计的目的,所以它可能会变得混乱

resource "azurerm_virtual_machine" "main" {
  name                  = "${var.prefix}-vm"
  count                  = "${var.deployToAzure ? 1 : 0}"
  ...
}

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  count         = "${var.deployToAws ? 1 : 0}"
}


作为更现实的第一步,您可以围绕这些VM资源构建自己的模块。因此,您将有一个Azure VM模块,AWS也是如此。如果您努力为这些模块保留类似的接口,那么您的实际基础架构代码对云提供商的依赖性就会降低。

原则上,您可以使用在Terraform中创建

话虽如此,您实际上只能抽象出等价的概念。Terraform指南中的一个例子是DNS记录:这是一个标准概念,在不同的供应商中有许多不同的实现,因此,合理的做法是定义一组约定,以允许一个模块生成一组请求的DNS记录,然后可以将这些记录传递给选择的特定于供应商的DNS记录集模块中的任何一个。在本文中有一些这样的例子(大部分是实验性的,在撰写本文时)

对虚拟机服务进行抽象是一个更为困难的建议,因为在所有供应商中都没有一个明确和明显的通用特性集。要做到这一点,需要在如何推广方面做出一些权衡,而您所做的决定将限制您使用特定于供应商的功能的能力

相反,当跨多个供应商部署类似的基础设施时,我们通常更喜欢在更高的抽象级别上工作。例如,如果您正在跨多个云系统部署特定的软件,那么您可以为每个目标云供应商编写一个模块来封装该软件的部署,并使这些模块的输入变量和输出值足够相似,以便以合理的方式相互替换


举一个具体的例子,您的抽象单元可能是Kubernetes集群,因此您可以编写多个模块,所有这些模块都会导致Kubernetes API主机名作为输出导出,但在内部,它们可以使用多种方法(如供应商的托管Kubernetes服务)生成该主机名,用于开发的minikube部署等。在本例中,所有这些模块最终都会生成一个功能正常的Kubernetes API,您可以为每个配置选择使用哪一个。

跳到解释的末尾,答案是“否”的原因是这些云提供商都有唯一的API。您将需要一个能够抽象出差异的提供者来实现这一点。我想象它会像一个用多种语言执行相同代码的多语言脚本,我觉得这听起来不太可能。我所追求的不是对所有事物的全面概括,而是对一些共同特征的概括;毕竟,大多数云提供商(如果不是全部的话)都允许您使用Linux创建虚拟机,并且有一种机制来进行一些初始设置,因此像cloud init或puppet这样的工具可以接管。