ستغطّي هذه السّلسلة عمليّة نشر تطبيق PHP بسيط باستخدام Ansible، الهدف النّهائي سيكون الحصول على خادوم ويب جديد يُخدِّم تطبيق PHP بسيط بدون أي اتصال عبر SSH أو تشغيل يدوي للأوامر على الخادوم الهدف، سنغطي في هذا القسم من الدرس تثبيت Ansible وإعداد البيئة بشكل عام.
سنستخدم إطار عمل Laravel كمثال عن تطبيق PHP ولكن يُمكِن تعديل هذه التعليمات بسهولة لتدعم أطر عمل وتطبيقات أخرى في حال كانت متواجدة لديك.
المتطلبات الأساسية
سنستخدم Ansible لتثبيت وإعداد Nginx، PHP، وخدمات أخرى على خادوم Ubuntu 14.04 ، يعتمد هذا الدّرس على معرفتك الأساسية بـ Ansible لذا إن كنت جديدًا عليها فبإمكانك قراءة درس Ansible الأساسي أولًا.
ستحتاج لمتابعة هذا الدّرس إلى:
- خادوم Ubuntu 14.04 بأي حجم والذي سنستخدمه لإعداد ونشر تطبيق PHP الخاص بنا عليه، ستتم الإشارة إلى عنوان IP هذا الجهاز بـ
your_server_ip
خلال هذا الدّرس. - خادوم Ubuntu 14.04 والذي سنستخدمه من أجل Ansible، وهو الخادوم الذي سنبقى في وضعية تسجيل دخول عليه في كامل هذا الدّرس.
- إعداد مستخدم غير جذري مع صلاحيّات sudo لكل خادوم.
- مفاتيح SSH من أجل خادوم Ansible لتصريح تسجيل الدخول على خادوم نشر PHP، ويُمكِن إعدادها باتّباع هذه السلسلة وتطبيقها على خادوم Ansible الخاص بنا.
الخطوة الأولى – تثبيت Ansible
يُمكِن إنجاز هذه الخطوة بسهولة عن طريق تثبيت PPA (أرشيف الحِزَم الشخصي Personal Package Archive) وتثبيت حزمة Ansible باستخدام apt
.
نُضيف أوّلًا PPA باستخدام الأمر apt-add-repository
:
sudo apt-add-repository ppa:ansible/ansible
وبعد انتهائه نقوم بتحديث ذاكرة التخزين المؤقّت cache لـ apt
:
sudo apt-get update
نقوم بتثبيت Ansible أخيرًا:
sudo apt-get install ansible
حالما يتم تثبيت Ansible نقوم بإنشاء دليل جديد للعمل بداخله وضبط الإعدادات الأساسيّة، تستخدم Ansible افتراضيًّا ملف مضيفين hosts موجود في المسار etc/ansible/hosts
/، وهو يحتوي كافّة الخواديم التي يُديرها، وبينما يكون هذا الملف مناسبًا لبعض حالات الاستخدام فهو عام global، وهو ما لا نريده هنا.
سنقوم من أجل هذا الدّرس بإنشاء ملف مضيفين محلّي local واستخدامه بدلًا من الملف السابق، نستطيع فعل هذا عن طريق إنشاء ملف إعدادات Ansible جديد بداخل دليل العمل لدينا، والذي بإمكاننا استخدامه لإخبار Ansible بأن تبحث عن ملف المضيفين داخل نفس الدليل.
نُنشِئ مُجلّدًا جديدًا (سنستخدمه لبقيّة هذا الدّرس):
mkdir ~/ansible-php
ننتقل إلى داخل المُجلّد الجديد:
cd ~/ansible-php/
نُنشِئ ملفًّا جديدًا يُدعى ansible.cfg
ونفتحه من أجل تحريره باستخدام nano
أو أي مُحرِّر نصوص تفضله:
nano ansible.cfg
نضيف خيار الإعدادات hostfile
مع القيمة hosts
في المجموعة [defaults]
عن طريق نسخ ما يلي إلى الملف ansible.cfg
:
ansible.cfg [defaults] hostfile = hosts
نحفظ الملف ansible.cfg
ونغلقه، نقوم بعدها بإنشاء الملف hosts
والذي يحتوي على عنوان IP لخادوم PHP حيث سيتم نشر تطبيقنا.
nano hosts
ننسخ ما يلي لإضافة قسم من أجل php
مع وضع عنوان IP الخاص بخادومك بدلًا من your_server_ip
ووضع اسم المستخدم غير الجذري الذي قمت بإنشائه في المتطلبات الأساسيّة على خادوم PHP بدلًا من sammy
:
hosts [php] your_server_ip ansible_ssh_user=sammy
نحفظ ونغلق الملف hosts
، فلنقم بإجراء تحقّق أبسط للتأكد من قدرة Ansible على الاتصال بالمضيف كما هو متوقّع عن طريق استدعاء الوحدة ping
على المجموعة php
الجديدة:
ansible php -m ping
ربّما تحصل على تحقّق من استيثاق مُضيف SSH اعتمادًا على كونك قد سجلّت الدخول إلى هذا المُضيف من قبل، ينبغي أن تعود ping باستجابة ناجحة تبدو كما يلي:
Output 111.111.111.111 | success >> { "changed": false, "ping": "pong"
تمّ الآن تثبيت وإعداد Ansible بنجاح، نستطيع الانتقال إلى إعداد خادوم الويب لدينا.
الخطوة الثانية – تثبيت الحزم المطلوبة
سنقوم في هذه الخطوة بتثبيت بعض حِزَم النظام المطلوبة باستخدام Ansible و apt
، سنثبت تحديدًا git
، nginx
، sqlite3
، mcrypt
، وبعض حِزَم php5-*
.
نحتاج قبل إضافة الوحدة apt
لتثبيت الحِزَم التي نريدها إلى إنشاء playbook بسيط (وهو عبارة عن قواعد تُحدِّد إعدادات Ansible)، سنبني على هذا الـ playbook مع تقدّمنا في هذا الدّرس، نقوم بإنشاء playbook جديد يُدعى php.yml
:
nano php.yml
نلصق الإعدادات التالية، يُحدِّد أول سطرين مجموعة المضيفين التي نرغب باستخدامها (php
) وتتحقّق من أنّها تنفّذ الأوامر باستخدام sudo
افتراضيًّا، تُضيف باقي الأسطر وحدة بالحِزَم التي نحتاجها، تستطيع تخصيصها من أجل تطبيقاتك الخاصّة أو استخدام الإعدادات التالية إن كنت تتبع مثال تطبيق Laravel:
--- - hosts: php sudo: yes tasks: - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3
نحفظ الملف php.yml
، ونقوم أخيرًا بتشغيل ansible-playbook
لتثبيت الحِزَم على الخادوم، يجب ألّا ننسى استخدام الخيار --ask-sudo-pass
إن كان يتطلّب مستخدم sudo على خادوم PHP كلمة سر:
ansible-playbook php.yml --ask-sudo-pass
الخطوة الثالثة – تعديل ملفات إعدادات النظام
سنقوم في هذا القسم بتعديل بعض ملفّات إعدادات النظام على خادوم PHP، أهم خيار إعدادات يُمكِن تغييره (بغض النظر عن ملفّات Nginx، والتي سيتم تغطيتها في خطوة لاحقة) هو الخيار cgi.fix_pathinfo
في php5-fpm
، لأنّ القيمة الافتراضيّة له تُشكِّل خطرًا أمنيًّا.
سنوضّح أوّلًا جميع الأقسام التي سنضيفها إلى هذا الملف، ونضمّن بعدها كامل الملف php.yml
من أجلك لكي تقوم بنسخه ولصقه.
يُمكِن استخدام الوحدة lineinfile للتأكّد من أنّ قيمة الإعدادات ضمن الملف مطابقة تمامًا لما نتوقعه، يُمكِن عمل هذا باستخدام تعبير نمطي regular expression عام بحيث تتمكّن Ansible من فهم معظم الصيغ التي من المحتمل أن يكون فيها المُعامِل، سنحتاج أيضًا لإعادة تشغيل php5-fpm
وnginx
لضمان تطبيق التغييرات، لذا نحتاج إلى إضافة مُداوِلَين handlers اثنين أيضًا في قسم جديد للمداولات handlers
، تكون المداولات مثاليّة لهذا لأنّه يتم إطلاقها فقط عند تغيير المهمّة، ويتم أيضًا تشغيلها في نهاية الـ playbook، لذا يُمكن لمهام متعدّدة استدعاء نفس المُداوِل وسيعمل فقط مرّة واحدة.
يبدو القسم الذي يُنفِّذ ما سبق كما يلي:
name: ensure php5-fpm cgi.fix_pathinfo=0 lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0 notify: - restart php5-fpm - restart nginx handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted
ملاحظة: خطأ برمجي bug في إصدار Ansible 1.9.1
يوجد خطا برمجي في إصدار Ansible 1.9.1 يمنع php5-fpm
من إعادة تشغيلها مع الوحدة service
، وقد استخدمنا هذا في مُداولاتنا.
وحتى يتم إصدار إصلاح له نستطيع الالتفاف على هذه المشكلة عن طريق تغيير المُداوِل restart php5-fpm
من استخدام الأمر service
إلى استخدام الأمر shell
كما يلي:
- name: restart php5-fpm shell: service php5-fpm restart
سيتجاوز هذا المشكلة ويعيد تشغيل php5-fpm
بشكل صحيح.
نحتاج بعد ذلك أيضًا إلى التأكّد من تمكين الوحدة php5-mcrypt
، يُمكن فعل هذا عن طريق تنفيذ script يُدعى php5enmod
باستخدام صدفة المهام shell task والتحقّق من وجود الملف 20-mcrypt.ini
في مكانه عند تمكينه، لاحظ أنّنا نخبر Ansible أنّ المهمّة تقوم بإنشاء ملف مُحدَّد، فإن كان هذا الملف موجودًا فلن يتم تشغيل المهمّة:
name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.ini
نفتح الآن الملف php.yml
لتحريره مرّة أخرى:
nano php.yml
نضيف المهام والمداولات السابقة بحيث يتطابق الملف مع التالي:
--- - hosts: php sudo: yes tasks: - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3 - name: ensure php5-fpm cgi.fix_pathinfo=0 lineinfile: dest=/etc/php5/fpm/php.ini regexp='^(.*)cgi.fix_pathinfo=' line=cgi.fix_pathinfo=0 notify: - restart php5-fpm - restart nginx - name: enable php5 mcrypt module shell: php5enmod mcrypt args: creates: /etc/php5/cli/conf.d/20-mcrypt.ini handlers: - name: restart php5-fpm service: name=php5-fpm state=restarted - name: restart nginx service: name=nginx state=restarted
نقوم أخيرًا بتشغيل playbook:
ansible-playbook php.yml --ask-sudo-pass
يمتلك الآن الخادوم كافّة الحِزَم المطلوبة مُثبّتة عليه ومجموعة الإعدادات الأساسيّة جاهزة للانطلاق.
الخاتمة
تحدثنا في القسم الأول من هذا الدّرس عن طريقة تثبيت Ansible وإعداد البيئة بشكل عام من أجل التحضير لعمليّة نشر تطبيق PHP بسيط باستخدام Ansible، وسنكمل في القسم الثاني الحصول على Laravel وإعداده وإعداد خادوم Nginx لتخديم تطبيق PHP.
ترجمة -وبتصرّف- لـ How To Deploy a Basic PHP Application Using Ansible on Ubuntu 14.04 لصاحبه Stephen Rees-Carter.
أفضل التعليقات
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.