تطوير واختبار الأدوار غير القابلة للكسر باستخدام جزيء وبودمان

تتمثل إحدى المزايا الرئيسية لمنصة Red Hat Ansible Automation Platform في أن لغة الأتمتة الخاصة بها يمكن قراءتها ليس فقط من قبل اثنين من الخبراء ، ولكن أيضًا لجميع المشاركين في تكنولوجيا المعلومات تقريبًا. لذلك ، يمكن لأي متخصص أن يساهم في الأتمتة ، مما يسهل بشكل كبير تنظيم التفاعل بين الفريق وتنفيذ الأتمتة على مستوى ثقافة الشركة.







ومع ذلك ، مع وجود مثل هذا العدد الكبير من الأشخاص المعنيين ، من المهم للغاية اختبار كل شيء بدقة. عند تطوير محتوى Ansible مثل كتيبات اللعبة أو الأدوار أو المجموعات ، نوصي بشدة باختبار كل شيء في بيئة اختبار قبل طرحه في الإنتاج. الغرض من هذا الاختبار هو التأكد من أن كل شيء يعمل كما ينبغي ، لتجنب المفاجآت غير السارة في أنظمة "الإنتاج".



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



هذه هي الطريقة التي يتم الإعلان عنها في وثائق المشروع:



"تم تصميم Molecule للمساعدة في تطوير واختبار أدوار Ansible ، وتعزيز نهج يؤدي إلى أدوار مكتوبة جيدًا ومكتوبة بشكل جيد وسهلة الفهم والصيانة."


يسمح لك Molecule باختبار دور عبر مثيلات مستهدفة متعددة لاختباره عبر مجموعة متنوعة من أنظمة التشغيل وبيئات المحاكاة الافتراضية. بدونها ، لكل من هذه المجموعات ، سيكون عليك إنشاء بيئة اختبار منفصلة والحفاظ عليها ، وتكوين الاتصالات لمثيلات الاختبار ، وإعادتها إلى حالتها الأصلية قبل كل اختبار. يقوم Molecule بكل ذلك من أجلك ، بطريقة آلية وقابلة للتكرار.



في هذه السلسلة المكونة من جزأين ، سنوضح لك كيفية استخدام Molecule لتطوير واختبار أدوار Ansible. في الجزء الأول ، سننظر في تثبيت وتكوين Molecule ، في الجزء الثاني ، تطوير الأدوار معه.



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



يستخدم Molecule برامج تشغيل لتقديم مثيلات مستهدفة عبر مجموعة متنوعة من التقنيات ، بما في ذلك حاويات Linux ، والأجهزة الافتراضية ، وموفري السحابة. بشكل افتراضي ، يأتي مع ثلاثة برامج تشغيل مثبتة مسبقًا: Docker و Podman للحاويات ، وبرنامج تشغيل مفوض لإنشاء عمليات تكامل مخصصة. يتم توفير السائقين لمقدمي الخدمات الآخرين من قبل مجتمع تطوير المشروع.



في هذا المنشور ، سوف نستخدم برنامج تشغيل Podmanلتطوير واختبار دور جديد باستخدام حاويات Linux. Podman هو محرك حاوية خفيف الوزن لنظام Linux ، ولا يحتاج إلى برنامج خفي قيد التشغيل ، ويسمح بتشغيل الحاويات بدون جذر ، وهو أمر جيد للأمان.



باستخدام Molecule مع برنامج تشغيل Podman ، سنطور ونختبر دور Ansible الجديد من البداية والذي ينشر تطبيق ويب يعتمد على خادم ويب Apache ويجب تشغيله على Red Hat Enterprise Linux (RHEL) 8 أو Ubuntu 20.04.



نحن نحلل سيناريو نموذجي عندما يجب أن يعمل الدور على إصدارات مختلفة من نظام التشغيل. باستخدام حاويات Podman و Linux ، يمكننا إنشاء مثيلات متعددة لاختبار الدور على إصدارات نظام التشغيل المختلفة. بسبب خفتها ، تسمح لك الحاويات بالتكرار بسرعة من خلال وظيفة الدور أثناء التطوير. يعد استخدام الحاويات لاختبار الأدوار مفيدًا في هذه الحالة ، نظرًا لأن الدور يكوّن فقط حالات تشغيل Linux. للاختبار على الأنظمة المستهدفة الأخرى أو البنى التحتية السحابية ، يمكنك استخدام برنامج التشغيل المفوض أو برامج التشغيل الأخرى المقدمة من المجتمع.



ماذا نحتاج



للحصول على أمثلة في هذه المقالة ، تحتاج إلى جهاز Linux فعلي أو افتراضي مثبت عليه Python 3 و Podman (نحن نستخدم RHEL 8.2). كما كان لابد من تكوين Podman لتشغيل حاويات بدون جذر. إن تثبيت Podman خارج نطاق هذه المقالة ، راجع الوثائق الرسمية للحصول على المعلومات ذات الصلة . يتم أيضًا تغطية تثبيت Podman على RHEL 8 في وثائق حاوية RHEL 8 .



