في وقت كتابة هذا التقرير ، يحتوي فرع v2 على فئة Group
والتي يجب أن تكون قادرة على العمل كوحدات كانت تُعرف سابقًا باسم "الأدوار" ، ويعرف أيضًا باسم "مجموعة من المضيفين للقيام بالأشياء باستخدام / تشغيل".
ومع ذلك ، لا توجد طريقة محددة لتنظيم أو تسمية كائنات Group
حتى الآن ؛ لقد "تم" بشكل كافٍ لحالة استخدام واجهة برمجة التطبيقات (API) الخالصة للمستخدمين المتقدمين الذين يرغبون في طرح طريقتهم الخاصة في إنشائها ، ولكنها تفتقر إلى أي شيء للمستخدمين الموجهين لـ CLI أو الأشخاص المتوسطين الذين يريدون إنشاء إطار عمل حوله.
بعبارة أخرى ، ما لم تكن تتعامل تمامًا مع واجهة برمجة التطبيقات ، فإن وجود كائنات المجموعة في مكان ما يكون عديم الفائدة إذا لم يكن لدى CLI أو وحدات استدعاء المهام أي طريقة للعثور عليها!
في الإصدار 1 ، كانت الأدوار عبارة عن مساحة اسم مسطحة واحدة تقوم بتعيين تسميات سلسلة بسيطة لما يمكن أن تكون مجموعات في الإصدار 2 ، ويمكن تحديدها على CLI في وقت التشغيل ( fab --roles=web,db
) و / أو تسجيلها كأهداف افتراضية للمهام ( @task('db') \n def migrate():
) ، مثل المضيفين.
قام المستخدمون بتعريفهم بـ env.roledefs
، أمر بسيط ؛ تدور أي وظائف وسيطة إلى متقدمة حول تعديلها ، عادةً في وقت التشغيل (عبر المهمة السابقة أو الروتين الفرعي) ، أحيانًا في وقت تحميل الوحدة.
Group
s و / أو Connection
s.Lexicon
بدلاً من dict
.db
، web
، lb
، ولكن بعد ذلك اسم من الدرجة الثانية يسمى prod
التي هي دائما اتحاد الثلاثة الأخرى. نسيت إذا أضفت ذلك إلى Lexicon
حتى الآن. من المحتمل وجود فئات فرعية أخرى للخرائط تقوم بذلك بالفعل.if cxn in group
سيعمل حتى إذا كان cxn
كائنًا مميزًا من العضو المتساوي داخل group
.db
"@group
مثل @task
، والوظائف ليست وحدات عمل قابلة للتنفيذ ، ولكن بدلاً من ذلك تنتج كائنات المجموعة.من القائمة البريدية:
لقد قمنا بتثبيط واجهة برمجة تطبيقات REST الداخلية الخاصة بنا والتي تملأ env.roledefs بشكل ديناميكي اعتمادًا على المشروع الجاري نشره وتعتمد بشكل كبير على عدم تضمين سلاسل المضيف في ملف fabfile الخاص بالمشروع أو تحديدها في CLI.
حالات الاستخدام لدينا هي:
EnvironmentDatabaseAPIClient(
'https://rest.api.url/schema/',
env.service_name,
).apply_env()
عدد بيئات الخادم - بيئات اختبار متعددة (بعضها خاص وبعضها عام) وبيئات إنتاج متعددة (لعملاء مختلفين). تتكون كل بيئة من مضيف واحد أو أكثر ويتم تعيينها لدور النسيج.
كل خدمة ( env.service_name
في المثال أعلاه) لها مجموعة مختلفة من البيئات.
أيضًا لدينا أدوار وصفية (مجموعات من الأدوار). وهي مسبوقة بـ group-
: group-production
، group-test
، group-external
، group-internal
، group-all
. يتيح لنا ذلك النشر إلى أدوار خادم متعددة دون تحديدها واحدًا تلو الآخر ، على سبيل المثال ، يتم نشر group-all
لجميع الأدوار ، كل من الإنتاج والاختبار.
لدينا مهام نسيج خاصة لطباعة معلومات حول مجموعات الأدوار والأدوار والمضيفين.
نعتمد أيضًا بشكل كبير على سلاسل مضيف التعيين العكسي إلى أسماء الأدوار (سلاسل المضيف فريدة لكل اسم_خدمة). يستخدم هذا لنشر التسجيل والإخطارات. بشكل أساسي ، نسجل عمليات نشر الخدمة لكل مضيف ونرسل إشعار Slack عندما يتم نشر الخدمة لجميع المضيفين في دور ما. خادم EnvironmentDatabaseAPI هو المسؤول عن هذا (يحتفظ بالسجلات وحالة النشر). يتم ذلك عن طريق تزيين مهام النسيج بمصمم يقوم بإرسال env.host
و env.port
و env.service_name
(بالإضافة إلى معلومات الالتزام) إلى خادم API.
نحن نخطط لإضافة مصادقة النشر في المستقبل ، ومن المحتمل أيضًا أن نسحب المزيد من المتغيرات env
من الخادم لجعلها متاحة في سياق المهمة.
شكرا @ max-arnold! أتعرف على العديد من هؤلاء من حالات الاستخدام الخاصة بي في الماضي أيضًا. بتة التعيين العكسي على وجه الخصوص أتذكر ظهورها في v1 عدة مرات ، لذلك أضفتها إلى القائمة.
لكي يصبح Fabric v2 مفيدًا بالنسبة لي ، سأحتاج إلى طريقة لإخبار fab
أي مجموعة من المضيفين لتنفيذ مهمة على.
في السابق قمت بتعريف الأدوار ثم قمت بتشغيل fab -R ...
. (في الواقع ، تم تحديد الأدوار برمجيًا باستخدام نطاق عناوين IP ، ولكن هذا ليس مطلبًا وستكون القائمة الثابتة داخل ملف YAML أمرًا جيدًا.)
فشلت في العثور على مكافئ في Fabric v2 ، وفشلت أيضًا في محاكاة هذه الميزة باستخدام:
fabric.yaml
علىactive_hostset: null
hostsets:
myhostset:
- ...
active_hostset = config["hostsets"][config["active_hostset"]]
fabfile.py
env INVOKE_ACTIVE_HOSTSET=myhostset fab ...
بدلاً من قائمة المضيفين المتوقعة ، أحصل على KeyError: 'active_hostset'
.
نقوم بتعيين مجموعات مختلفة من المضيفين لكل دور لكل من بيئاتنا في fabric v1 ، ويتم تعيين البيئة عن طريق تشغيل مهمة role.environment:staging
لتحديدها. لذلك تؤثر هذه المهمة على المضيفين الذين تستخدمهم المهام التالية.
في الإصدار 2 ، حاولنا استخدام مهمة مخصصة ، ولكن المشكلة هي أن Executor.expand_calls
يتم تشغيله قبل تشغيل مهمة role.environment
وبالتالي لا تعرف أي من المهام التالية البيئة من أجل إنشاء قوائم مضيفيهم ديناميكيًا.
إن جعل مولد Executor.expand_calls
يسمح بتنفيذ المهام للتأثير على تنفيذ المهام اللاحقة. لذا فإن المثال أعلاه يعمل ، حيث لدينا Task
مخصص يحتاج إلى معرفة البيئة لتوسيع الأدوار بشكل صحيح إلى المضيفين. على سبيل المثال ، fab role.environment dev deploy.app
- يتم الآن تشغيل المهمة role.environment
قبل توسيع deploy.app
، وبالتالي يعرف deploy.app
البيئة ويمكن تكوين مضيفيها ثم يتم توسيعها إلى مجموعة المهام الصحيحة.
لقد قمت بنمذجة هذا في شوكاتي:
https://github.com/pyinvoke/invoke/compare/master...rectalogic : توسيع مولد
https://github.com/fabric/fabric/compare/master...rectalogic : توسيع المولد
مرحبًا ، لا أعرف ما حدث لهذا البرنامج بعد سنوات عديدة ، لكنني حقًا فاتني مفهوم "الأدوار" في [email protected] ، خاصة عند تشغيل $ fab -R dev
نستخدم الأدوار أيضًا لتمثيل نفس مجموعة العمليات عبر بيئات مختلفة. ربما يكون فصل مفهوم الدور المحدد عن البيئة المسماة مفيدًا؟ كما هو الحال في ، دور الويب في بيئة التطوير.
التعليق الأكثر فائدة
مرحبًا ، لا أعرف ما حدث لهذا البرنامج بعد سنوات عديدة ، لكنني حقًا فاتني مفهوم "الأدوار" في [email protected] ، خاصة عند تشغيل
$ fab -R dev