Multy هي أداة مفتوحة المصدر تجعل البنية التحتية محمولة باستخدام واجهة برمجة تطبيقات سحابة. تكتب تكوين السحاب الخاص بك مرة واحدة وتنشره في السحب التي تختارها.
مع MULITY ، لا داعي للقلق بشأن كيفية تصرف الموارد بشكل مختلف في مزودي السحب المختلفين. نلخص الفروق الدقيقة لكل سحابة بحيث يتم نقل البنية التحتية الخاصة بك بين السحب عن طريق تغيير المعلمة cloud ببساطة.
دعونا نحاول نشر جهاز افتراضي بسيط في AWS و Azure باستخدام مزود 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 "
} باستخدام واجهة برمجة تطبيقات Cloud-Agnostic ، يمكننا ببساطة تغيير المعلمة cloud لنقل مورد من سحابة إلى أخرى.
إذا أردنا نشر هذا باستخدام مزودي Terraform 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 "
}مع 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 للمشاركة في المناقشات الحية أو طلب الدعم.
نظرة عامة على الريبو: نظرة عامة
Terraform Provider Repo: https://github.com/multcloud/terraform-provider-multy
قناة Discord: https://discord.gg/rgakxy4tcz
ألقِ نظرة على خريطة الطريق الخاصة بنا لمعرفة أحدث الميزات التي تم إصدارها وما نركز عليه على المدى القصير والطويل. يمكنك أيضًا التصويت للحصول على ميزة محددة تريدها أو المشاركة في المناقشات.
وُلد MUNTYS بعد إدراك مدى صعوبة تشغيل نفس البنية التحتية عبر السحب المتعددة. في حين أن مقدمي الخدمات مثل AWS و Azure يشتركون في نفس مجموعة الخدمات الأساسية ، فإن الاختلافات الصغيرة في كيفية عمل كل خدمة تجعل من الصعب تكوين البنية التحتية الخاصة بك لتشغيلها بنفس الطريقة.
هذه هي المشكلة التي يهدف Multyt إلى معالجتها. أنشأنا واجهة واحدة لنشر الموارد التي لها نفس السلوك بغض النظر عن مزود السحابة.
تتوفر Multys كأداة مجانية ومفتوحة المصدر ، بحيث يمكنك تنزيلها مباشرة وتشغيلها محليًا.
نقدم أيضًا حلًا مُدارًا يستضيف الخادم لك. يتم تقديم Managed Managed Managed حاليًا كخدمة مجانية. يمكنك طلب مفتاح API من خلال زيارة موقعنا.
على الرغم من أن Terraform ومقدموها أمران رائعون لنشر أي مورد في أي سحابة ، إلا أنه يضع كل العبء على فرق البنية التحتية عندما يتعلق الأمر بفهم كل مزود وتحديد الموارد. ومع ذلك ، يمكن اعتبار هذه المرونة ميزة ، عندما يتعلق الأمر بـ Multi-Cloud ، وهذا يبطئ بشكل كبير الفرق التي تتطلع إلى التحرك بسرعة مع عمليات النشر.
من خلال استخلاص الموارد المشتركة عبر مقدمي الخدمات السحابية الرئيسية ، يمكن للمستخدمين نشر نفس الموارد على AWS و Azure دون إعادة كتابة أي رمز للبنية التحتية.
قطعاً! الهدف من MUNTING هو السماح لك بالاستفادة من الخدمات المدارة السحابية والبقاء حرة في نقل البنية التحتية الخاصة بك. لن يتم دعم كل مورد ، لكننا نهدف إلى دعم الموارد المدارة الأكثر شعبية مثل قواعد البيانات المدارة وتخزين الكائنات والقبو.
أخبرنا عن الخدمات التي ترغب في دعمها من خلال إنشاء مشكلة في قسم القضايا.
Multy هي أداة مفتوحة المصدر يمكن تشغيلها محليًا ومجانيًا. إذا كنت ترغب في الانتقال في مرحلة ما ، فيمكنك تصدير تكوين البنية التحتية الخاصة بك باعتباره terraform واستخدامه بشكل مستقل.
هذا المستودع متاح تحت Apache 2.0.