مجردة. مقالة حول برنامج نصي بسيط للغاية يشكل تكوينًا لنظام التشغيل ssh Linux من قائمة الخوادم. تم اختباره على Ubuntu 18 ، ويستخدم Goodle Cloud SDK و Python 2.7 و Bash.
بعد زيادة حادة في عدد الخوادم التي يجب أن أعمل معها ، أدركت أن تخزين كلمة المرور و CMDB لم يعدا يوفران مثل هذا الوصول التشغيلي ، كما هو الحال في تلك الأيام عندما تذكرت فقط جميع تفاصيل بروتوكول الإنترنت (IP) والتفاصيل عن ظهر قلب. ربما لأن CMDB لم نتقن بعد. ومع ذلك ، من الضروري بطريقة ما حل مشكلة الوصول السريع عبر SSH إلى عدد كبير من الخوادم.
التالي - من وجهة نظر محطة Linux (تم تنفيذها على Ubuntu 18). ربما كان يعمل في توزيعات أخرى ، وربما ، هناك حتى التناظرية على ويندوز - أنا لم أنظر.
المتطلبات الرئيسية:
- من السهل أن أكرر. العديد من المسؤولين
وتحتاج إلى القدرة على تكوين نفسه للجميع. بالإضافة إلى ذلك ، نحن نسمح بالعمل عن بُعد - على الأقل يكون لكل جهاز كمبيوتر محمول موقف ، لكن في بعض الأحيان لا تعمل على الكمبيوتر المعتاد "طويل المدى والمصحح". - تتم إضافة الخوادم وحذفها وتغيير العناوين. وينبغي النظر في هذا.
للقيام بذلك ، قررت استخدام مضيفات الاسم المستعار في إعدادات ssh ، والحصول على قائمة الخوادم من خلال عميل gcloud cli GCP ، وأتمتة كل ذلك باستخدام Python 2.7 (لأنه كان افتراضيًا في Ubuntu وقررت دراسته للعمل مع البيانات). البرنامج النصي نفسه مع وصف تحت الخفض.
بيان المشكلة
كانت الفكرة هي: الاحتفاظ بقائمة بخوادم الأسماء المستعارة للاتصالات وعناوينها الحالية بطريقة لا يمكن استخدام سوى اسم لإقامة اتصال. في الوقت نفسه ، يتم تحديث القائمة نفسها بشكل دوري من GCP بواسطة API.
نتيجة لذلك ، كانت هناك العديد من المهام:
- الاتصال بالمضيف بكتابة فقط اسمًا لا يُنسى (عادةً ما نقوم بتكوين الأسماء وفقًا لقواعد صارمة ، لذلك يكفي معرفة العميل والنظام لتخمين اسم الخادم بشكل شبه مؤكد). يمكن أن تكون الأسماء حقيقية (إذا تم إنشاء الخادم بالكامل من قبلنا) أو اسم مستعار داخل cmdb (إذا تم إنشاء الخادم من قبل العميل وتم تعيين الاسم وفقًا لقواعد العميل). في أي حال ، تذكر اسم أسهل من عنوان. يتغير العنوان أيضًا.
- الحصول على قائمة المضيفين الحاليين مع عناوين صالحة. لأن النظام الأساسي هو GCP و 90٪ من الخوادم موجودة ، ثم سيتم حل هذه المشكلة من خلال واجهة برمجة التطبيقات ، وليس عن طريق أدوات المراقبة.
- البحث عن طريق اسم المضيف. على الرغم من سهولة تذكرها ، إلا أن العدد يزداد ، والذاكرة ليست محدودة :) نعم ، والمسؤولون الجدد أسهل.
- تحديث حزمة الاسم المستعار - العنوان فقط عندما يتغير العنوان. هذا ضروري من أجل التخلي عن إعادة كتابة كاملة لجميع الحزم. سيسمح ذلك بتخزين حزم ليس فقط لخوادم GCP. حتى الآن لم يتم حل هذه المشكلة :(
وصف الحل
الاسم المستعار للاتصال
كل شيء هنا بسيط للغاية ولم يقرر من قبلي. تدعم أداة Linux ssh تهيئة الاسم المستعار في ملف التكوين.
موقع الملف: ~ / .ssh / config
تنسيق الملف الذي استخدمناه عادي للغاية ، ولكن في الواقع هناك احتمالات أوسع بكثير:
HOST alias_ HostName ip__-
يمكنك قراءة المزيد حول خيارات التكوين هنا ، هنا أو في الوثائق الرسمية .
خطوات إضافية
- استخدم مفاتيح مختلفة للاتصال بمجموعات مضيفة مختلفة. وهناك القليل من جنون العظمة من حيث السلامة لن يضر.
- توفير نسخة احتياطية من هذا الملف للحماية من التغييرات العرضية وتحديث أخطاء البرنامج النصي.
البحث عن أسماء المضيفين
هنا القرار ليس ملكًا لي على الإطلاق ، ولكن بن لوبوغ ، وهو موصوف في مقاله .
قلت باختصار ، لقد استخدمت sed ، والتي ، لسهولة البدء (قاعدة طويلة جدًا في المعلمات) تم اختصارها عبر الاسم المستعار:
alias sshhosts="sed -rn 's/^\s*HOST\s+(.*)\s*/\1/ip' ~/.ssh/config"
إذا كنت بحاجة إلى العثور على المضيف من خلال جزء الاسم ، فسيتم إكمال هذا البرنامج النصي تمامًا بواسطة الأداة المساعدة grep وكنتيجة لذلك ، يظهر الأمر كما يلي:
sshhost | grep '---'
هناك خيارات أخرى ، على سبيل المثال ، كما هو موضح هنا .
الإكمال التلقائي لاسم المضيف
شكرا للحل onix74 !
أضف السطر إلى ~ / .bash_completion:
complete -W "$(grep "^HOST " ~/.ssh/config | grep -v "\*" | sed 's/[^ ]* *\(.*\)/\1/')" ssh
بالنسبة إلى الأمر ssh ، سيعمل الإكمال التلقائي وفقًا لقائمة خوادم الاسم المستعار. أي يمكنك استخدام ssh لاستبدال اسم خادم ssh. كان يعمل في باش.
خطوات إضافية
أخطط لتقسيم الأجهزة المضيفة إلى مجموعات بحيث يمكنك تحديد جميع خوادم عميل معين أو مع تطبيق معين. يبدو أن هذه الميزة ستكون مثيرة للاهتمام لتنفيذ البرنامج النصي الشامل و Ansible الصدد ؛ وكذلك لإنشاء تفاصيل اتصال مختلفة لمجموعات مختلفة. ولكن ما مدى منطقية حقا يبقى أن نرى.
الحصول على قائمة المضيفين من GCP
في هذه الخطوة ، كل شيء بسيط للغاية ، باستثناء إعدادات المعلمة (على الرغم من أنها هنا تجربة). قررت استخدام GCloud SDK للحصول على البيانات ، لأن بينما نادراً ما أستخدمه ، لكنني أفترض أنه في وقت ما سوف يسمح لي ذلك باستخدام الواجهة الرسومية بشكل أقل وأقل وتبسيط روتين الإدارة. لذلك ، فإن الحجة الرئيسية هي لاكتساب الخبرة.
ربما ، يمكن القيام بالشيء نفسه باستخدام curl و GCP REST API ، وبعد ذلك سيكون الحل أكثر عالمية (لأن وحدات SDK في GCloud تتطلب تثبيت وتهيئة منفصلين ، وهي ليست معقدة للغاية ، ولكنها لا تزال مطلوبة).
للحصول على المعلومات اللازمة ، كان علي استخدام تنسيق json. على الرغم من أن هذا سهّل بشكل كبير المعالجة الإضافية للإجابة المستلمة ، إلا أنه جعل المرء يفكر قليلاً في إعداد معلمات التنسيق في SDK.
نتيجة لذلك ، تلقيت الأمر التالي:
gcloud compute instances list --filter="status:running" --format="json(name, status, networkInterfaces[].accessConfigs[])"
تقوم بإرجاع الخوادم النشطة حاليًا فقط (لا معنى للاتصال بالآخرين) بمعلومات حول الاسم وواجهة الشبكة. حتى الآن ، يتم استخدام واجهة خارجية واحدة فقط لكل خادم.
النتيجة النهائية تصل في json:
[ ---...---- { "name": "-", "networkInterfaces": [ { "accessConfigs": [ { "kind": "compute#accessConfig", "name": "External NAT", "natIP": "ip-", "networkTier": "PREMIUM", "type": "ONE_TO_ONE_NAT" } ] } ], "status": "RUNNING" }, ----...--- ]
خطوات إضافية
ابحث عن التنسيق الذي سيقلل من مخرجاته المعالجة اللاحقة أو يلغيها.
برنامج نصي لإنشاء قائمة مستعارة تستند إلى بيانات من برنامج "شركاء Google المعتمدون"
تم كتابة السيناريو في بيثون 2.7 لسببين:
- قررت دراستها للعمل مع البيانات ؛
- بيثون 2.7 هو افتراضيا على معظم الأنظمة التي تعمل بنظام لينكس - لن تكون هناك مشاكل في استخدامه في أي مكان آخر. بالنظر إلى أن الفوز حتى الآن يسمح لك بوضع نظام ثان واستخدام أوبونتو كمحطة.
الخوارزمية هي كما يلي:
- نحصل على قائمة الخوادم من Google Cloud باستخدام SDK ، ونبدأ تنفيذ الأمر في وحدة التحكم من python.
- نقوم بتحليل JSON الناتج إلى أنواع صديقة للثعبان.
- نعطي الإخراج بالتنسيق الضروري لتكوين ssh (إذا لزم الأمر ، تتم إعادة توجيه إخراج البرنامج النصي إلى ~ / .ssh / config أو إلى بعض الملفات الوسيطة).
تحديث فقط البيانات المعدلة
هذه المهمة لا تزال جارية. أخطط لقراءة ملف ssh / config في نفس البرنامج النصي ، ومقارنته بالقيم المستلمة ، ثم أعد كتابة النتيجة بالكامل مرة أخرى. أو قم بإنشاء ملف جديد بشكل منفصل وإجراء مقارنة باستخدام نوع من الاختلافات - سيتيح لك ذلك تأكيد جميع التغييرات يدويًا.