هيا بنا نبدأ



تم تصميم Molecule كحزمة Python وبالتالي يتم تثبيته عبر الأنابيب. تتمثل الخطوة الأولى في إنشاء بيئة Python مخصصة وتثبيت Molecule فيها:



$ mkdir molecule-blog
$ cd molecule-blog
$ python3 -m venv molecule-venv
$ source molecule-venv/bin/activate
(molecule-venv) $ pip install "molecule[lint]"


لاحظ أننا نقوم بتثبيت Molecule مع خيار "lint" بحيث توفر النقطة أيضًا أدوات "yamllint" و "ansible-lint" ، والتي ستسمح لنا باستخدام Molecule لتحليل رمز الدور بشكل ثابت مقابل معايير الترميز Ansible.



يقوم التثبيت بتنزيل جميع التبعيات الضرورية من الإنترنت ، بما في ذلك Ansible. الآن دعنا نرى ما قمنا بتثبيته:



$ molecule --version
molecule 3.0.4
   ansible==2.9.10 python==3.6


حسنًا ، حان الوقت لاستخدام أمر "الجزيء" لتهيئة دور Ansible الجديد.



بدء دور أنسبل جديد



بشكل عام ، عند تطوير دور Ansible جديد ، يتم تهيئته باستخدام الأمر "ansible-galaxy role init" ، لكننا سنستخدم الأمر "الجزيء" بدلاً من ذلك. سيعطينا هذا نفس بنية الدور كما هو الحال مع الأمر "ansible-galaxy" ، بالإضافة إلى الكود الأساسي لتشغيل اختبارات Molecule.



بشكل افتراضي ، يستخدم Molecule برنامج تشغيل Docker لإجراء الاختبارات. نظرًا لأننا نريد استخدام podman بدلاً من ذلك ، عند تهيئة الدور بأمر "جزيء" ، يجب علينا تحديد برنامج التشغيل المناسب باستخدام الخيار "--driver-name = podman".



ارجع إلى دليل "Molecule-blog" وقم بتهيئة الدور الجديد "mywebapp" بالأمر التالي:



$ molecule init role mywebapp --driver-name=podman
--> Initializing new role mywebapp...
Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.


ينشئ Molecule هيكل دورنا في مجلد "mywebapp". قم بالتبديل إلى هذا المجلد وشاهد ما هو موجود:



$ cd mywebapp
$ tree
.
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── converge.yml
│       ├── INSTALL.rst
│       ├── molecule.yml
│       └── verify.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml
 
10 directories, 12 files


يضع الجزيء ملفات التكوين الخاصة به في دليل فرعي "الجزيء". عند تهيئة دور جديد ، يوجد نص برمجي واحد فقط يسمى "افتراضي". لاحقًا ، يمكنك إضافة البرامج النصية الخاصة بك هنا لاختبار الظروف المختلفة. في هذه المقالة ، سنستخدم النص "الافتراضي" فقط.



دعنا نتحقق من التكوين الأساسي في ملف "Molecule / default / Molecule.yml":



$ cat molecule/default/molecule.yml 
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: instance
    image: docker.io/pycontribs/centos:7
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible


كما طلبنا ، يوضح هذا الملف أن برنامج تشغيل Podman يُستخدم للاختبارات. هذا هو المكان الذي يتم فيه تعيين النظام الأساسي الافتراضي لمثيل الاختبار ، عبر صورة الحاوية "docker.io/pycontribs/centos:7" ، والتي سنقوم بتغييرها لاحقًا.



على عكس Molecule v2 ، لا يقوم Molecule v3 بتعريف لينتر افتراضي. لذلك ، دعنا نفتح ملف التكوين "Molecule / default / Molecule.yml" ونضيف تكوين النسالة في النهاية:



$ vi molecule/default/molecule.yml
...
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


احفظ وأغلق الملف ، وقم بتشغيل الأمر "Molecule lint" من المجلد الجذر لمشروعنا لتشغيل linter طوال المشروع:



$ molecule lint


نحصل على بعض الأخطاء في الإخراج ، لأن الملف "meta / main.yml" لا يحتوي على عدد من القيم المطلوبة. دعونا نصلحها: قم بتحرير ملف "meta / main.yml" ، أضف "المؤلف" ، "الشركة" ، "الترخيص" ، "الأنظمة الأساسية" وأزل السطر الفارغ في النهاية. للإيجاز ، سنستغني عن التعليقات ، ثم سيبدو "meta / main.yaml" كما يلي:



$ vi meta/main.yml
galaxy_info:
  author: Ricardo Gerardi
  description: Mywebapp role deploys a sample web app 
  company: Red Hat 
 
  license: MIT 
 
  min_ansible_version: 2.9
 
  platforms:
  - name: rhel
    versions:
    - 8 
  - name: ubuntu
    versions:
    - 20.04
 
  galaxy_tags: []
 
dependencies: []


