كيفية إنشاء قوالب Ansible لتوفير وقت التكوين

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

في هذا البرنامج التعليمي، ستتعلم ما هي قوالب Ansible، وكيفية عملها، وكيف يمكنك استخدام وحدة القالب Ansible لتوفير الكثير من الوقت.

المتطلبات المسبقة

سيكون هذا المقال برنامجًا تعليميًا خطوة بخطوة. إذا كنت ترغب في المتابعة، تأكد من أن لديك خادم تحكم Ansible. سيتم استخدام إصدار Ansible v2.9.18 في هذا البرنامج التعليمي

ما هو قالب Ansible؟

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

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

لكن ماذا لو كان لديك عدة خوادم ويحتاج كل منها إلى نفس ملف التكوين ولكن مع قيم خاصة بها؟ لا يمكنك فقط نسخ ملف التكوين إلى جميع الأجهزة. إنها مصممة فقط لخادم واحد بمضيف وعنوان IP محددين. تحتاج إلى قالب Ansible.

تسمح لك القوالب في Ansible بتعريف ملفات نصية بمتغيرات بدلاً من قيم ثابتة، ثم استبدال تلك المتغيرات أثناء تشغيل السيناريو.

كيف يبدو قالب Ansible؟

إن قالب Ansible هو ملف نصي يستخدم لغة Jinja2 للتنسيق مع امتداد ملف j2. يبدو قالب Jinja2 تمامًا مثل ملف النص الذي ترغب في نقله إلى الخادم البعيد. الفارق الوحيد هو أنه بدلاً من القيم الثابتة، يحتوي الملف على متغيرات.

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

my_ip    = "192.168.0.1"
my_host  = "ANSBILECONTROL"
my_user  = "ansible_user"

لا يمكنك نسخ هذا الملف إلى كل خادم ويب لأن كل عنصر سيكون فريدًا اعتمادًا على عنوان الخادم البعيد، واسم الجهاز المضيف لـ Ansible، ومستخدم Ansible.

بدلاً من تحديد قيم كل من هذه القيم بشكل ثابت، يسمح لك قالب Ansible بتعريف متغيرات تُفسر في وقت التشغيل وتستبدل على الخادم البعيد.

أدناه، ستجد مثالًا على ملف قالب app.conf.j2. يمكنك الآن رؤية أن كل قيمة ثابتة تم استبدالها بمتغير مشار إليه بفاصلتين متعرجتين من كلا الجانبين. في هذا السياق، تأتي هذه المتغيرات من حقائق Ansible.

تحمل ملفات القوالب دائمًا امتداد ملف J2 وتحمل عادة نفس اسم الملف الذي تنشئه على الخادم المستهدف.

my_ip    = "{{ansible_default_ipv4["address"]}}"
my_host  = "{{ansible_host}}"
my_user  = "{{ansible_user}}"

كيف يتم إنشاء ملفات القوالب على الخوادم البعيدة؟

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

أغلب مسؤولي Ansible يستخدمون وحدة النسخ لنقل الملفات إلى الخوادم البعيدة، ولكن كما هو مذكور أعلاه، لا يمكن تحقيق ذلك باستخدام القوالب.

فيما يلي مثال بسيط من الملف التنفيذي يستند إلى الوحدة التي تقوم بنسخ ملف app.conf إلى الدليل /opt على جميع خوادم الملف التنفيذي.

- name: copy file from local host to remote host
  copy:                               # Declaring Copy Module 
    src: "app.conf"                   # Source Location 
    dest: "/opt/app.conf"             # Destination Location on remote host

الآن لنفترض أنك قمت بتحويل ملف تكوين app.conf إلى ملف قالب app.conf.j2 كما تم شرحه في القسم السابق على جهاز تحكم Ansible الخاص بك. يتعين عليك الآن التأكد من وصول app.conf إلى الدليل /opt ولكن مع استبدال المتغيرات بالقيم الحقيقية.

لإخبار الملف التنفيذي بإنشاء ملف app.conf في الدليل /opt، قم ببساطة بتغيير الإشارة من copy إلى template كما هو موضح أدناه. عند القيام بذلك، يستدعي Ansible وحدة القالب لنقل القالب واستبدال المتغيرات بالقيم الثابتة.

- name: template file to remote host
  template:                 # Ansible template module
    src: "app.conf.j2"      # This is template src i.e source location 
    dest: "/opt/app.conf"   # Destination of Remote host

بمجرد تنفيذ المهمة أعلاه في الملف التنفيذي، سيقوم Ansible بنسخ app.conf.j2 إلى دليل الخادم البعيد /opt، واستبدال جميع المتغيرات بقيم ثابتة وإعادة تسمية الملف إلى app.conf.

عندما تقدم القالب src مع مسار الدليل، يبحث Ansible عن القوالب في دليل /<مسار_تثبيت_ansible>/files/. إذا قمت بتقديم اسم الملف فقط، سيبحث Ansible عن القالب في دليل /<مسار_تثبيت_ansible>/templates/ بدلاً من ذلك.

عرض ملف تكوين: مثال على القالب

لنقم الآن بالانتقال إلى عرض توضيحي لنرى كيفية إعداد قالب Ansible واستخدام وحدة القالب Ansible لإنشاء ملف تكوين بشكل ديناميكي. في هذا المثال، ستقوم بإنشاء ملف يسمى app.conf في الدليل /etc على خادم يسمى SRV1.

ستعمل الخطوات في هذا القسم لأي نوع من ملفات النص. ستستخدم البرنامج التعليمي ملف تكوين كمثال واحد.

1. تسجيل الدخول إلى مضيف تحكم Ansible الخاص بك باستخدام أي مستخدم تستخدمه عادة لإدارة Ansible.

