SSD Nodes Learn
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-07-22

إدارة خوادم Linux المتعددة: أدوات فعّالة

SSH config وtmux وAnsible وUptime Kuma وZabbix وWebmin، مرتّبة بحسب عدد خوادمك: ما يستبدله كل واحد، وتكلفة إعداده بالدقائق، والفخ الوحيد.

ما الذي تبنيه

ليست أداة واحدة، بل مجموعة صغيرة من الأدوات، تُختار بحسب عدد الخوادم التي تملكها فعلًا. هذا الرقم هو المُدخَل الوحيد المهم، وهو بالضبط ما تتجاهله كل مقالة "أفضل أدوات إدارة خوادم Linux". الخطأ الكلاسيكي هو تبنّي حلٍّ مصمَّم لمئتي خادم بينما تملك أربعة خوادم VPS فقط، وقضاء شهر كامل في تغذية الأداة بدلًا من الخوادم. أما الخطأ الكلاسيكي الثاني فهو صاحب الثمانية عشر خادمًا الذي ما زال يتصل بكل واحد منها يدويًا عبر SSH، ويطبّق "التغيير نفسه" بثماني عشرة طريقة مختلفة قليلًا.

لذلك يُنظَّم هذا الدليل بحسب حجم أسطول الخوادم (fleet): من 2 إلى 5 خوادم، ثم من 5 إلى 20، وما بعد 20 — إضافة إلى الطبقة المشتركة التي تنطبق على كل الأحجام ولا يدوّنها أحد: ملف جرد، ونظافة المفاتيح، وباب دخول واحد، ونسخ احتياطية استعدتها فعلًا واختبرتها. تحصل مقابل كل أداة على ثلاثة أشياء: ما الذي تستبدله، وتكلفة إعدادها بالدقائق، والفخ الوحيد الذي يؤذي فعلًا. أدير استضافة VPS منذ خمسة عشر عامًا؛ والقائمة أدناه هي ما يصمد أمام انقطاع في تمام الثانية صباحًا، لا ما يبدو جيدًا في عرض تجريبي.

المتطلبات المسبقة والفخاخ الحقيقية

تحتاج إلى مصادقة SSH بالمفاتيح تعمل بالفعل على كل خادم (إن كنت ما زلت تكتب كلمات المرور، فأصلح ذلك أولًا؛ الأمر يستغرق عشر دقائق وكل ما يلي يفترض وجود المفاتيح)، ومستخدم sudo ليس root، وخوادم تشغّل نظامًا حديثًا. تفترض الأوامر هنا Ubuntu 24.04، لكن لا شيء هنا خاص بـ Ubuntu باستثناء apt.

تحذيران صادقان قبل الدخول في الأدوات. أولًا، تكاثر الأدوات نفسه مشكلة إدارية: كل عميل (agent) تثبّته هو برنامج خفي إضافي يجب تصحيحه على كل جهاز، لذلك ينبغي أن يكون معيار إضافة أداة "هذه تستبدل عملًا يدويًا قمت به هذا الأسبوع"، لا "تبدو مفيدة". ثانيًا، كل ما هنا برمجيات حرة، والتكلفة الحقيقية هي وقت الإعداد، ولهذا يُرفَق بكل أداة تقدير بالدقائق؛ وحين يقول التقدير "بعد ظهر كامل"، صدّقه.

من 2 إلى 5 خوادم: ~/.ssh/config هي الأداة الأكثر تجاهلًا التي تملكها بالفعل

ما تستبدله: الملف النصي لعناوين IP، والتنقيب في سجل الأوامر (ssh 203.0 ثم Ctrl-R والدعاء)، وكتابة -p 2222 -i ~/.ssh/other_key إلى الأبد. تكلفة الإعداد: 15 دقيقة، مرة واحدة. الفخ: مقابس (sockets) تعدد إرسال متقادمة، سنتناولها أدناه.

في هذا الحجم لا تحتاج إلى برنامج جديد؛ بل تحتاج إلى العميل (client) الذي تملكه أصلًا مُعدًّا بجدية. يحوّل ~/.ssh/config كل خادم إلى اسم من كلمة واحدة، ويضبط التوجيه (routing) بحيث لا تفكر فيه ثانية:

