اليوم سنتحدث عن ما هو SCM ونروي بعض القصص من خلال المنشور الذي سننظر فيه Ansible و SaltStack و Chef و Puppet ، مع اختيار الخيار الأفضل لمهمة معينة.
تستند المواد إلى نص
تقرير أعده Andrei Filatov ، مهندس النظم الرئيسي في EPAM Systems ، من مؤتمر أكتوبر DevOops 2017.
ما هو SCM وماذا يأكل به؟

ما هو SCM؟ بادئ ذي بدء ، إنه شيء يسمح لبنيتنا التحتية من الدولة أ بتنفيذ الحالة ب من خلال تنفيذ بعض التعليمات البرمجية. يعتقد العديد من المطورين الذين ليسوا مهندسي DevOps في الممارسة أن شيئًا ما يحدث بطريقة "تلقائية". على البنية التحتية.
الطريقة "التلقائية" تنفذنا SCM (إدارة تكوين النظام). ما هذا؟ بشكل أساسي من أجل بناء بنى تحتية قابلة للتكرار ومتسقة. يمد SCM عمليات CI / CD بشكل جيد. نظرًا لأن هذا هو الرمز ، يمكن تخزينه في أي نظام للتحكم في الإصدار: Git ، Mercurial. من السهل جدًا تطويرها وصيانتها.
النهائي هو دورة أتمتة مغلقة: كل شيء يمكن القيام به تلقائيًا ، من إنشاء البنية التحتية إلى نشرها ونشر الرمز.
ما هو SCM: Ansible

النظر في المتقدمين لدينا. الأول هو Ansible. لديها بنية بدون وكيل ، إذا كنا نتحدث عن نسخة مفتوحة المصدر ، فهي مكتوبة بلغة Python ، ولديها DSL تشبه Yaml ، وهي قابلة للتوسعة بسهولة بسبب الوحدات المكتوبة في Python ، فهي بسيطة وخفيفة الوزن للغاية. يحتوي Ansible على أدنى حد دخول - يمكنك تعليم أي شخص.
هناك تجربة عندما دخل شخص ، لا يعرف بايثون ، ولا يعرف أي شيء عن SCM ، Ansible في يومين فقط وبدأ بالفعل في فعل شيء ما.
فيما يلي مثال على ChatOps: منبه في Slack. رمز Ansible الذي رأى Yaml ليس جديدًا.
- block: - name: "SlackNotify : Deploy Start" local_action: module: slack token: "{{ slack_url }}" attachments: - title: "Deploy to {{ inventory_hostname }} has been Started" text: "<!here> :point_up_2:" color: "#551a8b" - include: configure.yml tags: - configure - include: remote-fetch.yml tags: - remote - include: assets.yml
ما هو SCM: Chef

الشيف هو بنية خادم العميل ، وهناك خادم الشيف وعميل الشيف. التكوين المستند إلى البحث ، مكتوب بلغة Ruby ، به Ruby DSL. وفقًا لذلك ، داخل كتب الطبخ والوصفات الخاصة بك ، يمكنك استخدام القوة الكاملة لروبي ، لكنني لا أنصح بذلك. الشيف لديه مجتمع ضخم وأكبر مجموعة من الأدوات بين جميع SCMs. هذا هو شكل رمز الشيف ، هذا هو نشر Jetty.
ما هو SCM: SaltStack

يحتوي SaltStack على بنية بدون وكيل تعمل في وضع الدفع باستخدام Salt-SSH ، وبنية خادم العميل عند وجود Salt-master و Salt-minion. وينصب التركيز على الأتمتة في الوقت الفعلي ، والتنفيذ المتوازي لجميع العمليات ، ومكتوب بلغة Python. أيضًا لغة تشبه Yaml ، فإن الرمز مشابه جدًا لـ Ansible.
#ntp-packages: pkg.installed: - pkgs: - ntp - ntpdate #/etc/ntp.conf: file: - managed - source: salt:
ما هو SCM: دمية

