Multy是一种开源工具,它可以使用云不稳定的API使您的基础架构可移植。您一旦编写云 - 不平衡配置,然后将其部署到您选择的云中。
对于Multy,您无需担心不同云提供商中资源的行为如何不同。我们抽象每个云的细微差别,以便通过简单地更改cloud参数来完成云之间的基础结构。
让我们尝试使用Multy Terraform提供商将简单的虚拟机部署到AWS和Azure
variable "clouds" {
type = set ( string )
default = [ " aws " , " azure " ]
}
resource "multy_virtual_network" "vn" {
for_each = var . clouds
cloud = each . key
name = " multy_vn "
cidr_block = " 10.0.0.0/16 "
location = " eu_west_1 "
}
resource "multy_subnet" "subnet" {
for_each = var . clouds
name = " multy_subnet "
cidr_block = " 10.0.10.0/24 "
virtual_network_id = multy_virtual_network . vn [ each . key ] . id
}
resource "multy_virtual_machine" "vm" {
for_each = var . clouds
name = " test_vm "
size = " general_micro "
image_reference = {
os = " ubuntu "
version = " 20.04 "
}
subnet_id = multy_subnet . subnet [ each . key ] . id
cloud = each . key
location = " eu_west_1 "
}通过使用Multy Cloud-Agnostic API,我们可以简单地更改cloud参数,以将资源从一个云移动到另一个云。
如果我们要使用各自的云地Terraform提供商部署此功能,我们将首先需要了解aws_vpc和azurerm_virtual_network之类的资源如何表现以及它们如何不同。然后,我们需要两次定义相同的基础架构配置,一种用于AWS,另一种用于Azure。
// terraform: 190 lines
resource "aws_iam_instance_profile" "multy_vm_ube3b_r10" {
name = " multy_vm_ube3b_r10-vm-role "
role = aws_iam_role . multy_vm_ube3b_r10 . name
provider = " aws.eu-west-1 "
}
resource "aws_iam_role" "multy_vm_ube3b_r10" {
tags = { " Name " = " test_vm " }
name = " multy_vm_ube3b_r10-vm-role "
assume_role_policy = " { " Statement " :[{ " Action " :[ " sts:AssumeRole " ], " Effect " : " Allow " , " Principal " :{ " Service " : " ec2.amazonaws.com " }}], " Version " : " 2012-10-17 " } "
provider = " aws.eu-west-1 "
}
data "aws_ami" "multy_vm_ube3b_r10" {
owners = [ " 099720109477 " ]
most_recent = true
filter {
name = " name "
values = [ " ubuntu*-20.04-amd64-server-* " ]
}
filter {
name = " root-device-type "
values = [ " ebs " ]
}
filter {
name = " virtualization-type "
values = [ " hvm " ]
}
provider = " aws.eu-west-1 "
}
resource "aws_instance" "multy_vm_ube3b_r10" {
tags = { " Name " = " test_vm " }
ami = data . aws_ami . multy_vm_ube3b_r10 . id
instance_type = " t2.micro "
subnet_id = aws_subnet . multy_vn_ube3b_r8-1 . id
iam_instance_profile = aws_iam_instance_profile . multy_vm_ube3b_r10 . id
provider = " aws.eu-west-1 "
}
resource "azurerm_network_interface" "multy_vm_ube3b_r9" {
resource_group_name = azurerm_resource_group . vm-nkum-rg . name
name = " test_vm "
location = " northeurope "
ip_configuration {
name = " internal "
private_ip_address_allocation = " Dynamic "
subnet_id = azurerm_subnet . multy_vn_ube3b_r7 . id
primary = true
}
}
resource "random_password" "multy_vm_ube3b_r9" {
length = 16
special = true
upper = true
lower = true
number = true
}
resource "azurerm_linux_virtual_machine" "multy_vm_ube3b_r9" {
resource_group_name = azurerm_resource_group . vm-nkum-rg . name
name = " test_vm "
location = " northeurope "
size = " Standard_B1s "
network_interface_ids = [ azurerm_network_interface . multy_vm_ube3b_r9 . id ]
os_disk {
caching = " None "
storage_account_type = " Standard_LRS "
}
admin_username = " adminuser "
admin_password = random_password . multy_vm_ube3b_r9 . result
source_image_reference {
publisher = " Canonical "
offer = " 0001-com-ubuntu-server-focal "
sku = " 20_04-lts "
version = " latest "
}
disable_password_authentication = false
identity {
type = " SystemAssigned "
}
computer_name = " testvm "
zone = " 1 "
}
resource "aws_vpc" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
cidr_block = " 10.0.0.0/16 "
enable_dns_hostnames = true
provider = " aws.eu-west-1 "
}
resource "aws_internet_gateway" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r4 . id
provider = " aws.eu-west-1 "
}
resource "aws_default_security_group" "multy_vn_ube3b_r4" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r4 . id
ingress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
egress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
provider = " aws.eu-west-1 "
}
resource "aws_vpc" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
cidr_block = " 10.0.0.0/16 "
enable_dns_hostnames = true
provider = " aws.eu-west-1 "
}
resource "aws_internet_gateway" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
provider = " aws.eu-west-1 "
}
resource "aws_default_security_group" "multy_vn_ube3b_r5" {
tags = { " Name " = " multy_vn " }
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
ingress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
egress {
protocol = " -1 "
from_port = 0
to_port = 0
self = true
}
provider = " aws.eu-west-1 "
}
resource "azurerm_virtual_network" "multy_vn_ube3b_r6" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_vn "
location = " northeurope "
address_space = [ " 10.0.0.0/16 " ]
}
resource "azurerm_route_table" "multy_vn_ube3b_r6" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_vn "
location = " northeurope "
route {
name = " local "
address_prefix = " 0.0.0.0/0 "
next_hop_type = " VnetLocal "
}
}
resource "azurerm_subnet" "multy_vn_ube3b_r7" {
resource_group_name = azurerm_resource_group . vn-nkum-rg . name
name = " multy_subnet "
address_prefixes = [ " 10.0.10.0/24 " ]
virtual_network_name = azurerm_virtual_network . multy_vn_ube3b_r6 . name
}
resource "azurerm_subnet_route_table_association" "multy_vn_ube3b_r7" {
subnet_id = azurerm_subnet . multy_vn_ube3b_r7 . id
route_table_id = azurerm_route_table . multy_vn_ube3b_r6 . id
}
resource "aws_subnet" "multy_vn_ube3b_r8-1" {
tags = { " Name " = " multy_subnet-1 " }
cidr_block = " 10.0.10.0/25 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1a "
provider = " aws.eu-west-1 "
}
resource "aws_subnet" "multy_vn_ube3b_r8-2" {
tags = { " Name " = " multy_subnet-2 " }
cidr_block = " 10.0.10.128/26 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1b "
provider = " aws.eu-west-1 "
}
resource "aws_subnet" "multy_vn_ube3b_r8-3" {
tags = { " Name " = " multy_subnet-3 " }
cidr_block = " 10.0.10.192/26 "
vpc_id = aws_vpc . multy_vn_ube3b_r5 . id
availability_zone = " eu-west-1c "
provider = " aws.eu-west-1 "
}
resource "azurerm_resource_group" "vm-nkum-rg" {
name = " vm-nkum-rg "
location = " northeurope "
}
resource "azurerm_resource_group" "vn-nkum-rg" {
name = " vn-nkum-rg "
location = " northeurope "
}使用Multy,您可以编写一次,然后在任何地方部署。
brew tap hashicorp/tap && brew install hashicorp/tap/terraformchoco install terraform sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
使用AWS或Azure创建一个帐户,并通过环境变量公开其身份验证凭证
写下您的配置文件,例如一个名为main.tf的文件,其中包含以下内容:
terraform {
required_providers {
multy = {
source = " multycloud/multy "
}
}
}
provider "multy" {
aws = {} # this will look for aws credentials
}
resource "multy_virtual_network" "vn" {
cloud = " aws "
name = " multy_vn "
cidr_block = " 10.0.0.0/16 "
location = " eu_west_1 "
}运行terraform init ,然后terraform apply
运行terraform destroy
有关更详细的指南,请参阅我们的正式入门指南。
我们喜欢贡献者!如果您有兴趣贡献,请查看我们的贡献指南。
加入我们的Discord渠道参加现场讨论或寻求支持。
repo概述:概述。md
Terraform提供商仓库:https://github.com/multycloud/terraform-provider-multy
不和谐频道:https://discord.gg/rgakxy4tcz
请查看我们的路线图,以了解发布的最新功能以及我们在短期和长期上的重点。您还可以投票给您想要的特定功能或参加讨论。
Multy意识到在多个云上运行相同的基础架构是多么困难。尽管AWS和Azure等提供商共享相同的核心服务集,但每个服务的工作方式的小差异使得很难以相同的方式配置基础架构。
这是Multy旨在解决问题的问题。我们创建了一个单个接口来部署具有相同行为的资源,而不论云提供商如何。
Multy可作为免费和开源工具提供,因此您可以直接下载并在本地运行它。
我们还提供托管解决方案,为您托管服务器。目前,托管Multy作为免费服务提供。您可以通过访问我们的网站请求API密钥。
尽管Terraform及其提供商非常适合将任何资源部署到任何云中,但在理解每个提供商并定义资源时,它给基础设施团队带来了所有负担。但是,这种灵活性可以看作是一种优势,但是,在多云方面,这会减慢希望通过部署快速移动的团队。
通过在主要云提供商之间抽象公共资源,用户能够在AWS和Azure上部署相同的资源,而无需重新编写任何基础架构代码。
绝对地! Multy的目标是允许您利用云管理服务并保持自由移动基础架构。并非每个资源都会得到支持,但我们旨在支持最受欢迎的托管资源,例如托管数据库,对象存储和保险库。
让我们知道您希望通过在问题部分中创建问题来支持哪些服务。
Multy是可以在本地和免费运行的开源工具。如果您想离开Multy,则可以将基础架构配置作为Terraform导出并独立使用。
该存储库可在Apache 2.0下找到。