Multy -это инструмент с открытым исходным кодом, который делает вашу инфраструктуру переносимым с использованием облачного сопротивления API. Вы пишете свою облачную агностическую конфигурацию один раз, и Multy развертывает ее в выбранных вами облаках.
С MATLY вам не нужно беспокоиться о том, как ресурсы ведут себя по -разному в разных поставщиках облаков. Мы абстрагируем нюансы каждого облака, так что перемещение вашей инфраструктуры между облаками осуществляется путем простого изменения параметра cloud .
Давайте попробуем развернуть простую виртуальную машину в AWS и Azure, используя поставщик 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 "
} Используя облачный API облака Multy, мы можем просто изменить параметр cloud , чтобы переместить ресурс из одного облака в другое.
Если бы мы развернули это с использованием соответствующих поставщиков облачных терраформ, нам сначала нужно было понять, как ведут себя такие ресурсы, как 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 "
}С MATLY вы пишете один раз и развернетесь в любом месте .
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 Обзор: Overview.md
Поставщик Terraform Repo: https://github.com/multycloud/terraform-provider-multy
Канал Discord: https://discord.gg/rgakxy4tcz
Посмотрите на нашу дорожную карту, чтобы узнать о последних выпущенных функциях и на том, что мы сосредоточены на краткосрочной и долгосрочной перспективе. Вы также можете проголосовать за конкретную функцию, которую вы хотите, или принять участие в дискуссиях.
Multy родился после того, как понял, насколько трудно управлять одной и той же инфраструктурой по нескольким облакам. В то время как поставщики, такие как AWS и Azure, имеют один и тот же набор основных услуг, небольшие различия в том, как работает каждая служба, затрудняют настройку вашей инфраструктуры для работы таким же образом.
Это проблема, которую Multy стремится решить. Мы создали единый интерфейс для развертывания ресурсов, которые имеют одинаковое поведение независимо от облачного провайдера.
Multy доступен в виде бесплатного и инструмента с открытым исходным кодом, поэтому вы можете загрузить его напрямую и запустить его локально.
Мы также предлагаем управляемое решение, которое размещает для вас сервер. Managed Multy в настоящее время предлагается в качестве бесплатного обслуживания. Вы можете запросить ключ API, посетив наш веб -сайт.
В то время как Terraform и его поставщики отлично подходят для развертывания любого ресурса в любое облако, он ставит все бремя на инфраструктурные команды, когда речь идет о понимании каждого поставщика и определении ресурсов. Эта гибкость можно рассматривать как преимущество, однако, когда дело доходит до мульти-облака, это значительно замедляет команды, которые стремятся быстро двигаться с развертываниями.
Аннотация общих ресурсов в основных облачных провайдерах, пользователи могут развернуть те же ресурсы на AWS и Azure, не переписывая какой-либо код инфраструктуры.
Абсолютно! Цель с Multy состоит в том, чтобы позволить вам использовать облачные управляемые услуги и оставаться свободным для перемещения вашей инфраструктуры. Не каждый ресурс будет поддерживаться, но мы стремимся поддержать самые популярные управляемые ресурсы, такие как управляемые базы данных, хранилище объекта и хранилище.
Дайте нам знать, какие услуги вы хотели бы поддерживать, создав проблему в разделе «Проблемы».
Multy-это инструмент с открытым исходным кодом, который можно запускать локально и бесплатно. Если в какой -то момент вы хотите отключить Multy, вы можете экспортировать свою конфигурацию инфраструктуры в качестве терраформа и использовать ее независимо.
Этот репозиторий доступен в Apache 2.0.