زیرساخت به‌عنوان کدariaservice/arianet

Terraform Provider آریانت: زیرساخت ابری را به‌صورت کد بنویسید

سرور، شبکه خصوصی، فایروال، والیوم، آی‌پی شناور و لودبالانسر آریانت کلاد را در فایل‌های Terraform تعریف کنید، تغییرات را پیش از اعمال ببینید و همان زیرساخت را هر بار دقیقا یکسان بسازید. منابعی که Terraform می‌سازد همان لحظه در پنل هم دیده می‌شوند.

چرا Terraform؟

زیرساخت در گیت

همه سرورها، شبکه‌ها و قوانین فایروال در کد ثبت می‌شوند؛ بازبینی، تاریخچه و بازگشت به نسخه قبل مثل بقیه کدهای پروژه.

تغییر را قبل از اعمال ببینید

terraform plan دقیقا نشان می‌دهد چه چیزی ساخته، تغییر یا حذف می‌شود.

محیط‌های یکسان

محیط تست، staging و production را از یک تعریف بسازید تا تفاوت ناخواسته‌ای بینشان نباشد.

Import منابع موجود

سرورها و منابعی را که قبلا در پنل ساخته‌اید با terraform import زیر مدیریت Terraform بیاورید.

شروع سریع

  1. در پنل ابری آریانت، از بخش API Tokens توکنی با دسترسی cloud:servers:read و cloud:servers:write بسازید (برای کلید SSH، دسترسی ssh_keys هم لازم است).
  2. provider را در پروژه Terraform تعریف کنید. توکن را با متغیر حساس یا متغیر محیطی ARIANET_TOKEN بدهید و هرگز آن را در کد ننویسید.
  3. terraform init را اجرا کنید تا provider از رجیستری دانلود شود، بعد terraform plan و terraform apply.
terraform {
  required_providers {
    arianet = {
      source  = "ariaservice/arianet"
      version = "0.1.0"
    }
  }
}

provider "arianet" {
  token = var.arianet_token
}

variable "arianet_token" {
  type      = string
  sensitive = true
}

# Any location code from data.arianet_locations / `arianet cloud datacenters`
variable "datacenter" {
  type = string
}

نمونه: سرور وب با کلید SSH و فایروال

این نمونه پلن را از دیتا سورس arianet_plans می‌خواند، کلید SSH را اضافه می‌کند، یک سرور اوبونتو با برچسب می‌سازد و فایروالی را روی همه سرورهای با برچسب role=web اعمال می‌کند.

data "arianet_plans" "dc" {
  datacenter = var.datacenter
}

resource "arianet_ssh_key" "me" {
  name       = "laptop"
  public_key = file("~/.ssh/id_ed25519.pub")
}

resource "arianet_server" "web" {
  name        = "web-1"
  datacenter  = var.datacenter
  plan_id     = data.arianet_plans.dc.plans[0].id
  image       = "ubuntu-24.04"
  ssh_key_ids = [arianet_ssh_key.me.id]

  labels = {
    env  = "prod"
    role = "web"
  }
}

resource "arianet_firewall" "web" {
  name = "web"

  rule {
    direction  = "in"
    protocol   = "tcp"
    port       = "443"
    source_ips = ["0.0.0.0/0", "::/0"]
  }

  apply_to = [
    { label_selector = "role=web" },
  ]
}

Resourceها

  • arianet_server
  • arianet_volume, arianet_volume_attachment
  • arianet_network, arianet_network_subnet, arianet_network_route
  • arianet_firewall, arianet_firewall_attachment
  • arianet_floating_ip, arianet_floating_ip_assignment
  • arianet_ssh_key
  • arianet_load_balancer, arianet_load_balancer_service, arianet_load_balancer_target

Data sourceها

  • arianet_images, arianet_image
  • arianet_plans, arianet_locations
  • arianet_pricing, arianet_server_costs
  • arianet_load_balancer_types
  • arianet_server, arianet_network, arianet_ssh_key

شبکه خصوصی و لودبالانسر

سرورها را روی یک شبکه خصوصی قرار دهید و ترافیک را با یک لودبالانسر بین همه سرورهای با برچسب role=web پخش کنید؛ سرور تازه‌ای که همین برچسب را بگیرد، خودکار به لودبالانسر اضافه می‌شود.

resource "arianet_network" "private" {
  name            = "private"
  datacenter      = var.datacenter
  ip_range        = "10.0.0.0/16"
  subnet_ip_range = "10.0.1.0/24"
}

resource "arianet_load_balancer" "lb" {
  name       = "web"
  datacenter = var.datacenter
  type       = "lb11"
  algorithm  = "round_robin"
  network_id = arianet_network.private.id
}

resource "arianet_load_balancer_service" "http" {
  load_balancer_id = arianet_load_balancer.lb.id
  protocol         = "http"
  listen_port      = 80
  destination_port = 8080
}

resource "arianet_load_balancer_target" "web" {
  load_balancer_id = arianet_load_balancer.lb.id
  type             = "label_selector"
  label_selector   = "role=web"
  use_private_ip   = true
}

provider به دیتاسنتر خاصی وابسته نیست: کد لوکیشن را در متغیر datacenter بدهید و فهرست لوکیشن‌ها را با دیتا سورس arianet_locations و قیمت هر پلن را با arianet_pricing بخوانید. مستندات کامل هر resource و همه گزینه‌هایش در رجیستری Terraform است.

سؤالات رایج درباره Terraform Provider آریانت

Terraform provider آریانت چه منابعی را مدیریت می‌کند؟

سرور، والیوم و اتصال آن، شبکه خصوصی با ساب‌نت و مسیر، فایروال و اتصال آن به سرور یا لیبل، آی‌پی شناور و انتساب آن، کلید SSH و لودبالانسر با سرویس و هدف. دیتا سورس‌هایی هم برای ایمیج‌ها، پلن‌ها، لوکیشن‌ها، قیمت‌ها، هزینه سرور و نوع لودبالانسر دارد.

توکن را چطور به provider بدهم؟

توکن را در پنل ابری آریانت بسازید و یا با متغیر حساس arianet_token به بلوک provider بدهید، یا آن را در متغیر محیطی ARIANET_TOKEN قرار دهید. توکن باید دسترسی cloud:servers:read و cloud:servers:write داشته باشد و برای مدیریت کلید SSH، دسترسی ssh_keys هم لازم است.

منابعی را که قبلا در پنل ساخته‌ام می‌توانم وارد Terraform کنم؟

بله. همه منابع از terraform import پشتیبانی می‌کنند، پس می‌توانید زیرساخت موجود را بدون ساخت دوباره زیر مدیریت Terraform بیاورید.

تغییراتی که با Terraform اعمال می‌کنم در پنل دیده می‌شود؟

بله. provider همان API عمومی آریانت را صدا می‌زند و هر منبعی که بسازد یا تغییر دهد، بلافاصله در پنل دیده می‌شود.

هزینه منابع را از داخل Terraform می‌توانم ببینم؟

بله. دیتا سورس arianet_pricing فهرست قیمت عمومی هر لوکیشن را می‌خواند و arianet_server_costs هزینه ساعتی و ماهانه یک سرور را برمی‌گرداند.