الاستنساخ أعطاك جهازاً في ثانيتين. لكنه جهاز بلا مستخدم يخصّ الزبون، وبلا عنوان، وبلا كلمة مرور. وإن كنت تفتح كونسولاً بعد كل استنساخ لتضبط هذه الثلاثة، فأنت لم تؤتمت شيئاً — نقلت العمل اليدوي من مكان إلى آخر.
Cloud-Init هو ما يكمل الطريق: تصف ما تريده بأمر واحد، ويتولّى الجهاز تنفيذه على نفسه في أول إقلاع.
كل رقم في هذه السلسلة مقيس لا مقدَّر. نفّذنا كل أمر على سيرفر Proxmox VE 9.2 حقيقي
بمعالج EPYC وتخزين LVM-thin على NVMe، وأخذنا الأزمنة من مخرجات time نفسها.
وقد استبدلنا العناوين العامة الحقيقية بعناوين التوثيق المخصّصة لهذا الغرض (RFC 5737) حفاظاً على أمان السيرفر.
كيف يعمل؟
بروكسموكس يولّد قرصاً صغيراً افتراضياً فيه إعداداتك، ويربطه بالجهاز. وعند أول إقلاع يقرأ cloud-init داخل النظام ذلك القرص وينفّذ ما فيه: ينشئ المستخدم، ويضبط العنوان، ويضع المفاتيح، ويوسّع القرص. ثم يسجّل أنه انتهى فلا يعيدها.
الأمر الكامل
qm set 8801 \
--ciuser maram \
--cipassword 'كلمة-مرور-قوية' \
--ipconfig0 ip=10.10.10.71/24,gw=10.10.10.1 \
--nameserver 1.1.1.1 \
--searchdomain lab.local \
--sshkeys ~/.ssh/authorized_keys \
--ciupgrade 0
qm start 8801
وبعد نحو نصف دقيقة يكون الجهاز يستجيب، ويستطيع الزبون الدخول إليه بالبيانات التي أرسلتها له.
ما يفعله كل خيار
| الخيار | ما يفعله | ملاحظة |
|---|---|---|
| --ciuser | ينشئ المستخدم ويعطيه sudo | لا تستعمل root |
| --cipassword | كلمة مروره | تُخزَّن مُعمّاة في إعداد الجهاز |
| --sshkeys | مفاتيح الدخول | الأفضل — وتُغني عن كلمة المرور |
| --ipconfig0 | عنوان الواجهة الأولى وبوّابتها | أو ip=dhcp |
| --nameserver | خادم الأسماء | بلا ضبطه قد يرث إعداد القالب |
| --ciupgrade | تحديث الحزم عند أول إقلاع | 0 أسرع في التسليم · 1 أأمن |
| --cicustom | ملف إعداد كامل تكتبه بنفسك | للحالات المتقدّمة |
تحقّق أنه اشتغل فعلاً
qm guest exec 8801 -- /bin/bash -c 'hostname; id maram; ip -4 -br a; cloud-init status'
الجواب الذي تريده هو status: done. وإن رأيت error فالسجلّ هنا:
cat /var/log/cloud-init-output.log
نقطة تربك كثيرين: القالب يجب أن يكون نظيفاً
cloud-init يعمل مرّة واحدة ثم يضع علامة «انتهيت». فإن حوّلت جهازاً إلى قالب بعد أن أقلع مرّة، ستحمل كل النسخ تلك العلامة ولن يعمل فيها شيء — وستبدو المشكلة كأن الأمر لم يُنفَّذ أصلاً. العلاج قبل qm template:
cloud-init clean --logs
truncate -s 0 /etc/machine-id
تخصيص أعمق بـ cicustom
الخيارات الجاهزة تغطّي أغلب الحالات. وحين تحتاج أكثر — تثبيت حزم، أو كتابة ملفات، أو تشغيل أوامر — اكتب ملفاً:
# /var/lib/vz/snippets/web.yaml
#cloud-config
package_update: true
packages:
- nginx
- fail2ban
write_files:
- path: /etc/motd
content: |
هذا السيرفر مُدار من مرام هوست
runcmd:
- systemctl enable --now nginx fail2ban
- ufw allow 80,443/tcp
qm set 8801 --cicustom "user=local:snippets/web.yaml"
وبهذا تسلّم للزبون سيرفر ويب جاهزاً يعمل — لا نظاماً فارغاً عليه أن يبنيه بنفسه.
مجلّد snippets يحتاج تفعيلاً على التخزين: من Datacenter ← Storage أضف Snippets إلى محتويات التخزين، وإلّا فلن يقبل الأمر المسار.
التوسيع التلقائي للقرص
حين تبيع باقة بقرص أكبر من القالب:
qm resize 8801 scsi0 +40G
وcloud-init يوسّع القسم ونظام الملفات تلقائياً عند الإقلاع. إن لم يفعل، فذلك لأن growpart غير مثبَّت في القالب — أضفه هناك، لا في كل نسخة.
الربط بنظام الطلبات
هنا يصبح كل ما سبق منتجاً لا إجراءً. أنظمة الفوترة تستدعي واجهة بروكسموكس البرمجية بالتسلسل نفسه:
POST /nodes/{node}/qemu/{template}/clone → استنساخ
PUT /nodes/{node}/qemu/{vmid}/config → ciuser · cipassword · ipconfig0
POST /nodes/{node}/qemu/{vmid}/status/start → تشغيل
ثلاثة نداءات، والنتيجة أن الزبون يدفع ويستلم بيانات سيرفره في دقيقتين بلا تدخّل منك. وهذا هو الفرق بين «أبيع سيرفرات» و«أشغّل مزوّد استضافة».
أخطاء شائعة وحلولها
| العَرَض | السبب | الحل |
|---|---|---|
| التغييرات لا تُطبَّق | القالب لم يُنظَّف قبل التحويل | cloud-init clean --logs ثم أعد البناء |
| عدّلت الإعداد ولم يتغيّر شيء | القرص القديم ما زال مربوطاً | أعد التشغيل كاملاً — لا reboot من الداخل |
| لا يوجد قرص cloud-init | لم يُضَف إلى الجهاز | qm set --ide2 <storage>:cloudinit |
| الجهاز بلا عنوان | ipconfig0 ناقص أو الجسر خاطئ | راجع qm config |
| القرص كبر ونظام الملفات لا | growpart غير مثبَّت | ثبّته في القالب |
| كلمة المرور لا تعمل | SSH يمنع الدخول بكلمة مرور | استعمل المفاتيح — أو عدّل الإعداد في القالب |
| cicustom يرفض المسار | Snippets غير مفعَّلة على التخزين | فعّلها من إعدادات التخزين |
أسئلة شائعة
هل يعمل cloud-init مع ويندوز؟
جزئياً وبأدوات مختلفة (Cloudbase-Init). الطريق المعتاد في ويندوز هو sysprep مع ملف إجابات.
أين تُخزَّن كلمة المرور؟
مُعمّاة داخل إعداد الجهاز في /etc/pve/qemu-server/. وهي متاحة لمن يملك root على السيرفر — أي أنها ليست سرّاً أمامك، وهذا سبب إضافي لتفضيل المفاتيح.
هل أستطيع تغيير العنوان بعد التسليم؟
نعم: عدّل ipconfig0 ثم أعد تشغيل الجهاز كاملاً — والجهاز سيأخذ العنوان الجديد.
ولماذا لا يعمل cloud-init مرّة ثانية؟
لأنه مصمَّم كذلك: هو للتهيئة الأولى لا للإدارة المستمرّة. ما بعد التسليم مكانه أدوات الإدارة أو سكربتاتك.
ما أفضل ممارسة لتسليم الزبون؟
مفتاح SSH إن كان الزبون تقنياً، وكلمة مرور قوية مؤقّتة مع إلزامه بتغييرها إن لم يكن. ولا ترسل كلمة المرور في نفس الرسالة التي فيها عنوان السيرفر.
الخطوة التالية
التسليم صار آلياً. بقي أن تستطيع أنت أن تجرّب أي شيء على هذه الأجهزة بلا خوف: في الجزء الرابع نكسر خدمة قصداً ونعيدها كما كانت في 49 ثانية.
هذه المقالة من سلسلة «بروكسموكس كمصنع سيرفرات» — من سيرفر واحد إلى تسليم آليّ لأجهزة زبائنك: ١. الشبكة والجسور والـVLAN · ٢. القوالب · ٣. Cloud-Init · ٤. اللقطات والاستنساخ · ٥. النسخ الاحتياطي واختبار الاسترجاع