هذا الدّرس هو جزء من سلسلة دروس حول نشر تطبيقات PHP باستخدام Ansible على Ubuntu، تحدّثنا في الأجزاء الأولى عن الخطوات الأساسيّة لنشر تطبيق، وفي بقيّة الأجزاء تكلمنا عن مواضيع أكثر تقدّمًا مثل قواعد البيانات، عفاريت الطابور queue daemons، وجدولة المهام (عبر cron).
سنقوم في هذا الدّرس بالبناء على ما تعلمناه في الدروس السابقة عن طريق تحويل الـ playbook في Ansible من دعمها لتطبيق واحد إلى دعمها لنشر تطبيقات PHP متعدّدة على خادوم أو عدّة خواديم، سنتحدث في هذا الجزء عن إعداد المتغيرات، وسنكمل في الجزء اللاحق عن إضافة المزيد من التطبيقات ونشرها.
سنستخدم تطبيقات Lumen بسيطة كجزء أمثلتنا، ولكن يُمكِن تعديل هذه التعليمات بسهولة لتدعم أطر عمل وتطبيقات أخرى في حال كانت متواجدة لديك، من المفضّل أن تستخدم تطبيقات الأمثلة حتى تجد نفسك متآلفًا مع القيام بالتغييرات للـ playbook.
المتطلبات الأساسية
تحتاج من أجل متابعة الدّرس إلى:
- الخادومين الاثنين اللذين قمنا بإعدادهما في الأجزاء السابقة.
- خادوم Ubuntu جديد (ثالث) يتم إعداده مثل خادوم PHP الأصلي الموجود في الأجزاء السابقة، مع مستخدم sudo غير جذري ومفاتيح SSH، حيث سنستخدمه لإظهار كيفيّة نشر تطبيقات متعدّدة إلى خواديم متعدّدة باستخدام Ansible Playbook واحدة، سنشير لعناوين IP لخادوم PHP الأصلي وخادوم PHP الجديد بـ
your_first_server_ip
وyour_second_server_ip
على الترتيب. - ملف etc/hosts/ مُحدَّث على حاسوبك المحلّي مع إضافة الأسطر التالية له، تستطيع تعلّم المزيد حول هذا الملف في الخطوة السادسة من هذا الدّرس.
your_first_server_ip laravel.example.com one.example.com two.example.com your_second_server_ip laravel.example2.com two.example2.com
أمثلة المواقع التي سنستخدمها في هذا الدّرس هي laravel.example.com
، one.example.com
، و two.example.com
، إن أردت استخدام نطاقك الخاص ستحتاج لتحديث تسجيلات DNS النشطة لديك بدلًا من ذلك.
الخطوة الأولى – إعداد متغيرات الـ Playbook
سنقوم في هذه الخطوة بإعداد متغيّرات الـ playbook لتعريف تطبيقنا الجديد.
في الدروس السابقة قمنا بكتابة خصائص الإعدادات بشكل حرفي وهو أمر طبيعي بالنسبة للعديد من الـ playbooks التي تقوم بتنفيذ مهام محدّدة من أجل تطبيق محدّد، أمّا عندما نريد دعم عدّة تطبيقات أو توسيع مدى الـ playbook الخاصّة بنا فلن يعود هنالك معنى من كتابة كل شيء حرفيًّا.
وكما شاهدنا سابقًا تزوّدنا Ansible بمتغيرات نستطيع استخدامها في تعريفات المهام وقوالب الملفّات، ما لم نشاهده حتى الآن هو كيفيّة تعيين المتغيرات، في أعلى الـ playbook بجانب مُعامِلات hosts
وtasks
نستطيع تعريف مُعامِل vars
وتعيين متغيراتنا هناك.
نقوم بالانتقال إلى الدليل ansible-php
الذي تحدثنا عنه في الدّروس السابقة:
cd ~/ansible-php/
نفتح الـ playbook الحاليّة من أجل تحريرها:
nano php.yml
ينبغي أن تبدو بداية الملف كما يلي:
Top of original php.yml --- - hosts: php sudo: yes tasks: . . .
نستطيع من أجل تعريف المتغيرات إضافة القسم vars
فقط، بجانب hosts
، sudo
، وtasks
، ولإبقاء الموضوع بسيط سنبدأ مع متغيّر بسيط جدًّا من أجل المستخدم www-data
كما يلي:
Updated vars in php.yml --- - hosts: php sudo: yes vars: wwwuser: www-data tasks: . . .
نقوم بعدها بتحديث كافّة المرّات التي ورد فيها المستخدم www-data
ونضع بدلًا منها المتغيّر {{ wwwuser }}
.
نضغط على CTRL+\
من أجل البحث والاستبدال باستخدام nano، سنشاهد مُحث prompt يقول:
Search (to replace):.
نكتب www-data
ونضغط ENTER
، سيتغيّر المُحِث إلى:
Replace with:
نكتب هنا {{ wwwuser }} ونضغط ENTER
مرّة أخرى، سيأخذنا nano عبر كل مثال من www-data
ويسألنا:
Replace this instanace?
نستطيع أن نضغط y
لاستبدال كل واحدة منها، أو نضغط a
لاستبدالها كلّها.
ملاحظة: تأكّد من عدم تغيير تعريف المتغير الذي أضفناه للتو في أعلى الملف، يجب أن يكون هنالك 11 مثال من www-data
نحتاج إلى استبدالها.
وقبل أن نكمل هنالك شيء نحتاج للانتباه له فيما يتعلّق بالمتغيرات، بإمكاننا بشكل طبيعي إضافتها كما يلي عندما تكون في سطر أطول:
Example task in php.yml - name: create /var/www/ directory file: dest=/var/www/ state=directory owner={{ wwwuser }} group={{ wwwuser }} mode=0700
ومع ذلك إن كان المتغيّر هو القيمة الوحيدة في السلسلة نحتاج إلى وضعه ضمن علامتي اقتباس كي يستطيع مُحلِّل YAML فهمه بشكل صحيح:
Updated task in php.yml - name: Run artisan migrate shell: php /var/www/laravel/artisan migrate --force sudo: yes sudo_user: "{{ wwwuser }}" when: dbpwd.changed
يجب أن يحدث هذا في الـ playbook في كل مرّة نحصل فيها على:
sudo_user: {{ wwwuser }}
نستطيع استخدام بحث واستبدال عام بنفس الطريقة ووضع:
sudo_user: "{{ wwwuser }}"
بدلًا من:
sudo_user: {{ wwwuser }}
ينبغي وجود أربعة أسطر تحتاج إلى هذا التغيير.
وبعد أن ننتهي من تغييرها نقوم بحفظ وتشغيل الـ playbook:
ansible-playbook php.yml --ask-sudo-pass
ينبغي ألّا توجد مهام متغيّرة، وهو يعني أنّ المتغيّر wwwuser
يعمل بشكل صحيح.
الخطوة الثانية – تعريف المتغيرات المتداخلة من أجل الإعدادات المعقدة
سننظر في هذا القسم إلى المتغيّرات المتداخلة من أجل خيارات الإعدادات المعقدة.
قمنا في الخطوة السابقة بإعداد متغيّر بسيط، ولكن يمكن أيضًا أن نُداخِل بين المتغيّرات وأن نُعرِّف قائمة من المتغيّرات، يزودنا هذا بالوظيفة التي نحتاجها لتعريف قائمة من المواقع التي نرغب بإعدادها على خادومنا.
دعونا في البداية ننظر إلى مستودع git الحالي الذي قمنا بإعداده في الـ playbook:
Existing git task in php.yml - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/do-community/do-ansible-adv-php.git update=yes version=example
نستطيع استخراج المعلومات المفيدة التالية: الاسم name (دليل)، المستودع repository، الفرع branch، والنطاق domain، وبما أنّنا نقوم بإعداد تطبيقات متعدّدة سنحتاج أيضًا إلى اسم نطاق من أجله للإجابة عليه، سنستخدم laravel.example.com
ولكن إن كنت تملك نطاقك الخاص فضعه هنا.
ينتج عن هذا المتغيرات الأربعة التالية التي نستطيع تعريفها من أجل هذا التطبيق:
Application variables name: laravel repository: https://github.com/do-community/do-ansible-adv-php.git branch: example domain: laravel.example.com
نفتح الآن الـ playbook من أجل تحريرها:
nano php.yml
نستطيع في القسم العلوي vars
إضافة تطبيقنا إلى قائمة التطبيقات الجديدة:
Updated applications variables in php.yml --- - hosts: php sudo: yes vars: wwwuser: www-data applications: - name: laravel domain: laravel.example.com repository: https://github.com/do-community/do-ansible-adv-php.git branch: example ...
إن قمنا الآن بتشغيل الـ playbook (باستخدام ansible-playbook php.yml --ask-sudo-pass
) فلن يتغير شيء لأنّنا لم نقم بعد بإعداد مهامنا لكي تستخدم المتغير applications
الجديد، إن ذهبنا إلى http://laravel.example.com/
في متصفحنا فينبغي أن يظهر تطبيقنا الأصلي.
الخطوة الثالثة – المرور على المتغيرات عن طريقة حلقة loop في المهام
سنتعلم في هذا القسم كيفيّة المرور على قوائم المتغيرات عبر حلقة loop في المهام.
كما أشرنا سابقًا تحتاج قوائم المتغيرات المرور عليها عبر حلقة في كل مهمة نرغب في استخدامها فيها، وكما شاهدنا مع المهمّة install packages
نحتاج إلى تعريف حلقة من العناصر ومن ثمّ تطبيق المهمّة لكل عنصر في القائمة.
نفتح الـ playbook من أجل تحريرها:
nano php.yml
سنبدأ ببعض المهام السهلة، ينبغي أن نجد مهمتي env في منتصف الـ playbook تقريبًا:
Existing env tasks in php.yml - name: set APP_DEBUG=false lineinfile: dest=/var/www/laravel/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false - name: set APP_ENV=production lineinfile: dest=/var/www/laravel/.env regexp='^APP_ENV=' line=APP_ENV=production
نلاحظ أنّها مكتوبة الآن بشكل حرفي مع الدليل laravel
، نحتاج إلى تحديثها لكي تستخدم الخاصية name
لكل تطبيق، ولفعل هذا نضيف الخيار with_items
كي يمر على شكل حلقة خلال قائمة applications
لدينا، وضمن المهمّة نفسها سنبدل المرجع laravel
بالمتغير {{ item.name }}
.
ينبغي أن تبدو كما يلي:
Updated .env tasks in php.yml - name: set APP_DEBUG=false lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^APP_DEBUG=' line=APP_DEBUG=false with_items: applications - name: set APP_ENV=production lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^APP_ENV=' line=APP_ENV=production with_items: applications
ننتقل بعدها إلى الأسفل إلى مهمتي Laravel cron، يمكن تحديثهما كما فعلنا تمامًا مع مهام env
، سنقوم بإضافة item.name
إلى المُعامِل name
من أجل مُدخلات لأنّ Ansible تستخدم هذا الحقل لتعرّف بشكل فريد كل مُدخل cron، إن تركناها كما هي فلن نكون قادرين على الحصول على مواقع متعددة على نفس الخادوم لأنّها ستكتب فوق بعضها بشكل ثابت وسيتم حفظ القيمة الأخيرة فقط.
ينبغي أن تبدو المهمة كما يلي:
Updated cron tasks in php.yml - name: Laravel Scheduler cron: > job="run-one php /var/www/{{ item.name }}/artisan schedule:run 1>> /dev/null 2>&1" state=present user={{ wwwuser }} name="{{ item.name }} php artisan schedule:run" with_items: applications - name: Laravel Queue Worker cron: > job="run-one php /var/www/{{ item.name }}/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1" state=present user={{ wwwuser }} name="{{ item.name }} Laravel Queue Worker" with_items: applications
إن قمنا بحفظ وتشغيل الـ playbook الآن (باستخدام ansible-playbook php.yml --ask-sudo-pass
) فيجب أن نرى أنّه فقط تم تحديث مهمّتي cron، وهذا بسبب التغيير في المُعامِل name، ولا توجد أيّة تغييرات عدا عن ذلك، وهذا يعني أنّ قائمة تطبيقاتنا تعمل كما هو متوقع، ولم نقم بأيّة تغييرات إلى خادومنا كنتيجة لإعادة تصنيع الـ playbook لدينا.
الخطوة الرابعة – تطبيق المتغيرات من الحلقة looped variables في قوالب templates
سنغطي في هذا القسم كيفيّة استخدام المتغيرات من الحلقة في القوالب.
نستطيع استخدام هذه المتغيرات بنفس الطريقة تمامًا التي استخدمناها في المهام، كما هو الحال مع جميع المتغيرات الأخرى، تأتي الصعوبة عندما نأخذ بعين الاعتبار مسارات الملفات بالإضافة للمتغيرات، لأنّنا سنحتاج في بعض الأحيان إلى أخذ اسم الملف بعين الاعتبار وحتى تنفيذ أوامر أخرى بسبب الملف الجديد.
نحتاج في حالة Nginx إلى إنشاء ملف إعدادات جديد لكل تطبيق وإخبار Nginx أنّه ينبغي تمكينها، نريد أيضًا إزالة ملف إعداداتنا الافتراضي:
etc/nginx/sites-available/default
/ خلال العمليّة.
نفتح في البداية الـ playbook من أجل تحريرها:
nano php.yml
نقوم بإيجاد المهمة Configure Nginx
(قرب منتصف الـ playbook) وتحديثها كما فعلنا مع المهام الأخرى:
Updated nginx task in php.yml - name: Configure nginx template: src=nginx.conf dest=/etc/nginx/sites-available/{{ item.name }} with_items: applications notify: - restart php5-fpm - restart nginx
وبينما نحن هنا نقوم بإضافة المهمتين الإضافيتين اللتين أشرنا لهما سابقًا، نخبر Nginx في البداية حول ملف إعدادات الموقع الجديد، يتم فعل هذا باستخدام بارتباط رمزي بين أدلة sites-available
و sites-enabled
في /var/nginx/
.
نضيف هذه المهمة بعد المهمة Configure nginx:
New symlink task in php.yml - name: Configure nginx symlink file: src=/etc/nginx/sites-available/{{ item.name }} dest=/etc/nginx/sites-enabled/{{ item.name }} state=link with_items: applications notify: - restart php5-fpm - restart nginx
نرغب بعدها في إزالة ملف إعدادات الموقع المُمكّن افتراضيًّا default كي لا يسبب مشاكل مع ملفّات إعدادات موقعنا الجديد، يتم عمل هذا بسهولة باستخدام الوحدة file:
New file task php.yml - name: Remove default nginx site file: path=/etc/nginx/sites-enabled/default state=absent notify: - restart php5-fpm - restart nginx
لاحظ أنّنا لم نحتاج إلى وضع applications في حلقة لأنّنا كنّا نبحث عن ملف واحد.
يجب أن تبدو كتلة Nginx في الـ playbook كما يلي الآن:
Updated nginx tasks in php.yml - name: Configure nginx template: src=nginx.conf dest=/etc/nginx/sites-available/{{ item.name }} with_items: applications notify: - restart php5-fpm - restart nginx - name: Configure nginx symlink file: src=/etc/nginx/sites-available/{{ item.name }} dest=/etc/nginx/sites-enabled/{{ item.name }} state=link with_items: applications notify: - restart php5-fpm - restart nginx - name: Remove default nginx site file: path=/etc/nginx/sites-enabled/default state=absent notify: - restart php5-fpm - restart nginx
نحفظ الـ playbook ونفتح الملف nginx.conf من أجل تحريره:
nano nginx.conf
نقوم بتحديث ملف الإعدادات بحيث يستخدم متغيراتنا:
Updated nginx.conf server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /var/www/{{ item.name }}/public; index index.php index.html index.htm; server_name {{ item.domain }}; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/{{ item.name }}/public; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
مع ذلك لم نقم بالانتهاء بعد، أتلاحظ default_server
في الأعلى؟ نريد تضمينها فقط من أجل تطبيق laravel
لجعله التطبيق الافتراضي، لعمل هذا نستطيع استخدام جملة IF
بسيطة لنتحقّق إذا ما كان item.name
يساوي laravel
وإن كان كذلك نعرض default_server
.
ستبدو كما يلي:
Updated nginx.conf with conditionals server { listen 80{% if item.name == "laravel" %} default_server{% endif %}; listen [::]:80{% if item.name == "laravel" %} default_server ipv6only=on{% endif %};
نحدّث nginx.conf وفقًا لذلك ونحفظه.
حان الوقت الآن لتشغيل الـ playbook لدينا:
ansible-playbook php.yml --ask-sudo-pass
يجب أن تلاحظ أنّه تم تعليم مهام Nginx بأنّها تغيرت، عند الانتهاء من تشغيل الـ playbook نحدّث الموقع في متصفحنا ويجب أن يعرض ما يلي:
http://laravel.example.com/ Queue: YES Cron: YES
الخطوة الخامسة – وضع متغيرات متعددة في حلقة معا
سنقوم في هذه الخطوة بوضع متغيّرات متعدّدة معًا في مهمّة.
حان الوقت الآن لمعالجة مثال حلقات أكثر تعقيدًا، خصوصًا المتغيّرات المُسجّلَة، من أجل دعم حالات مختلفة ومنع تشغيل مهام غير ضرورية، تتذكر أنّنا استخدمنا register: cloned
في مهمّة استنساخ مستودع git لتسجيل المتغير cloned
مع حالة المهمّة، نستخدم بعدها when: cloned|changed
في المهام التالية لتحفيز المهام بشكل شرطي، نحتاج الآن إلى تحديث هذه المراجع لتدعم حلقة التطبيقات.
نفتح أوّلًا الـ playbook من أجل تحريرها:
nano php.yml
نبحث عن المهمّة Clone git repository:
Existing git task in php.yml - name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/do-community/do-ansible-adv-php.git update=yes version=example sudo: yes sudo_user: "{{ wwwuser }}" register: cloned
وبما أنّنا نقوم بتسجيل المتغيرات في هذه المهمة فلن نحتاج إلى فعل أي شيء لم نفعله سابقًا:
Updated git task in php.yml - name: Clone git repository git: > dest=/var/www/{{ item.name }} repo={{ item.repository }} update=yes version={{ item.branch }} sudo: yes sudo_user: "{{ wwwuser }}" with_items: applications register: cloned
نبحث الآن عن المهمة composer create-project:
Original composer task in php.yml - name: composer create-project composer: command=create-project working_dir=/var/www/laravel optimize_autoloader=no sudo: yes sudo_user: "{{ wwwuser }}" when: cloned|changed
نحتاج الآن إلى تحديثها للمرور عبر حلقة على applications
و cloned
، يتم فعل هذا باستخدام الخيار with_together
وتمرير applications
وcloned
إليها، وبينما تقوم with_together
بالمرور عبر حلقة على المتغيرين فيتم الصول إلى العناصر باستخدام item.#
، حيث أنّ #
هي فهرس المتغير، فعلى سبيل المثال:
with_together: - list_one - list_two
يشير item.0 إلى list_one ويشير item.1 إلى list_two.
يعني هذا أنّنا نستطيع من أجل applications
نستطيع الوصول إلى الخصائص عبر: item.0.name
، نحتاج من أجل cloned
إلى تمرير النتائج من المهام والتي يمكن الوصول إليها عبر cloned.results
ومن ثمّ نستطيع التحقّق إن تم تغييرها من خلال item.1.changed
.
يعني هذا أنّ المهمة ستصبح:
Updated composer task in php.yml - name: composer create-project composer: command=create-project working_dir=/var/www/{{ item.0.name }} optimize_autoloader=no sudo: yes sudo_user: "{{ wwwuser }}" when: item.1.changed with_together: - applications - cloned.results
نقوم الآن بحفظ وتشغيل الـ playbook:
ansible-playbook php.yml --ask-sudo-pass
ينبغي ألّا تحدث أيّة تغييرات من هذا التشغيل، ومع ذلك نمتلك الآن متغيرًا مُسجّلًا يعمل بشكل رائع مع حلقة.
الخطوة السادسة – المتغيرات المسجلة المعقدة والحلقات
سنتعلم في هذا القسم حول المزيد من المتغيرات المسجلة المعقدة والحلقات.
الجزء الأكثر تعقيدًا من التحويل هو مُداولة handling المتغير المسجّل الذي نستخدمه من أجل توليد كلمة السر لقاعدة بيانات MySQL، ولا يوجد أكثر مما فعلناه في هذه الخطوة لم نقم بتغطيته، نحتاج فقط إلى تحديث عدد من المهام في وقت واحد.
نفتح الـ playbook من أجل تحريرها:
nano php.yml
نبحث عن مهام MySQL ونقوم بإضافة المتغيرات البسيطة كما فعلنا في المهمة السابقة:
Updated MySQL tasks in php.yml - name: Create MySQL DB mysql_db: name={{ item.name }} state=present with_items: applications - name: Generate DB password shell: makepasswd --chars=32 args: creates: /var/www/{{ item.name }}/.dbpw with_items: applications register: dbpwd - name: Create MySQL User mysql_user: name={{ item.name }} password={{ dbpwd.stdout }} priv={{ item.name }}.*:ALL state=present when: dbpwd.changed - name: set DB_DATABASE lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_DATABASE=' line=DB_DATABASE={{ item.name }} with_items: applications - name: set DB_USERNAME lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_USERNAME=' line=DB_USERNAME={{ item.name }} with_items: applications - name: set DB_PASSWORD lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }} when: dbpwd.changed - name: Save dbpw file lineinfile: dest=/var/www/{{ item.name }}/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present sudo: yes sudo_user: "{{ wwwuser }}" when: dbpwd.changed - name: Run artisan migrate shell: php /var/www/{{ item.name }}/artisan migrate --force sudo: yes sudo_user: "{{ wwwuser }}" when: dbpwd.changed
نضيف بعدها with_together
كي نستطيع استخدام كلمة سر قاعدة بياناتنا، ومن أجل توليد كلمة السر نحتاج إلى المرور بحلقة خلال dbpwd.results
وسنكون قادرين على الوصول لكلمة السر من item.1.stdout
بما أنّه سيتم الوصول لـ applications
عبر item.0
.
نستطيع تحديث الـ playbook وفق ذلك:
Updated MySQL tasks in php.yml - name: Create MySQL DB mysql_db: name={{ item.name }} state=present with_items: applications - name: Generate DB password shell: makepasswd --chars=32 args: creates: /var/www/{{ item.name }}/.dbpw with_items: applications register: dbpwd - name: Create MySQL User mysql_user: name={{ item.0.name }} password={{ item.1.stdout }} priv={{ item.0.name }}.*:ALL state=present when: item.1.changed with_together: - applications - dbpwd.results - name: set DB_DATABASE lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_DATABASE=' line=DB_DATABASE={{ item.name }} with_items: applications - name: set DB_USERNAME lineinfile: dest=/var/www/{{ item.name }}/.env regexp='^DB_USERNAME=' line=DB_USERNAME={{ item.name }} with_items: applications - name: set DB_PASSWORD lineinfile: dest=/var/www/{{ item.0.name }}/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ item.1.stdout }} when: item.1.changed with_together: - applications - dbpwd.results - name: Save dbpw file lineinfile: dest=/var/www/{{ item.0.name }}/.dbpw line="{{ item.1.stdout }}" create=yes state=present sudo: yes sudo_user: "{{ wwwuser }}" when: item.1.changed with_together: - applications - dbpwd.results - name: Run artisan migrate shell: php /var/www/{{ item.0.name }}/artisan migrate --force sudo: yes sudo_user: "{{ wwwuser }}" when: item.1.changed with_together: - applications - dbpwd.results
بعد أن يتم تحديثها نقوم بحفظها وتشغيلها:
ansible-playbook php.yml --ask-sudo-pass
بالرغم من جميع التغييرات التي قمنا بها على الـ playbook فلا يجب أن يكون هنالك تغييرات في مهام قاعدة البيانات، ومع التغييرات في هذه الخطوة نكون قد انتهينا من التحويل من playbook تدعم تطبيق وحيد إلى playbook تدعم تطبيقات متعددة.
الخاتمة
تحدثنا في هذا الجزء عن إعداد المتغيرات، وسنكمل في الجزء اللاحق عن إضافة المزيد من التطبيقات ونشرها إلى خادوم آخر.
ترجمة -وبتصرّف- لـ How To Deploy Multiple PHP Applications using Ansible on Ubuntu 14.04 لصاحبه Stephen Rees-Carter.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.