آخر مزايدين لدينا هو دمية. كما أن لديها بنية خادم العميل ، مثل Chef ، التكوين لا يعتمد على البحث ، ولكن على "الحقائق" التي تأتي مع Puppet-master ، المكتوبة في Ruby ، لديها DSL يشبه Ruby. لكن لا يسمح للرجال الدمية باستخدام كود روبي النقي في قوائمهم. هذا زائد وناقص. هذا ما يبدو عليه رمز بيان الدمى:
class { 'mysql::server' : root_password => 'password' } mysql::db{ ['test', 'test2', 'test3']: ensure => present, charset => 'utf8', require => Class['mysql::server'], } mysql::db{ 'test4': ensure => present, charset => 'latin1', } mysql::db{ 'test5': ensure => present, charset => 'binary', collate => 'binary', }
SCM في الممارسة
SaltStack في بيئة منزوعة السلاح
بادئ ذي بدء ، أود أن أشارك مشروعًا كتب على SaltStack. هذا هو مشروعنا السابق والألم الطازج ، والألم الطازج هو الأكثر إيلامًا دائمًا. يشارك عملائنا في تخزين البيانات - هذا هو إنتاج خوادم الحديد لتخزين البيانات على GPFS و GlusterFS ، ولكن يبني مخصصًا. جاء إلينا بالمهام التالية:
- إنشاء مثبت USB / DVD. تحتاج إلى إنشاء وسائط يتم تثبيت كل شيء منها. يتم ذلك لعملاء العملاء الذين يعيشون في مناطق مغلقة ، حيث لا تحتوي الخوادم في الغالب على الإنترنت. نحتاج إلى حزم ISO واحد وإرساله إلى المهندسين الميدانيين الذين سينشرون كل ما هو مطلوب في الموقع.
- نشر مجموعة منتجات. العملاء لديهم العديد من المنتجات الكبيرة ، يجب أن نكون قادرين على نشرها في وضع الكتلة.
- إدارة وتكوين وصيانة الكتلة باستخدام أداة CLI-. يجب أن يساعد إطار عملنا المهندسين الميدانيين في إدارة المجموعة.
كان لدى العميل متطلبات عديدة. بادئ ذي بدء ، لديه قدر كبير من خبرة Python ، في الواقع فقط مطوري C و Python. قال العميل على الفور: "نريد SaltStack" ، دون ترك أي خيار.
ما الذي نواجهه؟ لدى العميل العديد من المنتجات في التثبيت ، يجب أن تكون جميعها مع Salt-Masters. لكننا نواجه مشكلة توسيع نطاق تكوين Multi-Master. على سبيل المثال ، في NODE Info (حالة خادم معين) ، اخترنا المللي ثانية بتكوين رئيسي ، وثواني بثلاثة أسياد ، وخمسة لم ننتظر أبدًا اكتمال العملية. تعد MultiMaster ميزة جيدة ، ولكنها لا تتطور بشكل جيد.
كانت المشكلة الثانية التي واجهناها هي العمل الجماعي: لدى SaltStack عداء ووحدة نمطية. الوحدة النمطية هي امتداد يعمل على Salt Minion ، على جانب الجهاز. عداء يعمل على جانب الخادم. غالبًا ما كانت لدينا معارك: ما يجب القيام به عداء ، وماذا نفعل الوحدات النمطية.
ثم صادفنا مفاجأة صغيرة من ذاكرة التخزين المؤقت.
ime = ImeActions() id = __grains__['id'] if id == ime.master_id: ret = __salt__['mine.get'](id, 'ime_actions.make_bfs_uuid') ime_dict = ret.get(id, None) if not ime_dict: try: result = __salt__['mine.send']('ime_actions.make_bfs_uuid') except Exeption, e: log.error("Failed to generate uuid: {0}.".format(str(e))) result = False else:
لدينا أداة مكتوبة في C. نقوم بتشغيله ، فإنه يولد معرفًا عشوائيًا. يجب أن تكون فريدة بين جميع المشاركين في المجموعة ، على التوالي ، نحتاج إلى القيام بذلك مرة واحدة على المعلم ، ثم توزيعها على الأجهزة. استخدمنا cache.mine لهذا الغرض. كما اتضح ، لا يعاني من إعادة تشغيل.

"حالة العرق". التوازي أمر جيد ، ولكن في حالة التكوين الأساسية. يأتي orchestrate في state.sls قيد التشغيل في حالة حدوث عمليات طويلة. مع مرور الوقت ، يعتقد أن الدولة قد اكتملت بالفعل ، على الرغم من أنها لا تزال تعمل ، وتحاول بدء المرحلة التالية. حدث خطأ. ولم يتم إصلاح هذه المشكلة بعد.

يمكنك
إلقاء نظرة على جيثب .
ما الذي يمكننا استخدامه بجانب SaltStack؟
SaltStack في بيئة DMZ