Host *
    ServerAliveInterval 30
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h-%p
    ControlPersist 10m

Host bastion
    HostName 10.0.0.10
    User matt

Host web1
    HostName 10.8.0.11
    User matt
    ProxyJump bastion

Host db1
    HostName 10.8.0.12
    User matt
    Port 2222
    ProxyJump bastion

ثلاثة إعدادات تقوم بكل العمل. يوجّه ProxyJump الاتصالات عبر مضيف بستيون (bastion) بقفزة واحدة، فيمر ssh db1 من مقهى عبر bastion بشفافية تامة — بلا إعادة توجيه للعميل (agent forwarding)، وبلا تعويذات ProxyCommand، والخوادم الخاصة لا تحتاج إطلاقًا إلى منافذ SSH عامة (مزيد من التفصيل في القسم المشترك أدناه). يعدِّد ControlMaster auto مع ControlPersist إرسال الاتصالات عبر جلسة TCP واحدة، فيتصل ثاني أمر ssh أو scp أو rsync إلى المضيف نفسه، وكل ما يليه، فورًا بدل إعادة التفاوض — فرق يصبح كبيرًا حين يدخل Ansible الصورة. ولأن scp وrsync وAnsible جميعها تقرأ هذا الملف نفسه، فكل اسم تعرّفه هنا يعمل في كل مكان.

الفخ: قد يبقى الاتصال الرئيسي (master) بعد أن تنتهي فائدته، وشكلا الفشل مختلفان. فحين يعيد الخادم الإقلاع أو ينقطع Wi-Fi لديك، تبقى العملية الرئيسية ممسكة بجلسة TCP ميتة لم تلاحظها بعد، فيتجمد أمر ssh web1 التالي في صمت على مقبس لا يقود إلى شيء. وعلى نحو منفصل، يحدّ sshd جلسات كل اتصال بعشر جلسات (MaxSessions في sshd_config)، فتطبع الجلسة الحادية عشرة المُعدَّدة إلى مضيف واحد:

mux_client_request_session: session request failed: Session open refused

لكليهما الحل نفسه: يقتل ssh -O exit web1 العملية الرئيسية، ويبدأ الاتصال التالي واحدة جديدة. وقد ترى أحيانًا أيضًا رسالة ControlSocket ~/.ssh/cm-matt@web1-22 already exists, disabling multiplexing — وهذه غير ضارة: تسابقت جلستان، والاتصال ما زال يعمل، لكن دون تعدد إرسال.

رفيقان في هذا الحجم. tmux على كل خادم يستبدل nohup، والعمل الضائع حين ينقطع Wi-Fi، وعبارة "لا أستطيع إغلاق حاسوبي المحمول، هناك عملية ترحيل قيد التنفيذ". تكلفة الإعداد: sudo apt install -y tmux، دقيقتان، بالإضافة إلى الذاكرة العضلية لأمري tmux new -s work وtmux attach -t work. الفخ هو التعشيش (nesting): تشغيل tmux داخل tmux يبتلع مفتاح البادئة (prefix) الخاص بك، لذا شغّله إما على الخادم وإما على الحاسوب المحمول، لا على كليهما. وإن كنت تشغّل جلسات عملاء (agents) طويلة الأمد فهذا يهمّ بشكل مضاعف — إنه النمط نفسه في تشغيل Claude Code داخل tmux على خادم VPS، حيث يجب أن تبقى الجلسة حية بعد انتهاء اتصال SSH.

ملف اختصارات (aliases) مشترك يستبدل إعادة كتابة اثني عشر سطرًا مفضلًا على كل جهاز. احتفظ بملف .bash_aliases في مستودع git واسحبه إلى كل خادم. الفخ: يبدأ في الانحراف (drift) بمجرد أن تعدّله مباشرة على خادم واحد بدلًا من المستودع — وهذا أيضًا أول مؤشر على سبب وجود المستوى التالي.

من 5 إلى 20 خادمًا: الإعداد كشيفرة (config as code)، وإلا فاز الانحراف

