موفر Cockpit Terraform (Cockpit Terraform Provider)
يمكّنك موفر Cockpit Terraform من إدارة موارد Cockpit الخاصة بك باستخدام البنية التحتية كرمز (Infrastructure as Code - IaC). يعمل Cockpit كلوحة تحكم مركزية لبيئات التلخيص المتعددة لـ Vapor، ويسمح لك هذا الموفر بأتمتة توفير وإدارة دورة حياة المضيفين، والأجهزة الافتراضية، وعناقيد Kubernetes، ومستودعات التخزين، والمحولات الشبكية.
صفحة سجل الموفر متاحة في Terraform Registry - awanio/cockpit.
المتطلبات
- Terraform >= 1.0
- Go >= 1.25 (مطلوب فقط لبناء الموفر من المصدر)
إعداد الموفر
لاستخدام الموفر، أعلن عنه في تكوين Terraform الخاص بك. يتطلب الموفر بيانات اعتماد من حساب خدمة Cockpit (معرف العميل Client ID وسر العميل Client Secret) وعنوان URL لنقطة نهاية Cockpit API.
إعداد المخطط (Schema Configuration)
terraform {
required_providers {
cockpit = {
source = "awanio/cockpit"
version = "~> 1.0.0" # Adjust to the desired version
}
}
}
provider "cockpit" {
host = "http://localhost:7771/api/v1"
client_id = "your-service-account-client-id"
client_secret = "your-service-account-client-secret"
}متغيرات البيئة
يمكن أيضًا تمرير معلمات التكوين باستخدام متغيرات البيئة. هذه هي الطريقة الموصى بها لتجنب كتابة بيانات الاعتماد الحساسة في ملفات HCL.
COCKPIT_HOST— عنوان URL الأساسي لـ Cockpit API (على سبيل المثالhttp://localhost:7771/api/v1).COCKPIT_CLIENT_ID— معرف العميل (Client ID) لحساب الخدمة.COCKPIT_CLIENT_SECRET— سر العميل (Client Secret) لحساب الخدمة.
الموارد (Resources)
cockpit_host
يدير تسجيل خادم Vapor الفيزيائي المضيف واتصاله داخل منسق Cockpit.
مثال على الاستخدام
resource "cockpit_host" "example" {
address = "10.0.0.15"
port = 7770
api_token = "vapor-api-token-here"
parent_id = "datacenter-or-cluster-uuid"
}مرجع الوسائط (Argument Reference)
address(String, Required) — عنوان IP أو اسم النطاق المؤهل بالكامل (FQDN) لمضيف Vapor.port(Number, Optional) — المنفذ الذي تستمع عليه خدمة Vapor API. الافتراضي7770.api_token(String, Required, Sensitive) — رمز API المستخدَم للمصادقة مع مضيف Vapor.parent_id(String, Required) — المعرف الفريد (UUID) لكيان المخزون Datacenter أو Cluster الذي يُوضع فيه المضيف.
cockpit_virtual_machine
يدير دورة حياة الجهاز الافتراضي في منسق Cockpit.
مثال على الاستخدام
resource "cockpit_virtual_machine" "example" {
host_id = "host-uuid-here"
name = "terraform-vm"
memory = 2048
vcpus = 2
autostart = true
os = {
type = "linux"
variant = "ubuntu22.04"
}
storage = {
disks = [
{
size = 20
pool = "default"
}
]
}
networks = [
{
type = "network"
source = "default"
}
]
}مرجع الوسائط (Argument Reference)
host_id(String, Required) — المعرف الفريد (UUID) لمضيف Vapor حيث سيعمل الجهاز الافتراضي.name(String, Required) — اسم الجهاز الافتراضي.memory(Number, Required) — حجم الذاكرة المخصصة بالميجابايت (MB).vcpus(Number, Required) — عدد أنوية المعالج الافتراضية (vCPU) المخصصة للجهاز.cluster_id(String, Optional) — المعرف الفريد (UUID) للعنقود المستهدف لجدولة الجهاز الافتراضي.datacenter_id(String, Optional) — المعرف الفريد (UUID) لمركز البيانات المستهدف.os(Block, Optional) — معلمات إعداد نظام التشغيل. يحتوي على:type(String) — نوع نظام التشغيل (مثلlinuxأوwindows).variant(String) — التوزيعة المحددة لنظام التشغيل (مثلubuntu22.04).
storage(Block, Optional) — معلمات إعداد التخزين. يحتوي على:disks(List of Blocks) — قائمة بإعدادات الأقراص. كتل الأقراص تحتوي على:size(Number) — حجم القرص بالجيكابايت (GB).pool(String) — اسم مجمع التخزين حيث سيتم توفير القرص.
networks(Block List, Optional) — واجهات الشبكة المراد توصيلها بالجهاز الافتراضي. كل كتلة شبكة تحتوي على:type(String) — نوع الواجهة (مثلnetwork).source(String) — اسم شبكة المصدر أو الجسر.
autostart(Boolean, Optional) — ما إذا كان سيتم تشغيل الجهاز الافتراضي تلقائيًا عند إقلاع المضيف. الافتراضيfalse.
cockpit_kubernetes_cluster
يدير عنقود Kubernetes المُوفر عبر خدمة Cockpit Auto-Provisioner.
مثال على الاستخدام
resource "cockpit_kubernetes_cluster" "k8s" {
name = "k8s-prod"
version = "v1.36.1+k3s1"
network_id = "network-switch-uuid"
ssh_public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ..."
image_path = "/var/lib/libvirt/images/ubuntu-k8s-template.qcow2"
control_plane = {
cpu = 2
memory_mb = 2048
storage_pool_id = "default"
storage_gb = 20
desired_count = 1
}
workers = {
cpu = 2
memory_mb = 2048
storage_pool_id = "default"
storage_gb = 20
desired_count = 3
}
csi_tiers = {
local_path_enabled = true
longhorn_enabled = false
}
}مرجع الوسائط (Argument Reference)
name(String, Required) — اسم عنقود Kubernetes.version(String, Required) — علامة إصدار K3s Kubernetes المستهدفة (مثلv1.36.1+k3s1).network_id(String, Required) — المعرف الفريد (UUID) لمحول الشبكة حيث تتصل عقد العنقود.ssh_public_key(String, Required) — مفتاح SSH العام المحقون في عقد العنقود للوصول الإداري.image_path(String, Optional) — مسار قالب نظام التشغيل أو الصورة الأساسية المستخدمة لتوفير العقد.control_plane(Block, Required) — مواصفات العقدة للوحة التحكم (Control plane). تحتوي على:cpu(Number) — أنوية المعالج لكل عقدة من لوحة التحكم.memory_mb(Number) — الذاكرة بالميجابايت لكل عقدة من لوحة التحكم.storage_pool_id(String) — معرف مجمع التخزين لأقراص نظام التشغيل الخاصة بالعقد.storage_gb(Number) — حجم القرص بالجيكابايت.desired_count(Number) — عدد عقد لوحة التحكم (يجب أن يكون رقمًا فرديًا للتوفر العالي، مثل 1، 3، 5).
workers(Block, Required) — مواصفات العقدة لعقد العمل (Worker nodes). تحتوي على:cpu(Number) — أنوية المعالج لكل عقدة عمل.memory_mb(Number) — الذاكرة بالميجابايت لكل عقدة عمل.storage_pool_id(String) — معرف مجمع التخزين لأقراص نظام التشغيل الخاصة بالعقد.storage_gb(Number) — حجم القرص بالجيكابايت.desired_count(Number) — العدد المطلوب لعقد العمل.
csi_tiers(Block, Optional) — إعدادات تكامل التخزين لواجهة تخزين الحاويات في Kubernetes (CSI). تحتوي على:local_path_enabled(Boolean) — تمكين أو تعطيل برنامج تشغيل المسار المحلي local path CSI driver.longhorn_enabled(Boolean) — تمكين أو تعطيل برنامج تشغيل التخزين الكتلي الموزع Longhorn.
cockpit_datastore
يدير مستودع تخزين (مجمع تخزين Storage pool) على مضيف Vapor.
مثال على الاستخدام
resource "cockpit_datastore" "example" {
name = "nfs-images"
host_id = "host-uuid-here"
type = "netfs"
path = "/var/lib/libvirt/images/nfs-images"
source = "10.0.0.5:/exports/images"
autostart = true
scope = "shared"
}مرجع الوسائط (Argument Reference)
name(String, Required) — اسم مجمع التخزين أو مستودع التخزين.host_id(String, Required) — المعرف الفريد (UUID) لمضيف Vapor حيث تم إعداد مستودع التخزين.type(String, Required) — نوع مجمع التخزين (مثلdirأوnetfsأوlogicalأوfs).path(String, Optional) — مسار التثبيت أو الدليل المستهدف في نظام الملفات المحلي للمجمع.source(String, Optional) — مسار المصدر أو معرف التصدير (مثل سلسلة تصدير NFS البعيدة).target(String, Optional) — معرف التخزين أو المسار المستهدف.autostart(Boolean, Optional) — تشغيل مجمع التخزين تلقائيًا عند إقلاع نظام المضيف. الافتراضيtrue.scope(String, Optional) — النطاق المنطقي لمستودع التخزين. القيم المدعومة هيlocalأوshared. الافتراضيlocal.
cockpit_switch
يدير محول شبكة (شبكة افتراضية) على مضيف Vapor.
مثال على الاستخدام
resource "cockpit_switch" "example" {
name = "vnet-nat-example"
host_id = "host-uuid-here"
mode = "nat"
ip_address = "192.168.100.1"
netmask = "255.255.255.0"
dhcp_start = "192.168.100.10"
dhcp_end = "192.168.100.100"
autostart = true
}مرجع الوسائط (Argument Reference)
name(String, Required) — اسم محول الشبكة الافتراضي.host_id(String, Required) — المعرف الفريد (UUID) لمضيف Vapor المستهدف.mode(String, Required) — وضع إعادة توجيه الشبكة. القيم المدعومة هيnatوbridgeوrouteوisolated.bridge(String, Optional) — اسم جهاز واجهة الجسر الخاصة بالمضيف.ip_address(String, Optional) — عنوان IP المعين لواجهة الجسر.netmask(String, Optional) — قناع الشبكة الفرعية لشبكة الجسر.dhcp_start(String, Optional) — عنوان IP لربط بداية مجمع تخصيص DHCP.dhcp_end(String, Optional) — عنوان IP لربط نهاية مجمع تخصيص DHCP.autostart(Boolean, Optional) — تشغيل المحول الافتراضي تلقائيًا عند إقلاع المضيف. الافتراضيtrue.domain(String, Optional) — بادئة اسم نطاق DNS لتعيينها لعملاء DHCP.
البناء البرمجي للتطوير المحلي
للتطوير أو اختبار تعديلات الموفر المخصصة محليًا، يمكنك بناء الثنائي للموفر من المصدر باستخدام الأمر التالي:
go build -o terraform-provider-cockpit