- DMZ يحضر الشيف مجموعة رائعة ، كما أن العرائس أيضًا. ومع Ansible ، تكون المشكلة - إذا لم يكن هناك برج - فلا توجد طريقة لبدء التكوين في وضع السحب من عقدنا ، والتي يجب القيام بها في المنطقة المنزوعة السلاح.
- إطار CLI (في Python). الشيف والدمى ليست مناسبة للغاية ، ولكن إذا لم يكن لديك قيود لاستخدام Python فقط ، فيمكنك الكتابة في Ruby واستخدام API Chef أو Puppet APIs. مجموعة أدوات Ansible لا تدعم هذا.
- إدارة الكتلة. الشيف مناسب تمامًا لإدارة المجموعات ، Puppet أيضًا ، وقد تمت كتابة Ansible في الأصل لإدارة المجموعات على Amazon.
طاه في بيئة كبيرة وديناميكية
توصل العميل إلى مهمة دمج جميع الموارد في سحابة واحدة - كانت Openstack. قبل ذلك ، كان كل شيء مبعثرًا: شيء ما على Rackspace Cloud ، شيء على الخوادم المخصصة أو مراكز البيانات الخاصة بها.
لقد أرادوا إدارة موارد ديناميكية بالكامل ، وأيضًا حتى يمكن لتطبيقاتهم إضافة القدرات لأنفسهم إذا لزم الأمر. أي أننا بحاجة إلى بنية تحتية ديناميكية كاملة وبيئة ديناميكية بالكامل لأعلى ولأسفل.
من أجل بناء عملية القرص المضغوط بشكل صحيح ، تحتاج إلى بيئة مؤتمتة بالكامل. لقد أنشأنا SDLC - دورة حياة تطوير البرامج لهم ، وطبّقناها ، بما في ذلك SCM. إنهم يجتازون اختبارات التكامل ليس فقط للتطبيقات ، ولكن أيضًا للبنية التحتية.
وبناءً على ذلك ، عندما يحدث خطأ ما لدينا ، فإننا ، مثل شباب Netflix ، يجب أن نكون قادرين على قتل الموارد المعيبة واستعادة العمال الجدد والمضمونين إلى مكانهم.
ما هي المشاكل التي واجهناها:
- كان عام 2013 ، يستخدم الشيف 10 ، حيث كان البحث بطيئًا. بدأنا البحث ، ودورنا حول جميع السيارات ، واستغرق الأمر إلى الأبد. لقد حاولنا حل المشكلة مع اصطلاح التسمية ، وكذلك التحديد والبحث عن fqdn. أدى هذا إلى تضييق نطاق البحث ، والذي تم تسريعه بسببه.
ولكن يجب القيام ببعض العمليات على البيئة بأكملها. وفقًا لذلك ، تم تشغيل البحث مرة واحدة في البداية ، وتم تخزين النتيجة في السمة ، وباستخدام روبي ، قمنا بتصفية النتائج: قمنا بتحليل القطع التي نحتاجها وفعلنا ما هو مطلوب.
if !Chef::Config[:solo] search(:node, "fqdn:*metro-#{node[:env]}-mongodb*").each do |mongo| @mongodbs << mongo.fqdn end else @mongodbs = ["lvs-metro-#{node[:env]}-mongodb3001.qa.example.com"] end
خلاصة القول: استخدم اصطلاحات التسمية ، قم بإجراء البحث مرة واحدة ، استخدم روبي لتصفية النتائج المطلوبة.
- استخدام "node.save" غير آمن ، كن حذرًا وحذرًا. واجهنا هذه المشكلة عند نشر مجموعات MySQL ، واستخدمنا node.save داخل الوصفة على عقدة MySQL غير مكتملة. وفي وقت التوسع ، أعطت بعض التطبيقات خطأ 500. اتضح أننا كنا نحفظ العقدة في الوقت الخطأ: حيث تذهب إلى خادم الشيف ، حيث يقوم عميل الشيف على واجهة المستخدم باختيار عقدة جديدة لم يتم تكوينها قبل وضع التشغيل.
- يمكن أن يؤدي نقص "الانشقاق" إلى قتل خادم الشيف. Splay هي معلمة عميل Chef تسمح لك بتعيين النطاق عندما ينتقل العميل إلى الخادم للتكوين. مع وجود حمل ثقيل ، عندما تحتاج إلى نشر العديد من العقد في نفس الوقت ، فإن هذا لن يقتل الخادم.
ماذا نستخدم بدلا من الشيف؟

- التزويد الديناميكي SaltStack مثالي لأنه يحتوي على SaltCloud الذي يتكامل بشكل مثالي في أي مكان. لدى Puppet وظائف مماثلة ، لكنه متاح فقط في Puppet Enterprise ، مقابل المال. تعتبر Ansible مناسبة تمامًا إذا كانت الشركة "تعيش" في Amazon ، إذا كان هناك شيء آخر - يمكنك ربطها بالبدائل ، ولكنها ليست مريحة جدًا.
- SDLC. لدى الشيف كل شيء من Test Kitchen إلى اختيار الأدوات لاختبار التكامل. يحتوي SaltStack على جميع أدوات Python المتاحة ، والآن أصبح لدى Puppet كل شيء. Ansible له مواصفات دور ، يمكنك استخدام Chef's Test Kitchen ، ولكنه ليس أداة أصلية.
- استبدال الموارد. كل شيء على ما يرام في Chef ، في SaltStack يمكنك إنهاء SaltCloud إلى الحالة المطلوبة ، في أدوات Puppet الموجودة فقط في إصدار Enterprise ، وتعمل Ansible بشكل جيد فقط مع Amazon.
سحابة EPAM الخاصة مع الشيف
قبل عام ونصف من ظهور AWS OpsWorks ، أردنا إنشاء Amazon CloudFormation متقدم من خلال دمج الشيف بحيث لم يتم نشر الموارد فحسب ، بل تمت تهيئتها أيضًا.
المهمة العالمية الثانية هي إنشاء كتالوج الخدمة بحيث يمكن للعملاء والمستخدمين استخدام CLI لنشر حزمة LAMP جاهزة للاستخدام تمامًا ، على سبيل المثال.