لنقم بتشغيل linter على المشروع مرة أخرى ونتأكد من عدم وجود المزيد من الأخطاء.



$ molecule lint
--> Test matrix
    
└── default
    ├── dependency
    └── lint
    
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'lint'
--> Executing: set -e
yamllint .
ansible-lint . 


لذلك ، تم تهيئة دورنا والتكوين الأساسي للجزيء في مكانه أيضًا. لنقم الآن بإنشاء مثيل اختبار.



قم بإنشاء مثيل اختبار



بشكل افتراضي ، يقوم Molecule بتعريف مثيل واحد فقط ، والذي يسمى "مثيل" ويتم إنشاؤه من صورة "Centos: 7". دورنا ، إذا كنت تتذكر ، يجب أن يعمل على RHEL 8 و Ubuntu 20.04. أيضًا ، نظرًا لأنه يشغل خادم الويب Apache كخدمة نظام ، نحتاج إلى صورة حاوية مع تمكين "systemd".



لدى Red Hat صورة أساسية عالمية رسمية لـ RHEL 8 مع تمكين "systemd":



• Registry.access.redhat.com/ubi8/ubi-init



لا توجد صورة "systemd" رسمية لـ Ubuntu ، لذلك سنستخدم الصورة التي يحتفظ بها Jeff Geerling (Jeff Geerling) من مجتمع Ansible:



• geerlingguy / docker-ubuntu2004-ansible



للحصول على مثيلات مع "systemd" ، دعنا نعدل ملف التكوين "Molecule / default / Molecule.yml" عن طريق إزالة مثيل "centos: 7" منه وإضافة مثلين جديدين:



$ vi molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: podman
platforms:
  - name: rhel8
    image: registry.access.redhat.com/ubi8/ubi-init
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/usr/sbin/init"
    pre_build_image: true
  - name: ubuntu
    image: geerlingguy/docker-ubuntu2004-ansible
    tmpfs:
      - /run
      - /tmp
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    capabilities:
      - SYS_ADMIN
    command: "/lib/systemd/systemd"
    pre_build_image: true
provisioner:
  name: ansible
verifier:
  name: ansible
lint: |
  set -e
  yamllint .
  ansible-lint .


باستخدام هذه المعلمات ، نقوم بتركيب نظام ملفات مؤقت "/ تشغيل" و "/ tmp" لكل حالة ، بالإضافة إلى وحدة تخزين "cgroup". بالإضافة إلى ذلك ، نقوم بتضمين وظيفة "SYS_ADMIN" المطلوبة لتشغيل الحاويات باستخدام Systemd.



إذا كنت تفعل كل شيء بذكاء وقمت بتشغيل هذا المثال على جهاز RHEL 8 مع تمكين SELinux ، فأنت بحاجة أيضًا إلى ضبط المعامل المنطقي "container_manage_cgroup" على true حتى تتمكن الحاويات من تشغيل Systemd (راجع وثائق RHEL 8 لمزيد من التفاصيل ):



sudo setsebool -P container_manage_cgroup 1


يستخدم Molecule Ansible Playbook لتهيئة هذه الحالات. دعونا نغير ونضيف معاملات التهيئة عن طريق تعديل قاموس "المزود" في ملف التكوين "الجزيء / الافتراضي / الجزيء.



يقبل نفس خيارات التكوين المحددة في ملف التكوين "ansible.cfg". على سبيل المثال ، دعنا نحدِّث تكوين المزود عن طريق إضافة قسم "الإعدادات الافتراضية". اضبط مترجم Python على "auto_silent" لتعطيل التحذيرات. لنقم بتضمين إضافات رد نداء "profile_tasks" و "timer" و "yaml" بحيث يتم تضمين معلومات التعريف في إخراج Playbook. أخيرًا ، أضف قسم "ssh_connection" وقم بتعطيل خطوط أنابيب SSH لأنه لا يعمل مع Podman:



provisioner:
  name: ansible
  config_options:
    defaults:
      interpreter_python: auto_silent
      callback_whitelist: profile_tasks, timer, yaml
    ssh_connection:
      pipelining: false


لنحفظ هذا الملف وننشئ مثيلًا باستخدام أمر "إنشاء الجزيء" من الدليل الجذر لدورنا:



$ molecule create


سينفذ Molecule كتاب تشغيل init ويخلق كلتا الحالتين. دعنا نتحقق منها باستخدام أمر "قائمة الجزيئات":



$ molecule list
Instance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged
---------------  -------------  ------------------  ---------------  ---------  -----------
rhel8            podman         ansible             default          true       false
ubuntu           podman         ansible             default          true       false


دعنا نتحقق أيضًا من تشغيل كلتا الحاوية في Podman:



$ podman ps
CONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES
2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu
2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8


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



خاتمة



إذا كنت غير صبور وترغب في التعمق في موضوع تطوير واختبار الأدوار ، أو موضوع أتمتة Ansible ، فإننا نوصي بالموارد التالية:






All Articles