پرش به مطلب اصلی

پرووایدر Terraform

پرووایدر Terraform با نام ariaservice/arianet منابع ابر آریانت را به صورت کد مدیریت می‌کند: سرورها، دیسک‌ها، شبکه‌های خصوصی (زیرشبکه‌ها، مسیرها)، فایروال‌ها، IPهای شناور، لود بالانسرها (سرویس‌ها، هدف‌ها) و کلیدهای SSH حساب شما. به Terraform نسخه ۱.۰ یا بالاتر نیاز دارد.

پرووایدر از وب سرویس ابر استفاده می‌کند؛ مستندات کامل هر resource در رجیستری است.

راه‌اندازی پرووایدر​

terraform {
required_providers {
arianet = {
source = "ariaservice/arianet"
version = "~> 0.1"
}
}
}

provider "arianet" {
# Read from ARIANET_TOKEN when not set here.
token = var.arianet_token
}

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

سپس terraform init را اجرا کنید.

احراز هویت​

در cloud.ariaservice.net/users/api-tokens یک توکن شخصی API با دسترسی‌های cloud:servers:read و cloud:servers:write بسازید (اگر arianet_ssh_key را مدیریت می‌کنید، دسترسی‌های کلید SSH یعنی ssh-keys:read / ssh-keys:write را هم اضافه کنید). توکن را در فایل .tf ننویسید و آن را export کنید:

export ARIANET_TOKEN="paste-your-token-here"
terraform plan

آرگومان‌های پرووایدر​

آرگومانمتغیر محیطیپیش‌فرضتوضیح
tokenARIANET_TOKENالزامیتوکن API (حساس)
endpointARIANET_API_URLhttps://api.ariaservice.netآدرس ریشه API؛ باید https باشد (http فقط برای localhost)
poll_interval2sفاصله بررسی action در حال اجرا؛ تا ۱۰ ثانیه افزایش می‌یابد
max_retries5تعداد تکرار برای HTTP 429 (با رعایت Retry-After و در غیر این صورت RateLimit-Reset) و برای خواندن روی 502/503/504

عملیات طولانی یک action برمی‌گردانند و پرووایدر تا پایان آن صبر می‌کند؛ سقف انتظار با بلوک timeouts هر resource تعیین می‌شود (مثلاً timeouts { create = "20m" }). منبعی که هنگام refresh پاسخ 404 بدهد از state حذف می‌شود.

Resourceها​

Resourceکاربرد
arianet_serverسرور ابری. تغییر plan_id اندازه آن را در جا تغییر می‌دهد؛ backups پشتیبان روزانه را روشن/خاموش می‌کند؛ keep_backups / delete_snapshots سرنوشت نسخه‌های آن هنگام destroy را تعیین می‌کنند.
arianet_volumeدیسک بلاکی (size بر حسب GB؛ افزایش اندازه در جا انجام می‌شود).
arianet_volume_attachmentاتصال دیسک به سرور.
arianet_networkشبکه خصوصی (ip_range و subnet_ip_range اختیاری برای اولین زیرشبکه).
arianet_network_subnetزیرشبکه اضافه برای یک شبکه.
arianet_network_routeمسیر ایستا (destination ← gateway) در یک شبکه.
arianet_firewallفایروال با بلوک‌های rule و apply_to اختیاری (سرورها یا label selector).
arianet_firewall_attachmentاعمال فایروال روی سرورها (server_ids) یا label selectorها (label_selectors).
arianet_floating_ipآدرس شناور IPv4 یا IPv6، با server_id و DNS معکوس (dns_ptr) اختیاری.
arianet_floating_ip_assignmentاختصاص IP شناور به سرور.
arianet_load_balancerلود بالانسر (type مثل lb11، algorithm، network_id و public_interface اختیاری).
arianet_load_balancer_serviceیک listener: protocol (tcp، http، https با عبور مستقیم TLS)، پورت‌ها، health_check و گزینه‌های http.
arianet_load_balancer_targetیک هدف: سرور، IP یا label selector، به صورت اختیاری از طریق شبکه خصوصی.
arianet_ssh_keyیک کلید SSH حساب شما.

همه resourceها از terraform import پشتیبانی می‌کنند، مثلاً terraform import arianet_server.web 123 (زیرمنابع شناسه ترکیبی دارند، مثل 21/80 برای سرویس لود بالانسر).

resourceهایی که این ویژگی‌ها را دارند labels (map)، project_id (پیش‌فرض پروژه پیش‌فرض حساب؛ تغییر آن منبع را جابه‌جا می‌کند) و protection_delete (پیش از destroy باید false باشد) را می‌پذیرند.

آرگومان‌های arianet_server​