لقد اخترنا الشيف ، ولكن كان على المشروع دعم SCMs مختلفة. بدأنا بخادم الشيف المدمج ، ويمكن للمستخدمين أيضًا استخدام خادم الشيف الخاص بهم ، والذي يتم استضافته معهم في مكان ما. أي أننا لم نتمكن من الوصول إلى موارد المستخدم وأجهزة الكمبيوتر المحمولة ، لكنها نجحت على أي حال.

يمكن استخدام أي SCM لتنفيذ CloudFormation + OpsWork ، وكل شخص مناسب. لإنشاء كتالوج - كل شخص ما عدا SaltStack سيفعل ذلك بشكل جيد. تتميز SaltStack بفروق دقيقة: من الصعب للغاية العثور على متخصص يعرف SaltStack جيدًا ويمكنه إنشاء خدمة وملء الكتالوج.
شعبية SCM في EPAM

هذه هي إحصاءات شعبية SCM داخل EPAM. SaltStack متخلف للغاية. في المقام الأول Ansible ، هو أبسط مع عتبة دخول منخفضة. عندما نحاول العثور على شخص ما في السوق يعرف SCM ، فإن السوق يبدو متشابهًا.
العمل مع Ansible
النصائح التي يمكنني تقديمها عند العمل مع Ansible:
- استخدم "تسريع" ، حيث ينشر التكوينات أسرع من 2-6 مرات من SSH (لـ el6). لكل شخص آخر ، هناك "خط الأنابيب". تم إيقاف تشغيله للتوافق مع الإصدارات السابقة ، ولكن إعادة تشغيل الأنابيب أمر سهل للغاية ، أوصي بعمل ذلك.
- استخدم "with_items"
- name: project apt dependencies installed apt: name: "{{ item }}" become: yes with_items: - build-essential - acl - git - curl - gnupg2 - libpcre3-dev - python-apt - python-pycurl - python-boto - imagemagick - libmysqlclient-dev
في هذا المثال ، نقوم بتثبيت الحزم ، ويمكن استخدام هذا المخطط لإنشاء المستخدمين والعمليات المماثلة.
- استخدم بعناية "local_action" و "مفوض". الأول يسمح لك بالحصول على شيء مشابه لـ SaltStack Runner ، والثاني قادر على تفويض المهام إلى أجهزة معينة.
- name: create postgresql database postgresql_db: name: "{{ database_name }}" login_host: "{{ database_host }}" login_user: "{{ database_master_user }}" login_password: "{{ database_master_password }}" encoding: "UTF-8" lc_collate: "en_US.UTF-8" lc_ctype: "en_US.UTF-8" template: "template0" state: present delegate_to: "{{ groups.pg_servers|random}}"
هذا جزء من إنشاء قاعدة البيانات. بدون السطر الأخير ، سيتم تنفيذ العملية عدة مرات وسقطت في المحاولة الثانية لإنشاء نفس قاعدة البيانات.
- تحسين أدوارك وأدائك مع العلامات. هذا يمكن أن يقلل بشكل كبير من المهلة الزمنية.
الاستنتاجات
بالنسبة لي ، Ansible هو المفضل. SaltStack جيدة جدًا ومرنة جدًا ، ولكنها تتطلب معرفة Python ، بدونها ، من الأفضل عدم استخدام SaltStack. الشيف هو رصاصة فضية عالمية لأي مهمة وأي مقياس ، ولكنه يتطلب معرفة أكثر من Ansible. ومن يستخدم الدمى - لا أعرف. من حيث المبدأ ، يشبه إلى حد كبير الشيف ، ولكن مع الفروق الدقيقة الخاصة به.
دقيقة من الدعاية. إذا أعجبك هذا التقرير من مؤتمر DevOops - لاحظ أنه في 14 أكتوبر سيعقد DevOops 2018 الجديد في سان بطرسبرغ ، سيكون هناك الكثير من الأشياء المثيرة للاهتمام في برنامجها. يحتوي الموقع بالفعل على أول المتحدثين والتقارير.