في مكان ما بعد خمسة خوادم، تتوقف عبارة "سأفعلها فقط على كل جهاز" عن كونها منهجًا وتتحول إلى كذبة تخدع بها نفسك. الأدوات في هذا المستوى تهاجم جميعها العدو نفسه: الانحراف (drift).

Ansible يستبدل حلقة shell المتكررة على أسماء المضيفين، وصفحة الويكي المعنونة "إعداد خادم جديد" المتأخرة ثلاث خطوات، والقلق من عدم معرفة ما إذا كان web3 قد حصل فعلًا على الإصلاح. تكلفة الإعداد: 30 دقيقة للوصول إلى أول دفتر تشغيل (playbook) يعمل — sudo apt install -y ansible على حاسوبك المحمول أو جهاز إدارة (الإصدار الذي يمنحك إياه apt أقدم قليلًا، وهذا مقبول تمامًا لكل ما هنا؛ أما طريق pipx في الدرس فيمنحك الإصدارات الحالية)، بلا أي عملاء (agents) على الخوادم، وكل شيء يعمل فوق إعداد SSH الذي بنيته بالفعل. إنه أكبر ترقية منفردة في هذه الصفحة، والشرح الكامل موجود في درس أول دفتر تشغيل Ansible؛ وإليك شكل الجرد (inventory) الذي يجعله يعمل:

[web]
web1 ansible_host=10.8.0.11
web2 ansible_host=10.8.0.12

[db]
db1 ansible_host=10.8.0.21 ansible_port=2222

[all:vars]
ansible_user=matt
ansible_ssh_common_args='-o ProxyJump=bastion'

ولأن Ansible يستدعي ملف OpenSSH التنفيذي مباشرة، فإن ~/.ssh/config الذي كتبته في القسم السابق ينطبق أصلًا — إذ يعمل جرد بأسماء مجردة مثل web1 من دون أي متغيرات على الإطلاق. أما المتغيرات أعلاه فتجعل الجرد مكتفيًا ذاتيًا بدلًا من ذلك، وهذا يُثمر يوم تشغّله من جهاز ليس حاسوبك المحمول.

اختبره بالأمر ansible all -i inventory.ini -m ping؛ والنتيجة الصحيحة تطبع "ping": "pong" لكل مضيف، باللون الأخضر. أما أول فشل ستصادفه فيبدو هكذا:

web1 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: matt@10.8.0.11: Permission denied (publickey).",
    "unreachable": true
}

هذه ليست مشكلة في Ansible — فأمر ssh matt@10.8.0.11 البسيط يفشل بالطريقة نفسها. أصلح SSH أولًا، دائمًا؛ فصحة Ansible لا تتجاوز صحة الطبقة التي تحته. الفخ الوحيد بعد ذلك: يحتاج Ansible إلى Python على الطرفين، فقد تجيبك صورة نظام قليلة المكوّنات حقًا برسالة /usr/bin/python3: not found — أمر واحد apt install python3 ولن يزعجك مجددًا أبدًا.

unattended-upgrades يستبدلك بوصفك الشخص الذي يطبّق التصحيحات الأمنية على N من الخوادم. يأتي Ubuntu Server 24.04 الأصلي مثبَّتًا مسبقًا وعادة مفعَّلًا بالفعل للتحديثات الأمنية، لذلك فالمهمة هنا هي التحقق، لا التثبيت:

cat /etc/apt/apt.conf.d/20auto-upgrades

يجب أن ينتهي كلا السطرين بـ "1". بعض الصور الدنيا وصور السحابة تأتي وهي معطَّلة، ويعيد sudo dpkg-reconfigure -plow unattended-upgrades كتابة ذلك الملف إن كانت هذه حالة صورتك. تكلفة الإعداد: دقيقتان للتحقق من كل خادم، أو مهمة Ansible واحدة لجميعها. الفخ: هي لا تعيد الإقلاع مطلقًا بشكل افتراضي، فتبقى تحديثات أمان النواة (kernel) نصف مطبَّقة حتى تفعل ذلك أنت — ويغطي الدليل المخصص لـ unattended-upgrades إعادة الإقلاع التلقائية، واختيار ما يُصحَّح، وقراءة سجلاتها.

