دليل استخدام Ansible للمبتدئين: ملف التشغيل والأوامر
⚡ ملخص ذكي
Ansible هو محرك أتمتة مفتوح المصدر لا يتطلب تثبيت عميل، يقوم بتهيئة الخوادم عبر SSH، وتشغيل الأوامر المخصصة، وتنسيق عمليات النشر المعقدة من خلال ملفات YAML، والأدوار، والقوالب القابلة لإعادة الاستخدام عبر أنظمة Linux و Windows البنية التحتية.

يُعد Ansible أحد أكثر أدوات الأتمتة مفتوحة المصدر استخدامًا في العصر الحديث DevOpsيُقدّر نظام Ansible لتصميمه الذي لا يتطلب تثبيت برامج وسيطة، وملفات تكوينه البسيطة والواضحة. يشرح هذا الدليل التعليمي للمبتدئين ماهية Ansible، وكيفية تثبيته، وكيفية استخدام الأوامر المخصصة، ودفاتر التشغيل، والأدوار، والقوالب من خلال أمثلة عملية.
ما هو أنسبل؟
Ansible هي أداة مفتوحة المصدر لأتمتة وتنسيق عمليات توفير البرامج وإدارة التكوين ونشر البرامج. تقوم بتكوين أنظمة شبيهة بنظام يونكس و Windows تُشبه أنظمة Ansible في ذلك، حيث توفر البنية التحتية كبرنامج من خلال لغتها التصريحية الخاصة. وغالبًا ما تتم مقارنة Ansible بأدوات تعتمد على الوكلاء مثل دمية.
يحظى برنامج Ansible بشعبية واسعة بفضل سهولة تثبيته، وسهولة اتصاله بالعملاء، وتصميمه الذي لا يتطلب تثبيت وكيل. ويتصل بالعملاء عبر SSHلذا، لا حاجة إلى وكيل خاص على جانب العميل. يقوم Ansible بدفع الوحدات النمطية إلى كل عميل، وتعمل هذه الوحدات محليًا، ثم تُعاد مخرجاتها إلى خادم Ansible.
بفضل اعتماده على بروتوكول SSH، يتصل Ansible بالعملاء بسهولة باستخدام مفاتيح SSH، مما يُبسط العملية برمتها. تُخزَّن بيانات العميل، مثل أسماء المضيفين وعناوين IP ومنافذ SSH، في ملفات تُسمى ملفات المخزون. بمجرد إنشاء ملف المخزون وتعبئته بالبيانات، يُمكن لـ Ansible استخدامه.
لماذا نستخدم Ansible؟
فيما يلي بعض الفوائد المهمة لاستخدام Ansible:
- إحدى أهم مزايا Ansible هي أنها مجانية للاستخدام من قبل الجميع.
- لا يتطلب الأمر مهارات خاصة من مسؤول النظام لتثبيته واستخدامه، والوثائق الرسمية شاملة للغاية.
- إن قابلية Ansible للتجزئة عبر المكونات الإضافية والوحدات النمطية والمخزونات ودفاتر التشغيل تجعلها رفيقًا ممتازًا لتنسيق البيئات الكبيرة.
- يتميز برنامج Ansible بأنه خفيف الوزن ومتسق، ولا توجد قيود على نظام التشغيل أو الأجهزة الأساسية.
- إنه آمن للغاية بفضل تصميمه الذي لا يتطلب تثبيت برامج وسيطة واستخدامه لميزات الأمان في OpenSSH.
- يتميز برنامج Ansible بسهولة تعلمه، مدعومًا بوثائق شاملة وهيكل وتكوين سهل التعلم.
هذه المزايا، خاصة عند مقارنتها بغيرها بدائل لـ Ansibleيساعد ذلك في تفسير سرعة انتشاره. قبل تثبيته، من المفيد فهم كيفية تطور المشروع.
تاريخ أنسيبل
فيما يلي أهم المحطات في تاريخ Ansible:
- بدأ مشروع Ansible في فبراير 2012. وقد تم تطويره لأول مرة بواسطة مايكل ديهان، مبتكر Cobbler و Func (Fedora Unified Network Controller).
- كانت الشركة التي تمول Ansible تُسمى في البداية AnsibleWorks Inc، وقد استحوذت عليها RedHat في عام 2015، ثم انتقلت لاحقًا، جنبًا إلى جنب مع RedHat، إلى تحت مظلة IBM مظلة.
- اليوم، يتم تضمين Ansible في توزيعات مثل Fedora Linux وRHEL وCentOS و Oracle لينكس.
المصطلحات الهامة المستخدمة في Ansible
تظهر المصطلحات التالية في جميع أنحاء هذا البرنامج التعليمي لـ Ansible، ومن المفيد معرفتها قبل البدء:
خادم غير معقول
الجهاز الذي تم تثبيت Ansible عليه والذي يتم من خلاله تشغيل جميع المهام ودفاتر التشغيل.
وحدة
الوحدة النمطية هي أمر، أو مجموعة من أوامر Ansible المتشابهة، والمقصود تنفيذها على جانب العميل.
مهمة
المهمة هي قسم يتكون من إجراء واحد يجب إكماله.
النوع
طريقة لتنظيم المهام والملفات ذات الصلة بحيث يمكن استدعاؤها لاحقًا في دليل التشغيل.
حقيقة
المعلومات التي تم جلبها من المتغيرات العامة لنظام العميل من خلال عملية gather_facts.
المعرض
ملف يحتوي على بيانات حول خوادم عميل Ansible. ويُعرف في الأمثلة اللاحقة باسم ملف المضيفين.
بلايستشن
تنفيذ خطة العمل.
معالج
مهمة يتم استدعاؤها فقط عند وجود مُرسِل إشعارات.
المخطر
قسم يُنسب إلى مهمة يستدعي معالجًا إذا تغيرت المخرجات.
بطاقة
اسم يتم تعيينه على مهمة يمكن استخدامه لاحقًا لتشغيل تلك المهمة المحددة أو مجموعة المهام.
التثبيت Ansible في لينكس
بعد دراسة خياراتك واتخاذ قرار اعتماد Ansible، فإن الخطوة التالية هي تثبيته على نظامك. يشرح الدليل المختصر التالي عملية التثبيت على أشهر الأنظمة. لينكس التوزيعات.
قم بتثبيت Ansible على أنظمة Centos/RedHat
الخطوة 1) قم بتثبيت مستودع EPEL.
[root@ansible-server ~]# sudo yum install epel-release
الخطوة 2) قم بتثبيت حزمة Ansible.
[root@ansible-server ~]# sudo yum install -y ansible
تثبيت غير ممكن على Ubuntu/أنظمة ديبيان
الخطوة 1) قم بتحديث الحزم.
$ sudo apt update
الخطوة 2) قم بتثبيت حزمة software-properties-common.
$ sudo apt install software-properties-common
الخطوة 3) قم بتثبيت حزمة Ansible الشخصية.
$ sudo apt-add-repository ppa:ansible/ansible
الخطوة 4) قم بتثبيت برنامج Ansible.
$ sudo apt update $ sudo apt install ansible
أوامر مخصصة غير قابلة للتطبيق
إحدى أبسط طرق استخدام Ansible هي عبر الأوامر المخصصة. تُفيد هذه الأوامر عند الرغبة في تنفيذ أمر على خادم واحد أو مجموعة من الخوادم. لا تُخزَّن الأوامر المخصصة للاستخدام المستقبلي، ولكنها تُعدّ وسيلة سريعة للتفاعل مع الخوادم التي تختارها.
في هذا البرنامج التعليمي لـ Ansible، يتم تكوين ملف مضيفين بسيط لخادمين، يحتوي على host1 و host2.
يمكنك التأكد من إمكانية الوصول إلى المضيفين من خادم Ansible عن طريق إصدار أمر ping الأمر مُفعّل على جميع الأجهزة المضيفة.
[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
التفسير:
- حالة الأمر، في هذه الحالة، النجاح
- المضيف الذي تم تشغيل الأمر عليه
- الأمر الصادر عبر المعامل -m، في هذه الحالة، ping
- باستخدام المعلمة -i، يمكنك الإشارة إلى ملف المضيفين.
يمكنك أيضًا إصدار نفس الأمر على مضيف واحد عند الحاجة.
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
التفسير:
- يمكن استخدام معلمة الحد لإصدار الأوامر فقط على مضيفين محددين في ملف المضيف
- اسم المضيف كما هو محدد في ملف المخزون
إذا كنت بحاجة إلى نسخ ملف إلى وجهات متعددة بسرعة، فاستخدم وحدة النسخ التي تعتمد على بروتوكول SCP. يبدو الأمر ومخرجاته كما يلي:
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/testfile",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
"state": "file",
"uid": 0
}
host2 | SUCCESS => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/tmp/testfile",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
"state": "file",
"uid": 0
}
التفسير:
- تم تحديد وحدة النسخ
- وسيطات الوحدة، في هذه الحالة، هي المسار المطلق للمصدر والمسار المطلق للوجهة.
- إن إخراج أمر Ansible يعكس نجاح أمر النسخ وتفاصيل أخرى مثل مجموع التحقق sha1 أو md5 للتحقق من سلامة الملف والبيانات الوصفية مثل المالك أو الحجم أو الأذونات. من السهل تثبيت حزمة على مجموعة من الخوادم. يحتوي Ansible على عدة وحدات تتفاعل مع المثبتات المستخدمة، مثل yum وapt وdnf وما إلى ذلك.
في المثال التالي، ستقوم بتثبيت حزمة باستخدام وحدة yum على مضيفين من نوع CentOS.
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n========================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
host2 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n========================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
التفسير:
- يتم استخدام وحدة Yum في هذا المثال
- فهو يحدد وسيطات الوحدة، وفي هذه الحالة، ستختار اسم الحزمة وحالتها. إذا كانت الحالة غائبة، على سبيل المثال، سيتم البحث في الحزمة وإذا وجدت، تتم إزالتها
- عند تلوينه باللون الأصفر، سترى مخرجات الأمر ansible مع تغيير الحالة، مما يعني في هذه الحالة أنه تم العثور على الحزمة وتثبيتها.
- حالة أمر yum install الصادر عبر ansible. في هذه الحالة تم تثبيت الحزمة ncdu.x86_64 0:1.14-1.el7.
بالطبع، يمكن استخدام جميع خيارات برنامج التثبيت yum من خلال Ansible، بما في ذلك التحديث والتثبيت وأحدث إصدار والإزالة.
في المثال أدناه، يتم إصدار نفس الأمر لإزالة حزمة ncdu المثبتة مسبقًا.
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n========================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
host2 | SUCCESS => {
"changed": true,
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n========================================================================\n Package Arch Version Repository Size\n========================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n========================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n"
]
}
التفسير:
- يُظهر إخراج الأمر yum أنه تمت إزالة الحزمة.
من الميزات الأساسية الأخرى لبرنامج Ansible قدرته على جمع معلومات حول النظام. فهو يجمع معلومات عن الأجهزة والبرامج والإصدارات، ويخزن كل قيمة في متغير يمكنك إعادة استخدامه لاحقًا.
عندما تحتاج إلى معلومات مفصلة حول الأنظمة التي سيقوم Ansible بتعديلها، فإن وحدة الإعداد تجمع هذه الحقائق من متغيرات النظام.
كتب اللعب Ansible
كتب اللعب Ansible تُعدّ ملفات التشغيل وسيلةً لإرسال الأوامر إلى الأنظمة البعيدة عبر البرامج النصية. فهي تُهيئ بيئات الأنظمة المعقدة وتزيد من مرونتها من خلال تشغيل برنامج نصي واحد على نظام واحد أو أكثر. وهي أقرب إلى لغة تهيئة منها إلى لغة برمجة.
تستخدم أوامر دفتر التشغيل تنسيق YAML، لذا لا يتطلب الأمر الكثير من الكتابة، ولكن يجب مراعاة المسافات البادئة. وكما يوحي الاسم، فإن دفتر التشغيل عبارة عن مجموعة من الخطط. من خلال دفتر التشغيل، يمكنك تعيين أدوار محددة لبعض المضيفين وأدوار مختلفة لمضيفين آخرين، مما يتيح لك إدارة العديد من الخوادم في ملف واحد.
قبل المتابعة مع أمثلة ملفات التشغيل، من المفيد تعريف المهمة. المهام هي واجهة وحدات Ansible للأدوار وملفات التشغيل.
والآن، لنفترض وجود ملف تشغيل Ansible يحتوي على مهمة واحدة تتضمن مهامًا متعددة، كما هو موضح أدناه:
---
- hosts: group1
tasks:
- name: Install lldpad package
yum:
name: lldpad
state: latest
- name: check lldpad service status
service:
name: lldpad
state: started
في ملف التشغيل أعلاه، يتم استهداف مضيفات المجموعة 1 في ملف المضيفين لتثبيت حزمة lldpad باستخدام وحدة yum. ثم يتم تشغيل خدمة lldpad التي تم إنشاؤها بعد التثبيت باستخدام وحدة الخدمة، والتي تتفاعل في الغالب مع مجموعة systemd.
التفسير:
- مجموعة المضيفين التي سيتم تشغيل قواعد اللعبة عليها
- يتم استخدام وحدة Yum في هذه المهمة لتثبيت lldpad
- يتم استخدام وحدة الخدمة للتحقق مما إذا كانت الخدمة قيد التشغيل بعد التثبيت
يعمل كل ملف تشغيل Ansible مع ملف جرد. يحتوي ملف الجرد على قائمة بالخوادم مقسمة إلى مجموعات، مما يوفر تحكمًا أفضل في التفاصيل مثل عنوان IP ومنفذ SSH لكل مضيف.
يبدو ملف المخزون الخاص بمثال دفتر التشغيل هذا كما يلي. هناك مجموعتان، المجموعة 1 والمجموعة 2، تحتوي كل منهما على المضيف 1 والمضيف 2 على التوالي.
[group1] host1 ansible_host=192.168.100.2 ansible_ssh_port=22 [group2] host2 ansible_host=192.168.100.3 ansible_ssh_port=22
التفسير:
- أسم المجموعة
- اسم المضيف، مع عنوان IP ومنفذ ssh، في هذه الحالة، الاسم الافتراضي، 22.
يحتوي مثال Ansible playbook التالي على خطوتين لمجموعتين من المضيفين. بالنسبة للمجموعة الأولى، group1، يتم تمكين SELinux، وعند تمكينه تظهر رسالة على شاشة المضيف.
بالنسبة للمجموعة الثانية، يتم تثبيت حزمة httpd فقط إذا كانت ansible_os_family هي RedHat و ansible_system_vendor هي HP.
ansible_os_family و ansible_system_vendor هما متغيران يتم جمعهما باستخدام خيار gather_facts، ويمكن استخدامهما كما في هذا المثال الشرطي.
---
- hosts: group1
tasks:
- name: Enable SELinux
selinux:
state: enabled
when: ansible_os_family == 'Debian'
register: enable_selinux
- debug:
Imsg: "Selinux Enabled. Please restart the server to apply changes."
when: enable_selinux.changed == true
- hosts: group2
tasks:
- name: Install apache
yum:
name: httpd
state: present
when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'
التفسير:
- مثال على جملة متى، في هذه الحالة، عندما يكون نوع نظام التشغيل هو دبيان. يتم جمع المتغير ansible_os_family عبر وظيفة Collect_facts.
- يتم تسجيل مخرجات المهمة للاستخدام المستقبلي باسمenable_selinux
- مثال آخر على شرط when. في هذه الحالة، سيتم عرض رسالة للمستخدم المضيف إذا تم تمكين SELinux بالفعل من قبل.
- مثال آخر على جملة When التي تتكون من قاعدتين
إلى جانب المهام، توجد أيضًا مهام خاصة تُسمى المعالجات. يجب أن يحمل كل معالج اسمًا فريدًا في جميع أنحاء دليل التشغيل. تعمل المعالجات مثل المهام العادية، ولكن يمكن إخطار المعالج من خلال أداة إخطار.
إذا لم يتم إخطار معالج أثناء تشغيل دفتر التشغيل، فلن يتم تشغيله. ومع ذلك، إذا قامت أكثر من مهمة بإخطار معالج، فسيتم تشغيله مرة واحدة فقط بعد انتهاء جميع المهام.
في المثال أدناه، تحتوي مهمة محددة على قسم إشعار يستدعي مهمة أخرى. إذا تغيرت مخرجات المهمة الأولى، يتم استدعاء مهمة معالجة. ومن الأمثلة الشائعة على ذلك تغيير ملف التكوين ثم إعادة تشغيل الخدمة المتأثرة.
---
- hosts: group2
tasks:
- name: sshd config file modify port
lineinfile:
path: /etc/ssh/sshd_config
regexp: 'Port 28675'
line: '#Port 22'
notify:
- restart sshd
handlers
- name: restart sshd
service: sshd
name: sshd
state: restarted
في هذه الحالة، إذا تغيرت المهمة الأولى، "تعديل منفذ ملف تكوين sshd"، مما يعني أن المنفذ ليس 28675 بالفعل، فسيتم تعديل المنفذ وستقوم المهمة بإخطار المعالج الذي يحمل نفس الاسم، والذي يعيد تشغيل خدمة sshd.
التفسير:
- مثال على الإخطار
- مثال للمعالج
أدوار غير قابلة للتنفيذ
عند العمل مع ملفات التشغيل الكبيرة، يُفضّل تقسيم المهام إلى أدوار. كما تُسهّل الأدوار إعادة استخدام العمل لاحقًا. الدور عبارة عن مجموعة من المهام التي يمكن نقلها من ملف تشغيل إلى آخر وتشغيلها بشكل مستقل، ولكن فقط من خلال ملف التشغيل.
يتم تخزين الأدوار في مجلدات منفصلة وتتبع بنية مجلدات محددة.
[root@ansible-server test2]# tree
.
`-- role1
|-- defaults
| `-- main.yml
|-- handlers
| `-- main.yml
|-- meta
| `-- main.yml
|-- README.md
|-- tasks
| `-- main.yml
|-- tests
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml
7 directories, 8 files
يحتوي ملف YAML الموجود في مجلد الإعدادات الافتراضية على المتغيرات الافتراضية المستخدمة مع ملف التشغيل. ويخزن مجلد المعالجات المعالجات، بينما يحتوي مجلد البيانات الوصفية على معلومات حول المؤلف وتبعيات الدور. ويحتوي مجلد المهام على ملف YAML الرئيسي للدور.
يحتوي دليل الاختبارات على نموذج لملف تشغيل YAML ونموذج لملف جرد، ويستخدم في الغالب للاختبار قبل إنشاء الدور الفعلي.
يحتوي مجلد المتغيرات على ملف YAML الذي تُعرّف فيه جميع المتغيرات المستخدمة في الدور. أما مجلدا القوالب والملفات فيحتويان على القوالب والملفات المستخدمة في مهام الدور.
لإنشاء شجرة الدليل لدور معين، استخدم الأمر التالي مع اسم الدور كمعامل أخير:
[root@ansible-server test2]# ansible-galaxy init role1
يعمل Ansible بشكل جيد مع القوالب، ويستخدم Jinja2 كلغة للقوالب.
يوضح المثال التالي كيف يبدو قالب Jinja2 الأساسي وكيفية استخدامه في دور معين.
في وقت التشغيل، اعتمادًا على سبيل المثال على مركز البيانات الذي يوجد فيه خادمك، يمكنك الاختيار من بين عدة خوادم أسماء، كل منها يتوافق مع مركز بيانات، باستخدام المتغير resolver_ip_addresses.
{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}
options timeout:1
options attempts:5
options rotate
في هذا المثال، يحدد دليل التشغيل عدة متغيرات، بما في ذلك resolver_ip_addresses، بقيم مختلفة اعتمادًا على مركز البيانات.
- name: Set resolver for server
template:
src: dns.j2
dest: /etc/resolv.conf
group: root
owner: root
mode: "0644"
tag: resolver
التفسير:
- اسم القالب الذي سيتم استخدامه. يقع القالب في القوالب الموجودة في مسار الدور
- مسار الوجهة لاسم الملف الذي سيتم استبداله بالقالب، من جانب العميل.
- أذونات الملف الوجهة
يمكن أن تحتوي مهام الأدوار أيضًا على حقل وسم باسم مُعيّن. يمكن لأكثر من مهمة أن تشترك في نفس الوسم، وعند تشغيل ملف التشغيل، يمكنك تحديد وسم بحيث يتم تنفيذ المهام الموسومة فقط.
دراسة حالة غير قابلة للتنفيذ
في هذا القسم، نحلل دراسة حالة لملف تشغيل أساسي في Ansible يتضمن ثلاثة أدوار. الهدف هو تقديم مثال عملي للمفاهيم التي تم تناولها حتى الآن. تم تعديل بعض الأمثلة السابقة من هذا الدليل وإعادة استخدامها في ملف التشغيل هذا.
فيما يلي بنية مجلدات ملف التشغيل. ملف YAML المستخدم هو p4.yml.
[root@ansible-server test_ansible]# ls -lrth total 16K -rw-r--r--. 1 root root 0 Jul 3 10:13 testfile -rw-r--r--. 1 root root 203 Jul 3 13:30 p1.yml -rw-r--r--. 1 root root 125 Jul 3 15:00 hosts -rw-r--r--. 1 root root 488 Jul 3 16:40 p2.yml -rw-r--r--. 1 root root 188 Jul 4 17:33 p4.yml drwxr-xr-x. 5 root root 47 Jul 4 17:35 roles [root@ansible-server test_ansible]# cd roles [root@ansible-server roles]# ls -lrth total 12K drwxr-xr-x. 9 root root 4.0K Jul 4 12:52 httpd drwxr-xr-x. 9 root root 4.0K Jul 4 13:55 selinux drwxr-xr-x. 9 root root 4.0K Jul 4 16:54 resolver
يحتوي دليل التشغيل على ثلاثة أدوار. يقوم دور المُحلِّل بتعيين خادم أسماء مُحدد على الخوادم عن طريق نسخ ملف إلى المسار /etc/resolv.conf. يقوم دور خادم HTTP بتثبيت حزمة خادم HTTP باستخدام وحدة yum، أما الدور الثالث فيُفعِّل SELinux ويُخطر المستخدم المُسجَّل لإعادة تشغيل النظام. تم إنشاء كل دور باستخدام أمر ansible-galaxy.
دور المحلل، مهمة main.yml:
دور Httpd، مهمة main.yml:
دور Selinux، مهمة main.yml:
فيما يلي ملف p4.yml الخاص بتشغيل البرنامج. يعمل هذا الملف على جميع الأجهزة المضيفة ما لم يُحدد خلاف ذلك في سطر الأوامر، ويعمل بصلاحيات المستخدم الجذر على المنفذ 22 (SSH)، ويجمع البيانات قبل تشغيل الأدوار، ثم يُشغّل الأدوار الثلاثة جميعها. يمكن تشغيل كل دور على حدة بتحديد علامته في سطر أوامر ansible-playbook باستخدام المعامل –t.
---
- hosts: all
user: root
port: 22
gather_facts: True
roles:
- { role: selinux, tags: selinux }
- { role: httpd, tags: httpd }
- { role: resolver, tags: resolver }
يمكنك بعد ذلك تشغيل ملف p4.yml على الجهازين المضيفين وتحليل مخرجاته. ويمكن تشغيل الأمر نفسه مع المعامل –check لإجراء تجربة أولية، ومع المعامل -k عند الرغبة في استخدام مصادقة كلمة المرور.
التفسير:
- أمر Ansible-playbook الذي يقوم بتشغيل p4.yml
- يتخطى Playbook دور SELinux لأنه ممكّن بالفعل.
- اكتشف Ansible أن حزمة httpd مثبتة بالفعل، لذا فهي ترجع بشكل جيد.
- تم تعيين المحلل، وتم تغيير حالة محلل الدور.
ورقة الغش للأوامر Ansible
قم بتثبيت EPEL repo على أنظمة Centos/RHEL
[root@ansible-server ~]# sudo yum install epel-release
تثبيت حزمة غير معقولة على أنظمة Centos/RHEL
[root@ansible-server ~]# sudo yum install -y ansible
قم بإجراء تحديث للحزم الموجودة على Debian/Ubuntu نظم
$ sudo apt update
قم بتثبيت حزمة خصائص البرنامج المشتركة على Debian/Ubuntu نظم
$ sudo apt install software-properties-common
تثبيت أرشيف الحزمة الشخصية ansible على Debian/Ubuntu نظم
$ sudo apt-add-repository ppa:ansible/ansible
تثبيت ansible على دبيان/Ubuntu نظم
$ sudo apt update $ sudo apt install ansible
إصدار أ ping الأمر على جميع الخوادم المحددة في ملف المخزون المسمى hosts
[root@ansible-server test_ansible]# ansible -i hosts all -m ping
إصدار أ ping الأمر متاح فقط على المضيف 2
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
انسخ الملف "testfile" على كافة الأجهزة المضيفة في ملف المخزون
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
تثبيت حزمة ncdu على كافة المضيفين
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
إزالة حزمة ncdu على كافة الأجهزة المضيفة
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
قم ببناء بنية الدليل للدور المسمى role1.
[root@ansible-server test2]# ansible-galaxy init role1
قواعد التشغيل الجافة p4.yml
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check
قم بتشغيل p4.yml playbook مع مصادقة كلمة المرور لجميع المضيفين
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k