2. إنشاء مجلد في دليل المستخدم الخاص بك لاحتواء ملفات العرض التوضيحي لهذا البرنامج التعليمي وتغيير دليل العمل إليه.

mkdir ~/ansible_template_demo
cd ~/ansible_template_demo

3. إنشاء ملف قالب يُسمى app.conf.j2 في الدليل الذي يبدو مشابهًا للأسفل.

my_ip = {{ansible_default_ipv4["address"]}}
my_host  = {{ansible_host}}
my_user  = {{ansible_user}}

يمكنك أيضًا استخدام متغيرات متنوعة محددة لوحدة القالب Ansible نفسها في قالبك.

4. إنشاء كتاب عمل بسيط في نفس الدليل يسمى my_playbook.yml. ينشئ هذا الكتاب عرض الـ app.conf في الدليل /etc.


name: Ansible template example 
hosts: myserver 
remote_user: ubuntu   # Using Remote host as ubuntu 
tasks: 
 - name: Create the app.conf configuration file
   template:
     src: "~/ansible_template_demo/app.conf.j2"
     dest: "/etc/app.conf"
   become: true 

5. استدعاء كتاب العمل Ansible مستهدفًا المضيف البعيد SRV1.

ansible-playbook my_playbook.yml --inventory SRV1
You should then see Ansible execute the playbook.

6. الآن قم بتأكيد وجود ملف التكوين /etc/app.conf والتحقق من أن لديه القيم المتوقعة.

confirm the /etc/app.conf configuration file

تحديث أذونات الملف باستخدام وحدة القالب

الآن بعد أن رأيت أساسيات استخدام وحدة القالب، دعنا ننتقل إلى مستوى أكثر تقدمًا. في هذا العرض التوضيحي، ستقوم بإنشاء نفس ملف app.conf كما هو موضح سابقًا. ولكن هذه المرة، ستقوم بتعيين مالك الملف وأذوناته.

لتغيير الأذونات على الملف الذي تقوم بإنشائه وحدة القالب، يجب عليك استخدام ثلاثة معاملات داخل الـ playbook:

  • المالك – مالك الملف
  • المجموعة – المجموعة التي يجب أن يكون الملف عضوًا فيها
  • الوضع – الأذونات. يمكن أن يكون هذا السلسلة إما عبر الرموز أو كأرقام ثمانية

في الوضع الرمزي، u يمثل “المستخدم”، g يمثل “المجموعة”، و o يمثل “آخرين”.

في افتراض أن لديك المجلد ~/ansible_template_demo لا يزال مُنشأً من القسم السابق، افتح دفتر الأعمال my_playbook.yml واستبدل المحتويات بتلك الموجودة أدناه. في هذا المثال، سيقوم Ansible بتعيين المالك والمجموعة إلى مستخدم Ansible باستخدام متغيرات الاتصال. ثم يضبط أذونات الملف إلى 0644 مما يمثل:

  • المالك لديه إذن القراءة/الكتابة
  • المستخدمون في المجموعة والآخرون لديهم إذن القراءة
---
- name: Ansible file permission example
  remote_user: ubuntu
  tasks:
    - name: Create the app.conf configuration file and assign permissions
      template:
          src: "~/ansible_template_demo/app.conf.j2"
          dest: "/etc/app.conf"
	  owner: "{{ ansible_user }}"
          group: "{{ ansible_user }}"
          mode:  0644 ## OR  mode: u=rw, g=w,o=r       
      become: true

يمكنك العثور على جميع معلمات وحدة القوالب المتاحة في وثائق وحدة القوالب في Ansible.

الآن، قم بتنفيذ دفتر الأعمال مرة أخرى كما هو موضح أدناه.

ansible-playbook my_playbook.yml --inventory SRV1

يمكنك الآن رؤية أن app.conf لديه أذونات الملف المتوقعة المخصصة له.

app.conf

استخدام الحلقات لقوالب ملفات متعددة

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

في افتراض أن لديك المجلد ~/ansible_template_demo لا يزال مُنشأً من القسم السابق، يجب أن يكون لديك بالفعل app.conf.j2 فيه.

1. قم بإنشاء ملف قالب ثاني يسمى app2.conf.j2 في المجلد ~/ansible_template_demo كما هو موضح أدناه.

 template_host = "{{ template_host }}"
 template_uid = "{{ template_uid }}"
 template_path = "{{ template_path }}"
 template_fullpath = "{{ template_fullpath }}"
 template_run_date = "{{ template_run_date }}"

2. افتح الكتاب my_playbook.yml واستبدل جميع المحتويات بال YAML التالي. يستخدم هذا الكتاب الأمر {{item}} لتمثيل كل ملف قالب يتم معالجته في الحلقة. يعرف المعامل loop بعدد ملفات القوالب التي يجب أن تعالجها الحلقة.

---
- name: Ansible file permission example 
  remote_user: ubuntu 
  tasks: 
   - name: Create the app.conf configuration file and assign permissions 
     template:   
        src: "~/ansible_template_demo/{{item}}.j2"    # يكرر عبر 2 قالب   
        dest: "/etc/{{item}}"
        owner: "{{ ansible_user }}"   
        group: "{{ ansible_user }}"   
        mode:  0644 ## أوضع: u=rw، g=w، o=r        
     become: true     
     loop: # قل لوحدة القالب أن تجد كل هذه القوالب وتعالجها                                              
      - app1.conf 
      - app2.conf 

3. الآن قم بتشغيل الكتاب التنفيذي مرة أخرى. ansible-playbook my_playbook.yml --inventory SRV1

ansible-playbook my_playbook.yml --inventory SRV1
Notice now that Ansible sees each template file and processes them accordingly.

الاستنتاج

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

Source:
https://adamtheautomator.com/ansible-template/