المراقبة المركزية تستبدل معرفة الخبر من أحد الزبائن، وهو أغلى نظام مراقبة اختُرع على الإطلاق. أداتان، وسطر واحد لكل منهما عن وقت استخدامها: يجيب Uptime Kuma عن سؤال "هل هو يعمل؟" — فحوصات HTTP وTCP وping مع تنبيهات إلى أي وجهة — ويستغرق عشر دقائق في Docker؛ ويجيب Zabbix عن سؤال "هل هو على وشك الانهيار؟" — اتجاهات القرص والذاكرة والمعالج عبر عميل (agent) على كل مضيف — ويستغرق فعلًا بعد ظهر كاملًا. ابدأ بـ Kuma؛ وأضف Zabbix حين تبدأ حالة "يعمل لكن بأداء متدهور" في تكليفك مالًا. الفخ المشترك بينهما هو الموضع (placement)، وهو مهم بما يكفي ليتصدر قسم الأخطاء أدناه.

لوحة تحكم ويب، فقط إن اضطررت. يستبدل Webmin تذكّر أين يضع Ubuntu الأشياء، وهو مفيد فعلًا لفريق متفاوت المهارات أو لخادم تلمسه مرتين في السنة؛ والإعداد يستغرق عشر دقائق. الفخ أنه تطبيق ويب مكافئ لصلاحيات root يستمع على المنفذ 10000، والإنترنت يمسحه باستمرار بحثًا عنه. إن شغّلته، فاربطه بـ localhost أو بعنوان VPN — لا بـ 0.0.0.0 على واجهة عامة أبدًا. وإن كنت تلجأ إلى لوحة تحكم لأن SSH يبدو بطيئًا، فأعد قراءة القسم السابق أولًا؛ فـ ~/.ssh/config مع Ansible أسرع من أي لوحة تحكم بعد ضبطها.

أكثر من 20 خادمًا: حيث ينتهي هذا الدليل فعلًا

بعد عشرين خادمًا تدير أسطولًا (fleet)، وتتغير طبيعة سلسلة الأدوات: Terraform أو OpenTofu لتكون الخوادم نفسها قابلة لإعادة الإنتاج، وcloud-init أو صور ذهبية (golden images) لتكون الآلة قابلة للتخلص منها بدل الإصلاح، وإعداد بنمط السحب (pull) أو خطوط أنابيب CI تشغّل Ansible الخاص بك لأن الدفع (push) من حاسوب محمول يتوقف عن التوسّع، وإدارة حقيقية للأسرار (secrets). لا ينهار Ansible نفسه عند العشرين — فكثير من الشركات تشغّله على مئات العُقد — لكن الممارسات المحيطة به يجب أن تتصلّب، وذلك مقال مختلف عن الذي يكتبه هذا الموقع. إن كنت في ذلك النطاق، فالقسم أدناه ما زال يخصك، لأن الجرد والمفاتيح وانضباط الوصول هي بالضبط ما تفترض أدوات الأسطول أنك تملكه بالفعل.

الطبقة التي لا يدوّنها أحد

أربع ممارسات تنطبق على كل حجم أسطول، وتجاوزها هو سبب شعورك بأن عدد الخوادم أثقل مما هو عليه فعلًا.

ملف جرد (inventory) — ولو كان ملفًا نصيًا فقط. بمجرد أن يصبح لديك ثلاثة خوادم، دوّن: الاسم، وIP، والمزوّد، وما الذي يعمل عليه، ولماذا هو موجود. ملف servers.md في مستودع git يكفي؛ وجرد Ansible أعلاه أفضل لأنه توثيق قابل للتنفيذ. ما يستبدله: سؤال الثانية صباحًا "لحظة، ما هو 10.0.0.40؟". تكلفة الإعداد: عشر دقائق. الفخ: لا يعمل إلا إذا كان إنشاء الخادم وإضافة السطر فعلًا واحدًا، لا فعلين منفصلين أبدًا.