آرگومانتوضیح
name، datacenter، plan_id، imageالزامی. datacenter کد مکان است (arianet_locations) و image نامی مثل ubuntu-24.04 یا ارجاع به اسنپ‌شات/پشتیبان (arianet_image(s)). تغییر datacenter یا image سرور را جایگزین می‌کند.
ssh_key_ids، ssh_keysشناسه کلیدهای ذخیره‌شده و/یا کلیدهای عمومی که هنگام ساخت نصب می‌شوند
user_datauser data برای cloud-init
enable_ipv4، enable_ipv6آدرس‌های عمومی (IPv4 به طور پیش‌فرض فعال است)
firewall_ids، network_idsفایروال‌هایی که مستقیم اعمال می‌شوند؛ شبکه‌های خصوصی متصل هنگام ساخت
backupsپشتیبان روزانه (هزینه جداگانه)
keep_backupsهنگام destroy، پشتیبان‌های کامل‌شده نگه داشته شوند (پس از آن بر اساس GB هزینه دارند). به صورت ?keep_backups=true ارسال می‌شود.
delete_snapshotsهنگام destroy، اسنپ‌شات‌های سرور هم حذف شوند (در غیر این صورت باقی می‌مانند و هزینه دارند). به صورت ?delete_snapshots=true ارسال می‌شود.
start_after_create، protection_delete، protection_rebuild، labels، project_id

فقط‌خواندنی: ipv4_address، ipv6_address، status، disk_gb، locked، rescue_enabled و root_password (حساس؛ فقط هنگام ساخت برمی‌گردد و وقتی کلید SSH استفاده شود و API رمزی برنگرداند خالی است). keep_backups / delete_snapshots را پیش از terraform destroy تنظیم و apply کنید؛ هنگام حذف سرور از state خوانده می‌شوند.

Data sourceها​

Data sourceخروجی
arianet_locationsدیتاسنترها: code، name، country، features، orderable
arianet_plansپلن‌ها (به صورت اختیاری برای یک datacenter): id، name، vcpu، ram_mb، disk_gb، traffic_gb، hourly_price، monthly_price، available
arianet_images، arianet_imageایمیج‌ها بر اساس type (system، app، snapshot، backup)، datacenter و label_selector؛ arianet_image یکی را با id، image، name یا most_recent انتخاب می‌کند
arianet_pricingلیست قیمت عمومی (/cloud/v1/public/pricing): server_types با قیمت هر مکان، بقیه resources، vat_included
arianet_server_costsGET /servers/{id}/costs: ردیف‌های lines، totals، snapshots، kept_backups
arianet_load_balancer_typesانواع لود بالانسر و محدودیت‌های آن‌ها
arianet_server، arianet_networkیافتن منبع موجود با id، name یا label_selector
arianet_ssh_keyیافتن یکی از کلیدهای SSH شما با id، name یا fingerprint

نمونه کامل​

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

terraform {
required_providers {
arianet = {
source = "ariaservice/arianet"
version = "~> 0.1"
}
}
}

provider "arianet" {} # token from ARIANET_TOKEN

locals {
datacenter = "ovh"
}

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

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

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

resource "arianet_server" "web" {
count = 3
name = "web-${count.index + 1}"
datacenter = local.datacenter
plan_id = data.arianet_plans.dc.plans[0].id
image = "ubuntu-24.04"
ssh_key_ids = [arianet_ssh_key.me.id]
network_ids = [arianet_network.private.id]
labels = { role = "web" }

user_data = <<-EOT
#cloud-config
packages: [nginx]
EOT
}

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

rule {
direction = "in"
protocol = "tcp"
port = "22"
source_ips = ["203.0.113.4/32"]
}

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

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

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

resource "arianet_load_balancer_service" "http" {
load_balancer_id = arianet_load_balancer.web.id
protocol = "http"
listen_port = 80
destination_port = 80

health_check = {
protocol = "http"
port = 80
interval = 10
timeout = 5
retries = 3
http = {
path = "/"
status_codes = ["2??"]
}
}
}

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

resource "arianet_volume" "data" {
name = "data"
datacenter = local.datacenter
size = 50
filesystem = "ext4"
}

resource "arianet_volume_attachment" "data" {
volume_id = arianet_volume.data.id
server_id = arianet_server.web[0].id
}

data "arianet_server_costs" "web1" {
server_id = arianet_server.web[0].id
}

output "load_balancer_ip" {
value = arianet_load_balancer.web.ipv4
}

output "web1_monthly_cost" {
value = data.arianet_server_costs.web1.totals
}
export ARIANET_TOKEN="..."
terraform init
terraform plan
terraform apply

قیمت‌ها پیش از apply: curl -s https://api.ariaservice.net/cloud/v1/public/pricing یا arianet cloud pricing (بدون نیاز به توکن).

همچنین ببینید​