Multy é uma ferramenta de código aberto que torna sua infraestrutura portátil usando uma API agnóstica em nuvem. Você escreve sua configuração agnóstica em nuvem uma vez e a múltipla implanta para as nuvens que você escolher.
Com vários, você não precisa se preocupar com a forma como os recursos se comportam de maneira diferente nos diferentes fornecedores de nuvens. Abstraímos as nuances de cada nuvem para que mover sua infraestrutura entre as nuvens seja feito simplesmente alterando o parâmetro cloud .
Vamos tentar implantar uma máquina virtual simples na AWS e Azure usando o provedor multy de terraform
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 "
} Usando a API em nuvem de várias nuvens, podemos simplesmente alterar o parâmetro cloud para mover um recurso de uma nuvem para outra.
Se fôssemos implantar isso usando os respectivos fornecedores de terraform em nuvem, precisamos primeiro entender como os recursos como aws_vpc e azurerm_virtual_network se comportam e como eles diferem. Então precisaríamos definir a mesma configuração de infraestrutura duas vezes, uma para a AWS e outra para o 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 "
}Com vários, você escreve uma vez e implanta em qualquer lugar .
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
Crie uma conta com AWS ou Azure e exponha suas credenciais de autenticação por meio de variáveis de ambiente
Escreva seu arquivo de configuração, por exemplo, um arquivo chamado main.tf com o seguinte conteúdo:
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 "
} Execute terraform init e terraform apply
Execute terraform destroy
Para um guia mais detalhado, consulte nosso guia oficial de entrada.
Nós amamos colaboradores! Se você estiver interessado em contribuir, dê uma olhada no nosso guia contribuinte.
Junte -se ao nosso canal Discord para participar de discussões ao vivo ou peça suporte.
Visão geral do repo: Visão geral.MD
Repo do provedor de terraform: https://github.com/multycloud/terraform-provider-multy
Discord Channel: https://discord.gg/rgakxy4tcz
Dê uma olhada no nosso roteiro para saber os recursos mais recentes lançados e o que estamos focando em curto e longo prazo. Você também pode votar em um recurso específico que deseja ou participar das discussões.
A Multy nasceu depois de perceber o quão difícil é executar a mesma infraestrutura em várias nuvens. Enquanto fornecedores como AWS e Azure compartilham o mesmo conjunto de serviços principais, as pequenas diferenças na maneira como cada serviço funciona dificultam a configuração de sua infraestrutura para executar da mesma maneira.
Este é o problema que a Multy tem como objetivo abordar. Criamos uma única interface para implantar recursos que têm o mesmo comportamento, independentemente do provedor de nuvem.
A Multy está disponível como uma ferramenta gratuita e de código aberto, para que você possa baixá-la diretamente e executá-la localmente.
Também oferecemos uma solução gerenciada que hospeda o servidor para você. Atualmente, a Multy Multy é oferecida como um serviço gratuito. Você pode solicitar uma chave da API visitando nosso site.
Embora a Terraform e seus fornecedores sejam ótimos para implantar qualquer recurso em qualquer nuvem, ele coloca todo o ônus das equipes de infraestrutura quando se trata de entender cada provedor e definir os recursos. Essa flexibilidade pode ser vista como uma vantagem, no entanto, quando se trata de várias nuvens, isso diminui consideravelmente as equipes que desejam se mover rapidamente com as implantações.
Ao abstrair os recursos comuns entre os principais provedores de nuvem, os usuários podem implantar os mesmos recursos na AWS e no Azure sem reescrever nenhum código de infraestrutura.
Absolutamente! A meta com vários homens é permitir que você aproveite os serviços gerenciados em nuvem e permaneça livre para mover sua infraestrutura. Nem todo recurso será suportado, mas pretendemos suportar os recursos gerenciados mais populares, como bancos de dados gerenciados, armazenamento de objetos e cofre.
Deixe -nos saber quais serviços você gostaria de ser suportado criando um problema na seção de problemas.
Multy é uma ferramenta de código aberto que pode ser executado localmente e gratuito. Se, em algum momento, você deseja sair de várias coisas, poderá exportar sua configuração de infraestrutura como Terraform e usá -la de forma independente.
Este repositório está disponível no Apache 2.0.