نظافة المفاتيح: التدوير الآن، وهيئة إصدار شهادات SSH (CA) حين يؤلم الأمر. أحصِ أماكن وجود مفاتيحك (cat ~/.ssh/*.pub من جهتك، و~/.ssh/authorized_keys من جهة كل خادم)، واحذف حواسيب محمولة سابقة وزملاء سابقين، ودوِّر كل مفتاح قديم بما يكفي بحيث لا تستطيع أن تجزم أين كان. هيئة إصدار شهادات SSH — شهادات موقَّعة قصيرة العمر بدل مفاتيح ثابتة — هي الحل الناضج، لكن النصيحة الصادقة أنه دون عشرة خوادم، تمنحك إدارة منضبطة لملف authorized_keys عبر Ansible 90% من الفائدة بـ 10% فقط من المراسم.

باب دخول واحد، لا عشرون. كل منفذ SSH عام هو سطح هجوم مضروب في N. النمط القابل للتوسّع: مضيف بستيون واحد — أو الأفضل، شبكة WireGuard VPN مستضافة ذاتيًا على خادم VPS تتحكم فيه — وربط SSH لكل خادم آخر بعنوانه الخاص فقط. أسطر ProxyJump في الإعداد أعلاه تفترض هذا الشكل أصلًا. وكل ما يجب أن يبقى عامًا يحصل على fail2ban كأمر بديهي. تكلفة الإعداد: ساعة واحدة، مرة واحدة. الفخ: تحقّق من أن خطة الطوارئ لديك (الوصول عبر وحدة تحكم المزوّد) تعمل قبل أن تغلق المنفذ 22 في كل مكان، لا بعد ذلك.

نسخ احتياطية اختُبرت بالاستعادة. النسخة الاحتياطية غير المُختبَرة مجرد فرضية. أيًّا كانت الآلية التي تستخدمها — لقطات (snapshots) المزوّد، أو restic، أو rsync إلى جهاز ثانٍ — فالأداة التي تهم فعلًا هي موعد التقويم الذي تستعيد فيه خادمًا واحدًا على VPS جديد وتتأكد من أنه يقلع ويخدم. كل قصة رعب عن النسخ الاحتياطي سمعتها في خمسة عشر عامًا من الاستضافة تحتوي على العبارة "كانت لدينا نسخ احتياطية".

الأخطاء

أنماط الفشل على نطاق تعدد الخوادم ليست إخفاقات أدوات؛ بل هي عادات. أربع منها تفسّر كل شيء تقريبًا.

خوادم متفردة (snowflake). كل جهاز أُعدّ يدويًا، ويختلف قليلًا عن غيره، ولا أحد يستطيع إعادة بنائه. تكتشف ذلك أثناء عطل في القرص. العلاج مملّ: كل تغيير يمر عبر Ansible — أو على الأقل يُضاف إلى قسم ذلك الخادم في وثيقة الجرد — وأي خادم لا تستطيع إعادة بنائه من الملاحظات بعد ظهر اليوم هو دَين تقني بموعد استحقاق لا تختاره أنت.

ثغرات جدار حماية "مؤقتة". أمر ufw allow 5432 لتصحيح خلل ما، وبعد ثمانية عشر شهرًا ما زال Postgres على الإنترنت. دقّق بالأمر sudo ufw status numbered على كل جهاز — أو دفعة واحدة بالأمر ansible all -i inventory.ini -a "ufw status numbered" --become — واحذف أي شيء لا تستطيع تسمية سبب حالي له. وإن كانت قاعدة ما مؤقتة فعلًا، فضع أمر ufw delete المقابل لها في نافذة tmux نفسها قبل أن تغلقها.

مراقبة مستضافة على جهاز مُراقَب. إن كان Uptime Kuma يعمل على الخادم نفسه الذي يراقبه، فإن التنبيه الذي يقول "كل شيء معطل" يكون هو أيضًا معطلًا — فتكون قد بنيت نسخة أصغر وأكثر طرافة من أقل مركز بيانات كفاءة في العالم. يجب أن تكون المراقبة في نطاق فشل مختلف: خادم VPS رخيص عند مزوّد مختلف هو الجواب الكلاسيكي، أو على الأقل فحص خارجي مجاني يراقب المراقِب.

دخول root عبر SSH في كل مكان. مفتاح root واحد مشترك عبر الأسطول يعني أن حاسوبًا محمولًا واحدًا مسرَّبًا يمتلك كل شيء، ولا سجل تدقيق يقول من فعل ماذا. حساب مستخدم مستقل لكل شخص، وsudo، وضبط PermitRootLogin no في /etc/ssh/sshd_config على كل مضيف — وهي، مرة أخرى، مهمة Ansible من ثلاثة أسطر بدل أمسية كاملة من الكتابة.

وحين ينمو الأسطول متجاوزًا حفنة من الخوادم، فإن أول دفتر تشغيل Ansible خاص بك يؤتمت الأجزاء المتكررة.

FAQ

ما أفضل أداة مجانية لإدارة خوادم Linux المتعددة؟

من 2 إلى 5 خوادم، يتفوق ملف ~/.ssh/config مكتوب جيدًا مع tmux على أي شيء يمكنك تثبيته. ومن نحو خمسة خوادم فما فوق، يصبح Ansible الجواب المعياري: بلا عملاء (agentless)، ومجاني، ويعمل فوق SSH الذي تملكه أصلًا، ويحوّل إعداد الخوادم إلى ملفات في git. أضف Uptime Kuma للتنبيه عند التعطل والعودة؛ فكل أداة وردت في هذا الدليل برنامج حر.

هل يمكنني إدارة خوادم Linux المتعددة من دون Ansible؟

نعم — دون نحو خمسة خوادم، يكفي إعداد SSH جيد وملف اختصارات مشترك وانضباط، ويعمل كثير من الناس بهذه الطريقة لسنوات. وبعد ذلك، البديل عن Ansible ليس "لا شيء"، بل انحراف غير موثّق: ثمانية عشر خادمًا كل واحد منها مُعدّ يدويًا بشكل مختلف قليلًا. وإن بدا Ansible ثقيلًا، ابدأ بدفتر تشغيل واحد لا يدير سوى authorized_keys وunattended-upgrades؛ وحده هذا يعوّض منحنى التعلّم.

كيف أنفّذ الأمر نفسه على عدة خوادم Linux في آن واحد؟

الأمر ansible all -i inventory.ini -a "uptime" هو الجواب النظيف ولا يحتاج إلى أي دفتر تشغيل، بل فقط ملف الجرد. أما للعمل التفاعلي جنبًا إلى جنب، فيستطيع tmux بث ضربات المفاتيح إلى كل لوحة (pane) بالأمر setw synchronize-panes on — لكن عامل ذلك كحيلة استعراضية، لأن بث أوامر تفاعلية إلى خوادم الإنتاج هو بالضبط كيف يتحول خطأ كتابي واحد إلى انقطاع مضروب في N.

هل أحتاج إلى لوحة تحكم مثل Webmin لإدارة خوادم Linux؟

تحتاج؟ لا — فكل ما تفعله لوحة التحكم يفعله SSH وAnsible بقابلية أكبر لإعادة الإنتاج. يكسب Webmin مكانه حين يدير الأجهزة نفسها أشخاص متفاوتو المهارة، أو حين تلمس خادمًا نادرًا بما يكفي بحيث يكلّفك إعادة اكتشاف مسارات الإعداد وقتًا حقيقيًا. وإن شغّلت واحدة، فعاملها كما هي فعلًا: تطبيق ويب مكافئ لصلاحيات root — اربطها بـ localhost أو بعنوان VPN، لا بواجهة عامة أبدًا.

كم خادم Linux يستطيع شخص واحد إدارته واقعيًا؟

مع الإدارة اليدوية، تبدأ الجودة بالتراجع في مكان ما دون عشرة خوادم. أما مع الإعداد كشيفرة، والتصحيح الآلي، والمراقبة المركزية، فيستطيع شخص حريص إدارة 20 إلى 50 خادمًا كعمل بدوام جزئي — والقيد يصبح مدى تكرار تعطّل شيء جديد، لا العناية الروتينية. والرقم المهم ليس عدد الخوادم لكل مدير، بل عدد الخوادم المتفردة (snowflakes) لكل مدير: أبقِ ذلك قريبًا من الصفر ويصبح السقف مرتفعًا.