Multy est un outil open-source qui rend votre infrastructure portable à l'aide d'une API agnostique cloud. Vous écrivez une seule fois votre configuration en cloud-agnostique et Multy le déploie dans les nuages que vous choisissez.
Avec Multy, vous n'avez pas à vous soucier de la façon dont les ressources se comportent différemment dans les différents fournisseurs de nuages. Nous abstracons les nuances de chaque nuage afin que le déplacement de votre infrastructure entre les nuages se fait simplement en modifiant le paramètre cloud .
Essayons de déployer une machine virtuelle simple dans AWS et Azure à l'aide du fournisseur de terraform Multy
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 "
} En utilisant l'API Multy Cloud-Agnostic, nous pouvons simplement modifier le paramètre cloud pour déplacer une ressource d'un cloud à un autre.
Si nous devions déployer cela en utilisant les fournisseurs de terraform Cloud respectifs, nous devons d'abord comprendre comment les ressources telles que aws_vpc et azurerm_virtual_network se comportent et comment elles diffèrent. Ensuite, nous devons définir deux fois la même configuration d'infrastructure, une pour AWS et une autre pour 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 "
}Avec Multy, vous écrivez une fois et vous déployez n'importe où .
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
Créez un compte avec AWS ou Azure et exposer ses informations d'authentification via des variables d'environnement
Écrivez votre fichier de configuration, par exemple un fichier nommé main.tf avec le contenu suivant:
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 "
} Exécuter terraform init et ensuite terraform apply
Exécuter terraform destroy
Pour un guide plus détaillé, consultez notre guide officiel de démarrage.
Nous aimons les contributeurs! Si vous souhaitez contribuer, jetez un œil à notre guide de contribution.
Rejoignez notre canal Discord pour participer à des discussions en direct ou demandez un soutien.
Aperçu de la réapprovisionnement: aperçu.md
Terraform Provider Repo: https://github.com/multycloud/terraform-provider-multy
Discord Channel: https://discord.gg/rgakxy4tcz
Jetez un œil à notre feuille de route pour connaître les dernières fonctionnalités publiées et ce que nous nous concentrons sur à court et à long terme. Vous pouvez également voter pour une fonctionnalité spécifique que vous souhaitez ou participer aux discussions.
Multy est né après avoir réalisé à quel point il est difficile de gérer la même infrastructure sur plusieurs nuages. Alors que les fournisseurs tels que AWS et Azure partagent le même ensemble de services de base, les petites différences dans le fonctionnement de chaque service rendent difficile la configuration de votre infrastructure pour s'exécuter de la même manière.
C'est le problème que Multy vise à s'attaquer. Nous avons créé une seule interface pour déployer des ressources qui ont le même comportement, quel que soit le fournisseur de cloud.
Multy est disponible en tant qu'outil gratuit et open-source, vous pouvez donc le télécharger directement et l'exécuter localement.
Nous proposons également une solution gérée qui héberge le serveur pour vous. Mational Multy est actuellement proposé en tant que service gratuit. Vous pouvez demander une clé API en visitant notre site Web.
Bien que Terraform et ses fournisseurs soient parfaits pour déployer n'importe quelle ressource dans n'importe quel cloud, il exerce tout le fardeau des équipes d'infrastructure lorsqu'il s'agit de comprendre chaque fournisseur et de définir les ressources. Cette flexibilité peut être considérée comme un avantage, cependant, en ce qui concerne le multi-cloud, cela ralentit considérablement les équipes qui cherchent à se déplacer rapidement avec les déploiements.
En abstraction des ressources communes entre les principaux fournisseurs de cloud, les utilisateurs peuvent déployer les mêmes ressources sur AWS et Azure sans réécrire aucun code d'infrastructure.
Absolument! L'objectif avec Multy est de vous permettre de tirer parti des services gérés par le cloud et de rester libre pour déplacer votre infrastructure. Toutes les ressources ne seront pas prises en charge, mais nous visons à prendre en charge les ressources gérées les plus populaires telles que les bases de données gérées, le stockage d'objets et le coffre-fort.
Faites-nous savoir quels services vous aimeriez être soutenu en créant un problème sur la section des problèmes.
Multy est un outil open-source qui peut être exécuté localement et gratuit. Si à un moment donné, vous souhaitez quitter Multy, vous pouvez exporter votre configuration d'infrastructure comme terraform et l'utiliser indépendamment.
Ce référentiel est disponible sous Apache 2.0.