راهاندازی Heat برای Orchestration در OpenStack: ساخت خودکار زیرساخت با قالبهای HOT روی سرور اختصاصی
وقتی تعداد نمونهها، شبکهها و دیسکهای مجازی در یک محیط OpenStack از چند مورد بیشتر میشود، ساخت دستی هرکدام از طریق داشبورد Horizon یا خط فرمان دیگر جواب نمیدهد. همینجاست که Heat وارد میشود؛ سرویس Orchestration رسمی OpenStack که زیرساخت را از روی یک فایل متنی میسازد، بهروزرسانی میکند و در صورت نیاز حذف میکند.
این راهنما نصب و پیکربندی Heat را روی یک سرور اختصاصی که OpenStack روی آن اجرا میشود قدمبهقدم توضیح میدهد، بعد با یک قالب HOT واقعی یک استک کامل (شبکه، سرور، فلوتینگ آیپی) میسازیم و در پایان نحوه مدیریت و بهروزرسانی استکها را میبینیم.
Heat چیست و چه مشکلی را حل میکند؟
Heat یک پروژه Orchestration در OpenStack است که زیرساخت را از روی فایلهای توصیفی به نام HOT (Heat Orchestration Template) میسازد. بهجای اجرای چند دستور جداگانه برای ساخت شبکه، سابنت، روتر، سرور و فلوتینگ آیپی، همه این منابع در یک فایل YAML تعریف میشوند و Heat آنها را به ترتیب درست و با رعایت وابستگیها میسازد.
مزیت اصلی این روش تکرارپذیری است، همان ایدهای که در ابزارهای Infrastructure as Code مثل Terraform هم دیده میشود. یک قالب که یکبار نوشته و تست شده باشد، میتواند برای ساخت محیط تست، محیط Staging و محیط Production استفاده شود، بدون اینکه احتمال خطای انسانی در تنظیمات دستی وجود داشته باشد.
تفاوت Heat با ساخت دستی منابع
| ویژگی | ساخت دستی (CLI/Horizon) | Heat (HOT Template) |
|---|---|---|
| تکرارپذیری | هر بار باید دستی تکرار شود | با اجرای مجدد همان فایل |
| مدیریت وابستگی منابع | باید دستی ترتیب رعایت شود | Heat ترتیب را خودش مدیریت میکند |
| بهروزرسانی زیرساخت | ویرایش تکتک منابع | ویرایش فایل + stack-update |
| نگهداری تاریخچه تغییرات | وجود ندارد | فایل قالب قابل نسخهگذاری در Git است |
| حذف کامل یک محیط | حذف تکتک منابع | یک دستور stack-delete |
پیشنیازها
قبل از شروع، این موارد باید روی سرور اختصاصی آماده باشد:
- یک نصب فعال OpenStack با سرویسهای پایه (Keystone، Nova، Neutron، Glance، Cinder) که کار میکنند.
- دسترسی root یا sudo روی نودی که کنترلر OpenStack روی آن اجرا میشود.
- یک پایگاهداده MySQL/MariaDB و RabbitMQ که بقیه سرویسهای OpenStack هم از آنها استفاده میکنند.
- کلاینت OpenStack (
python3-openstackclient) روی ماشینی که از آن قالبها را اجرا میکنید.
اگر این پایه هنوز روی سرور اختصاصی شما آماده نشده، ابتدا باید یک محیط OpenStack سالم داشته باشید؛ Heat روی سرویسهای موجود کار میکند و جایگزین هیچکدام از آنها نیست.
نصب سرویس Heat
۱. ساخت پایگاهداده
روی نود کنترلر وارد MySQL شوید و پایگاهداده و کاربر Heat را بسازید؛ اگر این نود روی سرور اختصاصی جدیدی قرار است راهاندازی شود، منابع دیتابیس را متناسب با تعداد استکهایی که Heat مدیریت میکند در نظر بگیرید:
mysql -u root -p
CREATE DATABASE heat;
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';
FLUSH PRIVILEGES;
۲. ساخت کاربر و سرویس در Keystone
openstack user create --domain default --password-prompt heat
openstack role add --project service --user heat admin
openstack service create --name heat --description "Orchestration" orchestration
openstack service create --name heat-cfn --description "Orchestration CFN" cloudformation
سپس اندپوینتهای public، internal و admin برای هر دو سرویس ثبت میشوند؛ آدرسها باید به پورتهای پیشفرض Heat یعنی ۸۰۰۴ (Orchestration) و ۸۰۰۰ (CFN) اشاره کنند.
۳. نصب پکیجها
روی توزیعهای مبتنی بر Ubuntu/Debian:
apt install heat-api heat-api-cfn heat-engine
۴. ویرایش فایل پیکربندی
در /etc/heat/heat.conf اطلاعات اتصال به پایگاهداده، RabbitMQ و Keystone را تنظیم کنید:
connection = mysql+pymysql://heat:HEAT_DBPASS@controller/heat
[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
heat_metadata_server_url = http://controller:8000
heat_waitcondition_server_url = http://controller:8000/v1/waitcondition
www_authenticate_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = heat
password = HEAT_PASS
auth_type = password
auth_url = http://controller:35357
username = heat
password = HEAT_PASS
user_domain_name = default
auth_uri = http://controller:5000
۵. همگامسازی پایگاهداده و راهاندازی سرویسها
su -s /bin/sh -c "heat-manage db_sync" heat
systemctl enable heat-api heat-api-cfn heat-engine
systemctl restart heat-api heat-api-cfn heat-engine
برای اطمینان از نصب درست، لیست سرویسها را بررسی کنید:
openstack orchestration service list
اگر همه نودها وضعیت up داشته باشند، Heat آماده دریافت درخواست است.
نوشتن اولین قالب HOT
یک قالب HOT از سه بخش اصلی تشکیل میشود: parameters (ورودیهای قابل تنظیم)، resources (منابعی که باید ساخته شوند) و outputs (مقادیری که بعد از ساخت استک برگردانده میشوند).
نمونه زیر یک شبکه، یک سابنت، یک سرور و یک فلوتینگ آیپی میسازد:
heat_template_version: 2021-04-16
description: ساخت یک شبکه و سرور نمونه با Heat
parameters:
image:
type: string
label: Image
default: ubuntu-22.04
flavor:
type: string
label: Flavor
default: m1.small
key_name:
type: string
label: Key Pair
default: my-keypair
external_network:
type: string
label: External Network ID
default: public
resources:
app_network:
type: OS::Neutron::Net
properties:
name: app-net
app_subnet:
type: OS::Neutron::Subnet
properties:
network: { get_resource: app_network }
cidr: 10.20.0.0/24
dns_nameservers: [8.8.8.8]
app_router:
type: OS::Neutron::Router
properties:
external_gateway_info:
network: { get_param: external_network }
router_interface:
type: OS::Neutron::RouterInterface
properties:
router: { get_resource: app_router }
subnet: { get_resource: app_subnet }
app_server:
type: OS::Nova::Server
properties:
name: app-server
image: { get_param: image }
flavor: { get_param: flavor }
key_name: { get_param: key_name }
networks:
- network: { get_resource: app_network }
app_floating_ip:
type: OS::Neutron::FloatingIP
properties:
floating_network: { get_param: external_network }
port_id: { get_attr: [app_server, addresses, app-net, 0, port] }
outputs:
server_ip:
description: آدرس فلوتینگ آیپی نمونه ساختهشده
value: { get_attr: [app_floating_ip, floating_ip_address] }
نکته مهم: get_resource به منبعی داخل همین قالب اشاره میکند، در حالیکه get_param مقدار را از بخش parameters میخواند. اشتباه گرفتن این دو یکی از رایجترین خطاهایی است که هنگام اعتبارسنجی قالب دیده میشود.

اجرای استک
قبل از ساخت، قالب را اعتبارسنجی کنید:
openstack orchestration template validate -f app-stack.yaml
اگر خطایی برنگشت، استک را بسازید:
openstack stack create -t app-stack.yaml \
--parameter "key_name=my-keypair" \
--parameter "external_network=public" \
app-stack
وضعیت ساخت را دنبال کنید:
openstack stack list
openstack stack resource list app-stack
openstack stack show app-stack
وقتی وضعیت استک به CREATE_COMPLETE رسید، مقدار outputs از جمله فلوتینگ آیپی ساختهشده قابل مشاهده است:
openstack stack output show app-stack server_ip
بهروزرسانی و حذف استک
یکی از تفاوتهای اصلی Heat با ساخت دستی، امکان بهروزرسانی زیرساخت از طریق ویرایش همان فایل قالب است. مثلاً اگر flavor سرور باید تغییر کند، کافیست پارامتر جدید را پاس بدهید:
openstack stack update -t app-stack.yaml \
--parameter "flavor=m1.medium" \
app-stack
Heat خودش تشخیص میدهد کدام منابع نیاز به تغییر دارند و فقط همانها را بهروزرسانی میکند، بدون اینکه منابع دیگر (مثل شبکه یا فلوتینگ آیپی) را دوباره بسازد.
برای حذف کامل همه منابع ساختهشده توسط این استک:
openstack stack delete app-stack
این دستور به ترتیب معکوس وابستگیها، همه منابع را پاک میکند؛ یعنی ابتدا سرور و فلوتینگ آیپی، سپس روتر و در نهایت شبکه.
مانیتورینگ و دیباگ خطاهای رایج
اگر استک به وضعیت CREATE_FAILED رفت، اولین قدم بررسی لاگ خود منبعی است که شکست خورده:
openstack stack resource list app-stack --filter status=FAILED
openstack stack event list app-stack
رایجترین دلایل شکست در تجربه عملی:
- نبود کوتا کافی برای تعداد نمونه یا فلوتینگ آیپی در پروژه.
- نام image یا flavor اشتباه در پارامترها.
- فایروال یا Security Group پیشفرض که اجازه عبور ترافیک لازم را نمیدهد.
- شبکه خارجی (
external_network) که ID یا نام درستی ندارد.
لاگ سرویس heat-engine در /var/log/heat/heat-engine.log معمولاً دقیقترین پیام خطا را نشان میدهد، بهخصوص وقتی خطا از سمت Nova یا Neutron برگردانده شده و در خروجی CLI کامل نمایش داده نمیشود.
جمعبندی
Heat ساخت و مدیریت زیرساخت در OpenStack را از حالت دستی و تکراری به یک فرآیند قابل نسخهگذاری و تکرارپذیر تبدیل میکند. با یک قالب HOT، همان شبکه، سرور و تنظیمات شبکهای را میتوان بارها، بدون خطای دستی، روی محیطهای مختلف ساخت.
اگر هنوز زیرساخت OpenStack روی یک سرور اختصاصی با منابع پایدار و دیسکهای پرسرعت راهاندازی نشده، این پایه اول چیزی است که باید آماده باشد؛ پلنهای سرور اختصاصی آریانت برای همین نوع بار کاری طراحی شدهاند و میتوانند محیط تست یا Production شما برای OpenStack و Heat باشند.




