<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Puppet</title><link>https://academy.hsoub.com/devops/deployment/puppet/?d=4</link><description>DevOps: Puppet</description><language>ar</language><item><title>&#x623;&#x62A;&#x645;&#x62A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x644;&#x62E;&#x627;&#x62F;&#x645; &#x627;&#x644;&#x645;&#x633;&#x628;&#x642; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646; Manifests &#x644;&#x623;&#x62F;&#x627;&#x629; Puppet</title><link>https://academy.hsoub.com/devops/deployment/puppet/%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-puppet-r691/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_04/----Puppet.png.6c55febf35cf55752240fcef354f2780.png" /></p>
<p>
	تُعَد إدارة ضبط الخادم (يُشار إليها أيضًا باسم أتمتة تقانة المعلومات IT Automation) حلًا لتحويل إدارة بنيتك التحتية إلى الشيفرة البرمجية الأساسية، ولوصف جميع العمليات اللازمة لنشر خادم في مجموعة من سكربتات الإعداد المسبق Provisioning Scripts التي يمكن إصدارها وإعادة استخدامها بسهولة، ويمكنها تحسين التكامل لأيّ بنية خادم تحتية بصورة كبيرة بمرور الوقت.
</p>

<p>
	تحدثنا في <a href="https://academy.hsoub.com/devops/deployment/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-configuration-management-r689/" rel="">مقال سابق</a> عن الفوائد الرئيسية لتنفيذ إستراتيجية إدارة الضبط لبنية الخادم التحتية، وكيفية عمل أدوات إدارة الضبط والعناصر المشتركة بين هذه الأدوات. سنوضح في هذا المقال عملية أتمتة إعداد الخادم المسبق باستخدام الأداة <a href="https://academy.hsoub.com/devops/deployment/puppet/" rel="">Puppet</a>، وهي أداة شائعة لإدارة الضبط قادرة على إدارة البنية التحتية المعقدة بطريقة شفافة باستخدام خادم رئيسي Master لتنسيق ضبط العقد، وسنركز على مصطلحات اللغة والصياغة والميزات اللازمة لإنشاء مثال مبسط للأتمتة الكاملة لنشر خادم ويب Ubuntu 18.04 باستخدام أباتشي Apache.
</p>

<p>
	تحتوي القائمة التالية على جميع الخطوات التي نحتاجها للأتمتة حتى الوصول إلى هدفنا:
</p>

<ol>
	<li>
		حدّث ذاكرة <code>apt</code> المخبئية.
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/web/apache/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%B6%D8%A8%D8%B7-%D8%AE%D8%A7%D8%AF%D9%85-apache-r407/" rel="">ثبّت خادم أباتشي Apache</a>.
	</li>
	<li>
		أنشئ مجلد المستند الجذر المُخصَّص.
	</li>
	<li>
		ضع ملف <code>index.html</code> في المستند الجذر المخصص.
	</li>
	<li>
		طبّق قالبًا لإعداد المضيف الوهمي المخصص.
	</li>
	<li>
		أعِد تشغيل أباتشي.
	</li>
</ol>

<p>
	سنبدأ بإلقاء نظرة على المصطلحات التي تستخدمها أداة Puppet، ثم سنتعرّف على ميزات اللغة الرئيسية التي يمكن استخدامها لكتابة ملفات البيان Manifests، وسنشاركك في النهاية المثال الكامل لتتمكّن من تجربته بنفسك.
</p>

<p>
	<strong>ملاحظة</strong>: يهدف هذا المقال إلى تعريفك بلغة Puppet وكيفية كتابة ملفات البيان لأتمتة إعداد خادمك المسبق. اطّلع على <a href="https://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/" rel="">تثبيت الأداة Puppet لإدارة بنية الخوادم التحتية</a> لمعرفة الخطوات اللازمة لتثبيت أداة Puppet والبدء باستخدامها.
</p>

<p>
	هذا المقال جزء من سلسلة حول إدارة ضبط الخوادم، وإليك روابط فصول السلسلة:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-configuration-management-r689/" rel="">مدخل إلى إدارة ضبط الخوادم Configuration Management</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/ansible/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-configuration-management-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%AF%D9%84%D9%8A%D9%84-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-ansible-r690/" rel="">مبادئ إدارة ضبط الخوادم Configuration Management: كتابة دليل تشغيل الأداة Ansible</a>
	</li>
	<li>
		مبادئ إدارة ضبط الخوادم Configuration Management: كتابة ملفات البيان Manifests للأداة Puppet
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/chef/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-configuration-management-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%81%D8%A7%D8%AA-recipes-%D9%81%D9%8A-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-chef-r692/" rel="">مبادئ إدارة ضبط الخوادم Configuration Management: كتابة الوصفات Recipes في الأداة Chef</a>
	</li>
</ul>

<h2>
	البدء باستخدام الأداة Puppet
</h2>

<p>
	يجب أن نتعرف أولًا على المصطلحات والمفاهيم المهمة التي قدمتها أداة Puppet قبل البدء بالعمل.
</p>

<h3>
	مصطلحات Puppet
</h3>

<p>
	تحتوي القائمة التالية على أهم المصطلحات التي تستخدمها أداة Puppet:
</p>

<ul>
	<li>
		جهاز Puppet الرئيسي Master: الخادم الرئيسي الذي يتحكم في الضبط على العقد.
	</li>
	<li>
		عقدة الوكيل الخاصة بالأداة Puppet: عقدة يتحكم فيها جهاز Puppet الرئيسي.
	</li>
	<li>
		ملف البيان Manifest: ملف يحتوي على مجموعة من التعليمات لتنفيذها.
	</li>
	<li>
		المورد Resource: جزء الشيفرة البرمجية الذي يصرّح عن عنصر في النظام وكيفية تغيير حالته، فمثلًا يجب لتثبيت حزمة تحديدُ المورد package والتأكد من ضبط حالته على أنه "مُثبَّت".
	</li>
	<li>
		الوحدة Module: مجموعة من ملفات البيان والملفات الأخرى ذات الصلة المنظمة بطريقة مُعرَّفة مسبقًا لتسهيل مشاركة وإعادة استخدام أجزاء من الإعداد المسبق.
	</li>
	<li>
		الصنف Class: تُستخدَم الأصناف في الأداة Puppet لتنظيم الإعداد المسبق بصورة أفضل وتسهيل إعادة استخدام أجزاء من الشيفرة البرمجية كما هو الحال مع لغات البرمجة العادية.
	</li>
	<li>
		الحقائق Facts: المتغيرات العامة التي تحتوي على معلومات حول النظام مثل واجهات الشبكة ونظام التشغيل.
	</li>
	<li>
		الخدمات Services: تُستخدَم لبدء تغييرات حالة الخدمة مثل إعادة تشغيل الخدمة أو إيقافها.
	</li>
</ul>

<p>
	تُكتَب عمليات الإعداد المسبق الخاصة بالأداة Puppet باستخدام لغة المجال المحدَّد Domain Specific Language -أو DSL اختصارًا- المخصَّصة والتي تعتمد على لغة <a href="https://wiki.hsoub.com/Ruby" rel="external">روبي Ruby</a>.
</p>

<h3>
	الموارد Resources
</h3>

<p>
	تُعرَّف المهام أو الخطوات باستخدام الأداة Puppet من خلال التصريح عن الموارد، ويمكن أن تمثل الموارد الحزم والملفات والخدمات والمستخدمين والأوامر، ويكون لها حالة تؤدي إلى بدء تغيير النظام في حالة اختلاف حالة المورد المُصرَّح عنه عن حالته الحالية في النظام، فمثلًا سيؤدي ضبط المورد package على القيمة <code>installed</code> في <a href="https://academy.hsoub.com/devops/deployment/puppet/%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%88%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-puppet-r22/" rel="">ملف البيان</a> إلى بدء تثبيت الحزمة على النظام إن لم مُثبَّتةً مسبقًا.
</p>

<p>
	يكون مورد الحزمة package كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_6" style=""><span class="pln">package </span><span class="pun">{</span><span class="pln"> </span><span class="str">'nginx'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln">  </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'installed'</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكنك تنفيذ أيّ أمر عشوائي من خلال التصريح عن المورد <code>exec</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_8" style=""><span class="pln">exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apt-get update'</span><span class="pun">:</span><span class="pln">
    command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/usr/bin/apt-get update'</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أن الجزء <code>apt-get update</code> في السطر الأول ليس التصريح عن الأمر الفعلي، بل هو معرِّفٌ لهذا المورد الفريد، إذ يجب في أغلب الأحيان الإشارة إلى موارد أخرى من موردٍ ما، ونستخدم معرّفها لذلك، حيث يكون المعرّف في حالتنا هو <code>apt-get update</code>، ولكن يمكن أن يكون أيّ سلسلة نصية أخرى.
</p>

<h3>
	اعتمادية الموارد Resource Dependency
</h3>

<p>
	يجب أن تضع في بالك أن الأداة Puppet لا تقيّم الموارد بترتيب تعريفها نفسه عند كتابة ملفات البيان، ويُعَد ذلك مصدر ارتباك شائع للأشخاص المبتدئين في استخدام الأداة Puppet، إذ يجب أن تعرِّف الموارد اعتماديتها بين بعضها البعض صراحةً، وإلّا فلن يكون هناك ضمان بشأن المورد الذي يجب تقييمه وتنفيذه أولًا.
</p>

<p>
	لنفترض أنك تريد تنفيذ أمرٍ ما، ولكن يجب التأكد من تثبيت الاعتمادية أولًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_10" style=""><span class="pln">package </span><span class="pun">{</span><span class="pln"> </span><span class="str">'python-software-properties'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'installed'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">'add-repository'</span><span class="pun">:</span><span class="pln">
    command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/usr/bin/add-apt-repository ppa:ondrej/php5 -y'</span><span class="pln">
    require </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Package</span><span class="pun">[</span><span class="str">'python-software-properties'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يأخذ الخيار <code>require</code> مرجعًا لمورد آخر بوصفه وسيطًا له، ونشير في هذه الحالة إلى مورد الحزمة Package المُعرَّف بوصفه <code>python-software-properties</code>. لاحظ أننا نستخدم <code>exec</code> و <code>package</code> وغير ذلك للتصريح عن الموارد (بأحرف صغيرة)، بينما نستخدم <code>Exec</code> و <code>Package</code> وغير ذلك (بأحرف كبيرة) عند الإشارة إلى الموارد المُعرَّفة مسبقًا.
</p>

<p>
	لنفترض الآن أنه يجب التأكد من تنفيذ مهمةٍ قبل مهمة أخرى، حيث يمكننا استخدام الخيار <code>before</code> في هذه الحالة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_12" style=""><span class="pln">package </span><span class="pun">{</span><span class="pln"> </span><span class="str">'curl'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'installed'</span><span class="pln">
    before </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Exec</span><span class="pun">[</span><span class="str">'install script'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">'install script'</span><span class="pun">:</span><span class="pln">
    command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/usr/bin/curl http://example.com/some-script.sh'</span></pre>

<h3>
	تنسيق ملف البيان
</h3>

<p>
	تُعَد ملفات البيان مجموعة من تصريحات عن الموارد باستخدام الامتداد <code>‎.pp</code>. يمكنك العثور فيما يلي على مثال لدليل تشغيل Playbook بسيط يؤدي مهمتين هما: تحديث ذاكرة <code>apt</code> المخبئية ثم تثبيت <code>vim</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_14" style=""><span class="pln">exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apt-get update'</span><span class="pun">:</span><span class="pln">
    command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/usr/bin/apt-get update'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

package </span><span class="pun">{</span><span class="pln"> </span><span class="str">'vim'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'installed'</span><span class="pln">
    require </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Exec</span><span class="pun">[</span><span class="str">'apt-get update'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنرى لاحقًا مثالًا واقعيًا أكثر عن ملف البيان بالتفصيل، ولكن سيعطيك القسم التالي نظرة عامة على أهم العناصر والميزات التي يمكن استخدامها لكتابة ملفات بيان Puppet.
</p>

<h2>
	كتابة ملفات البيان
</h2>

<p>
	أصبحت الآن على دراية بالمصطلحات الأساسية والتنسيق العام لملف البيان في Puppet، لذا سنتعرف على بعض ميزات ملف البيان.
</p>

<h3>
	التعامل مع المتغيرات
</h3>

<p>
	يمكن تعريف المتغيرات في أي وقت في ملف البيان، وأكثر أنواع المتغيرات شيوعًا هي السلاسل النصية ومصفوفات السلاسل النصية، والأنواع الأخرى مدعومة أيضًا مثل القيم المنطقية والقيم المُعمَّاة المختصرة Hashes.
</p>

<p>
	يعرّف المثال التالي متغير سلسلة نصية يُستخدَم لاحقًا ضمن موردٍ ما:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_16" style=""><span class="pln">$package </span><span class="pun">=</span><span class="pln"> </span><span class="str">"vim"</span><span class="pln">

package </span><span class="pun">{</span><span class="pln"> $package</span><span class="pun">:</span><span class="pln">
   </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"installed"</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	استخدام الحلقات Loops
</h3>

<p>
	تُستخدم الحلقات عادةً لتكرار مهمة باستخدام قيم دخل مختلفة، فمثلًا يمكنك إنشاء مهمة واحدة واستخدام حلقة لتكرار المهمة مع جميع الحزم المختلفة التي تريد تثبيتها بدلًا من إنشاء 10 مهام لتثبيت 10 حزم مختلفة. أبسط طريقة لتكرار مهمة بقيم مختلفة في Puppet هي باستخدام المصفوفات كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_18" style=""><span class="pln">$packages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'vim'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'git'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'curl'</span><span class="pun">]</span><span class="pln">

package </span><span class="pun">{</span><span class="pln"> $packages</span><span class="pun">:</span><span class="pln">
   </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"installed"</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تدعم الأداة Puppet من الإصدار 4 طرقًا إضافية لتكرار المهام، فمثلًا يطبّق المثال التالي الشيء نفسه الذي طبّقه المثال السابق، ولكن باستخدام المكرِّر <code>each</code>، حيث يمنحك هذا الخيار مزيدًا من المرونة لتكرار تعريفات الموارد:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_20" style=""><span class="pln">$packages</span><span class="pun">.</span><span class="pln">each </span><span class="pun">|</span><span class="typ">String</span><span class="pln"> $package</span><span class="pun">|</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  package </span><span class="pun">{</span><span class="pln"> $package</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"installed"</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	استخدام التعليمات الشرطية
</h3>

<p>
	يمكن استخدام التعليمات الشرطية لتحديد ما إذا كان يجب تنفيذ كتلة من الشيفرة البرمجية أم لا ديناميكيًا بناءً على متغير أو خرج أمرٍ ما. تدعم الأداة Puppet معظم البنى الشرطية التي يمكنك العثور عليها باستخدام لغات البرمجة التقليدية مثل تعليمات <code>if/else</code> و <code>case</code>، وتدعم بعض الموارد مثل <code>exec</code> السمات التي تعمل بوصفها تعليمة شرطية، ولكنها تقبل فقط خرج الأمر بوصفه شرطًا.
</p>

<p>
	لنفترض أنك تريد تنفيذ أمر بناءً على حقيقة Fact، إذ يجب في هذه الحالة استخدام أحد البنى الشرطية المدعومة مثل <code>if/else</code> عندما تريد اختبار قيمة متغير كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_22" style=""><span class="kwd">if</span><span class="pln"> $osfamily </span><span class="pun">!=</span><span class="pln"> </span><span class="str">'Debian'</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 warning</span><span class="pun">(</span><span class="str">'This manifest is not supported on this OS.'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 notify </span><span class="pun">{</span><span class="pln"> </span><span class="str">'Good to go!'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يوجد موقف شائع آخر عندما تريد وضع شرط لتنفيذ أمرٍ ما بناءً على خرج أمرٍ آخر، حيث يمكنك في هذه الحالة استخدام التعليمة <code>onlyif</code> أو <code>unless</code> كما في المثال الآتي، إذ لن يُنفَّذ هذا الأمر إلّا عندما يكون خرج <code>‎/bin/which php</code> ناجحًا، أي أنّ الأمر ينتهي مع الحالة 0:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_24" style=""><span class="pln">exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">"Test"</span><span class="pun">:</span><span class="pln">
 command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"/bin/echo PHP is installed here &gt; /tmp/test.txt"</span><span class="pun">,</span><span class="pln">
 onlyif </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"/bin/which php"</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبالمثل، سينفَّذ الأمر التعليمة <code>unless</code> في جميع الأوقات، إلّا عندما ينتهي الأمر الموجود ضمنها بنجاح:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_26" style=""><span class="pln">exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">"Test"</span><span class="pun">:</span><span class="pln">
 command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"/bin/echo PHP is NOT installed here &gt; /tmp/test.txt"</span><span class="pun">,</span><span class="pln">
 </span><span class="kwd">unless</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"/bin/which php"</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	التعامل مع القوالب
</h3>

<p>
	تُستخدَم القوالب لإعداد ملفات الضبط، مما يسمح باستخدام المتغيرات والميزات الأخرى التي تهدف إلى جعل هذه الملفات أكثر تنوعًا وقابلية لإعادة الاستخدام. تدعم الأداة Puppet تنسيقين مختلفين للقوالب هما: قوالب Puppet المُضمَّنة Embedded Puppet -أو EPP اختصارًا- وقوالب روبي المُضمَّنة Embedded Ruby -أو ERB اختصارًا، ولكن يعمل تنسيق EPP فقط مع الإصدارات الحديثة من الأداة Puppet (بدءًا من الإصدار 4.0).
</p>

<p>
	يوجد فيما يلي مثال على قالب ERB لإعداد مضيف أباتشي Apache الوهمي باستخدام متغير لإعداد المستند الجذر لهذا المضيف:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_5977_28" style=""><span class="tag">&lt;VirtualHost</span><span class="pln"> *:80</span><span class="tag">&gt;</span><span class="pln">
    ServerAdmin webmaster@localhost
    DocumentRoot </span><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@doc_root</span><span class="pln"> %&gt;

    &lt;Directory </span><span class="pun">&lt;%=</span><span class="pln"> </span><span class="lit">@doc_root</span><span class="pln"> %&gt;&gt;
        AllowOverride All
        Require all granted
    </span><span class="tag">&lt;/Directory&gt;</span><span class="pln">
</span><span class="tag">&lt;/VirtualHost&gt;</span></pre>

<p>
	يجب لتطبيق القالب إنشاء المورد <code>file</code> الذي يعرض محتوى القالب باستخدام التابع <code>template</code>، وإليك طريقة تطبيق هذا القالب لاستبدال مضيف أباتشي الوهمي الافتراضي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_30" style=""><span class="pln">file </span><span class="pun">{</span><span class="pln"> </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"present"</span><span class="pun">,</span><span class="pln">
    content </span><span class="pun">=&gt;</span><span class="pln"> template</span><span class="pun">(</span><span class="str">"apache/vhost.erb"</span><span class="pun">)</span><span class="pln"> 
</span><span class="pun">}</span><span class="pln"> </span></pre>

<p>
	تضع الأداة Puppet بعض الافتراضات عند التعامل مع الملفات المحلية لفرض التنظيم والتقسيم إلى وحدات Modularity، حيث ستبحث الأداة Puppet عن ملف قالب <code>vhost.erb</code> ضمن المجلد <code>apache/templates</code> في مجلد وحداتك.
</p>

<h3>
	تعريف وبدء الخدمات
</h3>

<p>
	تُستخدَم موارد الخدمة service للتأكد من تهيئة الخدمات وتفعيلها، وتُستخدَم لبدء إعادة تشغيل الخدمة. لنأخذ مثالنا السابق لاستخدام القالب، حيث ضبطنا مضيف أباتشي الوهمي. إذا أردتَ التأكد من إعادة تشغيل أباتشي بعد تغيير المضيف الوهمي، فيجب أولًا إنشاء مورد خدمة service لخدمة أباتشي. إليك طريقة تعريف هذا المورد في Puppet:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_32" style=""><span class="pln">service </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apache2'</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> running</span><span class="pun">,</span><span class="pln">
    enable </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يجب الآن تضمين الخيار <code>notify</code> لبدء إعادة التشغيل عند تعريف المورد كما يلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_34" style=""><span class="pln">file </span><span class="pun">{</span><span class="pln"> </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"present"</span><span class="pun">,</span><span class="pln">
    content </span><span class="pun">=&gt;</span><span class="pln"> template</span><span class="pun">(</span><span class="str">"vhost.erb"</span><span class="pun">),</span><span class="pln">
    notify </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Service</span><span class="pun">[</span><span class="str">'apache2'</span><span class="pun">]</span><span class="pln"> 
</span><span class="pun">}</span></pre>

<h2>
	مثال عن ملف البيان
</h2>

<p>
	لنلقِ الآن نظرة على ملف البيان الذي سيؤدي إلى أتمتة عملية تثبيت خادم ويب أباتشي على نظام <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%85%D9%86-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A3%D8%A8%D8%B3%D8%B7-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-r575/" rel="">لينكس أوبنتو Ubuntu</a> كما ناقشنا سابقًا. يمكنك العثور على المثال الكامل بما في ذلك ملف القالب لإعداد أباتشي وملف HTML ليخدّمه <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خادم الويب</a> على <a href="https://github.com/erikaheidi/cfmgmt/tree/master/puppet" rel="external nofollow">Github</a>، ويحتوي المجلد على الملف Vagrantfile الذي يتيح لك اختبار ملف البيان في إعداد مبسط باستخدام آلة افتراضية تديرها الأداة Vagrant.
</p>

<p>
	إليك ملف البيان الكامل:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_5977_36" style=""><span class="pln">$doc_root </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/var/www/example"</span><span class="pln">

exec </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apt-get update'</span><span class="pun">:</span><span class="pln">
  command </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'/usr/bin/apt-get update'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

package </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apache2'</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">ensure</span><span class="pln">  </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"installed"</span><span class="pun">,</span><span class="pln">
  require </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Exec</span><span class="pun">[</span><span class="str">'apt-get update'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

file </span><span class="pun">{</span><span class="pln"> $doc_root</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"directory"</span><span class="pun">,</span><span class="pln">
  owner </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"www-data"</span><span class="pun">,</span><span class="pln">
  group </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"www-data"</span><span class="pun">,</span><span class="pln">
  mode </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">644</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

file </span><span class="pun">{</span><span class="pln"> </span><span class="str">"$doc_root/index.html"</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"present"</span><span class="pun">,</span><span class="pln">
  source </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"puppet:///modules/main/index.html"</span><span class="pun">,</span><span class="pln">
  require </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">File</span><span class="pun">[</span><span class="pln">$doc_root</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

file </span><span class="pun">{</span><span class="pln"> </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"present"</span><span class="pun">,</span><span class="pln">
  content </span><span class="pun">=&gt;</span><span class="pln"> template</span><span class="pun">(</span><span class="str">"main/vhost.erb"</span><span class="pun">),</span><span class="pln">
  notify </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Service</span><span class="pun">[</span><span class="str">'apache2'</span><span class="pun">],</span><span class="pln">
  require </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Package</span><span class="pun">[</span><span class="str">'apache2'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

service </span><span class="pun">{</span><span class="pln"> </span><span class="str">'apache2'</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">ensure</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> running</span><span class="pun">,</span><span class="pln">
  enable </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لنتعرّف على كل جزء من ملف البيان السابق بمزيد من التفصيل:
</p>

<ul>
	<li>
		يبدأ ملف البيان في السطر الأول بتعريف المتغير <code>‎$doc_root</code> الذي يُستخدَم لاحقًا في تعريف المورد.
	</li>
	<li>
		ينفّذ المورد exec في الأسطر 3-5 الأمر <code>apt-get update</code>.
	</li>
	<li>
		يثبّت مورد الحزمة package في الأسطر 7-10 الحزمة <code>apache2</code> محدّدًا أن مورد <code>apt-get update</code> مطلوب، مما يعني أنه لن يُنفَّذ إلا بعد تقييم المورد المطلوب.
	</li>
	<li>
		نستخدم مورد الملف file في الأسطر 12-17 لإنشاء مجلد جديد سيكون بمثابة المستند الجذر. يمكن استخدام المورد <code>file</code> لإنشاء مجلدات وملفات، ويُستخدَم لتطبيق القوالب ونسخ الملفات المحلية إلى الخادم البعيد، حيث يمكن تنفيذ هذه المهمة في أيّ مرحلة من الإعداد المسبق، لذلك لم نكن بحاجة إلى ضبط أيّ خيار <code>require</code> هنا.
	</li>
	<li>
		نستخدم مورد ملف file آخر في الأسطر 19-23 لنسخ ملف index.html المحلي إلى المستند الجذر ضمن الخادم، حيث نستخدم المعامل <code>source</code> للسماح لأداة Puppet بمعرفة مكان العثور على الملف الأصلي. تعتمد هذه التسمية على الطريقة التي تتعامل بها Puppet مع الملفات المحلية، فإذا ألقيت نظرة على <a href="https://github.com/erikaheidi/cfmgmt/tree/master/puppet/environments/vagrant/modules/main/files" rel="external nofollow">مستودع المثال على Github</a>، فسترى كيفية إنشاء بنية المجلد للسماح لأداة Puppet بالعثور على هذا المورد، ويجب إنشاء مجلد المستند الجذر قبل تنفيذ هذا المورد، لذا ضمّنا الخيار <code>require</code> الذي يشير إلى المورد السابق.
	</li>
	<li>
		يُستخدَم مورد ملف جديد في الأسطر 25-30 لتطبيق قالب أباتشي وإعلام الخدمة بإعادة التشغيل. نُظِّمت عملية الإعداد المسبق في وحدة تسمى main، لذا يكون مورد القالب هو main/vhost.erb. نستخدم التعليمة <code>require</code> للتأكد من أن مورد القالب template لا يُنفَّذ إلّا بعد تثبيت الحزمة <code>apache2</code>، وإلّا فلن تكون بنية المجلد التي يستخدمها أباتشي موجودة بعد.ص
	</li>
	<li>
		يصرّح مورد الخدمة service في الأسطر 32-35 عن الخدمة <code>apache2</code>، والتي نعلِمها بإعادة التشغيل من المورد الذي يطبّق قالب المضيف الوهمي.
	</li>
</ul>

<h2>
	الخلاصة
</h2>

<p>
	تُعَد الأداة Puppet أداة قوية لإدارة الضبط وتستخدم لغة DSL مُخصَّصة ومعبّرة لإدارة موارد الخادم وأتمتة المهام، وتقدّم لغتها مواردًا متقدمة يمكن أن توفّر مرونة إضافية لضبط إعدادك المسبق، إذ يجب أن تتذكر أن الموارد لا تُقيَّم بترتيب تعريفها نفسه، لذا يجب توخي الحذر عند تحديد الاعتماديات بين الموارد لإنشاء سلسلة التنفيذ الصحيحة.
</p>

<p>
	سنلقي نظرة على الأداة Chef في المقال التالي، وهي أداة قوية أخرى لإدارة الضبط وتستفيد من لغة برمجة روبي Ruby لأتمتة إدارة البنية التحتية والإعداد المسبق.
</p>

<p>
	ترجمة -وبتصرُّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/configuration-management-101-writing-puppet-manifests" rel="external nofollow">Configuration Management 101: Writing Puppet Manifests</a> لصاحبته Erika Heidi.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/" rel="">تنصيب Puppet لإدارة البنية التَّحتِيَّة للخواديم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/puppet/%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B9%D9%86-%D8%A8%D8%B9%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-puppet-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r173/" rel="">الإدارة عن بعد باستخدام Puppet على خواديم أوبنتو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/" rel="">تنصيب Puppet لإدارة البنية التَّحتِيَّة للخواديم</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">691</guid><pubDate>Sat, 01 Apr 2023 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x639;&#x646; &#x628;&#x639;&#x62F; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Puppet &#x639;&#x644;&#x649; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/deployment/puppet/%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%B9%D9%86-%D8%A8%D8%B9%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-puppet-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r173/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_12/ubuntu-server-remote-admin-puppet.png.498cf0048c0f4665d898400f96e5af46.png" /></p>

<p dir="rtl"><strong>Puppet </strong>هو إطار عمل متعدد المنصات يُمكِّن مدراء النظام من إجراء المهام الشائعة باستخدام الكود؛ يمكن أن يقوم الكود بالعديد من المهام، من تثبيت برمجية جديدة إلى التحقق من أذونات الملفات، أو تحديث حسابات المستخدم؛ إن Puppet ليس رائعًا فقط أثناء عملية التثبيت الأساسية للنظام، بل أيضًا أثناء «دورة حياة» النظام بأكملها. يُستخدَم Puppet في معظم الحالات بنمط ضبط «خادوم/عميل».</p><p dir="rtl" style="text-align: center;"><a href="https://academy.hsoub.com/uploads/monthly_2015_12/ubuntu-server-remote-admin-puppet.png.b2dfed7e89dc16f441bf7872de1e9bcd.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="10405" src="https://academy.hsoub.com/uploads/monthly_2015_12/ubuntu-server-remote-admin-puppet.thumb.png.1f18949147e9dbfb5e9a9357d28be9e6.png" class="ipsImage ipsImage_thumbnailed" alt="ubuntu-server-remote-admin-puppet.thumb."></a></p><p dir="rtl">سيغطي هذا الدّرس طريقة تثبيت وضبط Puppet كخادوم/عميل، سيشرح المثال البسيط الآتي طريقة تثبيت خادوم أباتشي باستخدام Puppet.</p><h2 dir="rtl">التثبيت</h2><p dir="rtl">أدخِل الأمر الآتي في طرفية الخادوم لتثبيت Puppet:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install puppetmaster</pre><p dir="rtl">وعلى جهاز أو أجهزة العميل؛ أدخِل الأمر:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo apt-get install puppet</pre><h2 dir="rtl">الضبط</h2><p dir="rtl">قبل ضبط Puppet، ربما عليك إضافة سجل «DNS CNAME» من أجل puppet.example.com، حيث <span style="font-family:courier new,courier,monospace;">example.com</span> هو النطاق الخاص بك؛ حيث يتحقق عملاء Puppet من سجل DNS للنطاق <span style="font-family:courier new,courier,monospace;">puppet.example.com</span> كاسم خادوم Puppet، أو «Puppet Master»؛ وسنشرح خدمة أسماء النطاق (DNS) في درسٍ لاحقٍ في هذه السلسلة.</p><p dir="rtl">إذا لم تشأ أن تستخدم DNS، فبإمكانك إضافة قيود إلى ملف <span style="font-family:courier new,courier,monospace;">‎/etc/hosts </span>في الخادوم والعميل. على سبيل المثال، أضِف ما يلي في ملف <span style="font-family:courier new,courier,monospace;">‎/etc/hosts</span> على خادوم Puppet:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">127.0.0.1 localhost.localdomain localhost puppet
192.168.1.17 puppetclient.example.com puppetclient</pre><p dir="rtl">وأضِف قيدًا للخادوم على كل عميل Puppet:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">192.168.1.16 puppetmaster.example.com puppetmaster puppet</pre><p dir="rtl">ملاحظة: استبدل عناوين IP الموجودة في المثال السابق بعناوين IP لخادومك وعملائك.</p><p dir="rtl">لنهيّء الآن بعض الموارد من أجل حزمة <span style="font-family:courier new,courier,monospace;">apache2</span>، أنشئ الملف <span style="font-family:courier new,courier,monospace;">‎/etc/puppet/modules/apache2 ‎/manifests/init.pp</span> الذي يحتوي الآتي:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">class apache2 { 
  package { 'apache2': 
    ensure =&gt; installed, 
  } 
  
  service { 'apache2': 
    ensure =&gt; true, 
    enable =&gt; true, 
    require =&gt; Package['apache2'], 
  } 
}</pre><p dir="rtl">أنشئ الآن الملف<span style="font-family:courier new,courier,monospace;"> ‎/etc/puppet/manifests/site.pp</span> الذي يحتوي على:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">node 'pupetclient.example.com' {
  include apache2 
}</pre><p dir="rtl"><strong>ملاحظة:</strong> استبدل <span style="font-family:courier new,courier,monospace;">pupetclient.example.com</span> باسم مضيف عميل Puppet الحقيقي.</p><p dir="rtl">الخطوة النهائية لخادوم Puppet البسيط هي إعادة تشغيل العفريت:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service puppetmaster restart</pre><p dir="rtl">لقد أتممنا ضبط خادوم Puppet، حان الآن الوقت لضبط العميل.</p><p dir="rtl">أولًا، اضبط عفريت Puppetagent لكي يعمل، أي عدِّل ملف <span style="font-family:courier new,courier,monospace;">‎/etc/default/puppet</span> مغيّرًا <strong>START</strong> إلى <strong>yes</strong>:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">START=yes</pre><p dir="rtl">ثم ابدأ تشغيل الخدمة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo service puppet start</pre><p dir="rtl">واعرض بصمة (fingerprint) شهادة العميل:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo puppet agent --fingerprint</pre><p dir="rtl">وبالعودة إلى خادوم Puppet، اعرض طلبات توقيع الشهادات:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo puppet cert list</pre><p dir="rtl">وفي خادوم Puppet، تأكد من بصمة العميل ووقِّع على شهادة العميل بكتابة:</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo puppet sign pupetclient.example.com</pre><p dir="rtl">وفي عميل Puppet، شغِّل برنامج puppet يدويًا في الأمامية (foreground)؛ هذه الخطوة ليست مطلوبة لكنها أفضل طريقة لاختبار وتنقيح عمل خدمة puppet.</p><pre data-pbcklang="html" data-pbcktabsize="4" class="html ipsCode prettyprint">sudo puppet agent --test</pre><p dir="rtl">راجع<span style="font-family:courier new,courier,monospace;"> ‎/var/log/syslog</span> لأيّة أخطاء بالضبط؛ إذا جرى كلُ شيءٍ على ما يرام، فستُثبَّت حزمة <span style="font-family:courier new,courier,monospace;">apache2</span> وجميع اعتمادياتها على عميل Puppet.</p><p dir="rtl"><strong>ملاحظة:</strong> هذا المثال بسيطٌ جدًا، ولا يُظهِر العديد من ميزات ومحاسن Puppet؛ راجع القسم المصادر التالية للمزيد من المعلومات .</p><h2 dir="rtl"><a rel="external nofollow" name="6.2.3.%D9%85%D8%B5%D8%A7%D8%AF%D8%B1%7Coutline"></a>مصادر</h2><ul dir="rtl"><li>توثيق موقع <a rel="external nofollow" href="http://docs.puppetlabs.com/">Puppet</a> الرسمي.</li><li>راجع أيضًا كتاب «<a rel="external nofollow" href="http://www.apress.com/9781430230571">Pro Puppet</a>».</li><li>مصدر آخر لمعلوماتٍ إضافية هو صفحة ويكي أوبنتو «<a rel="external nofollow" href="https://help.ubuntu.com/community/Puppet">Puppet</a>»</li></ul><p>ترجمة -وبتصرف- للمقال <a rel="external nofollow" href="https://help.ubuntu.com/lts/serverguide/puppet.html">Ubuntu Server Guide: Puppet</a>.</p>
]]></description><guid isPermaLink="false">173</guid><pubDate>Mon, 28 Dec 2015 22:44:07 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; Foreman &#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x646;&#x642;&#x627;&#x637; Puppet &#x639;&#x644;&#x649; &#x627;&#x644;&#x62E;&#x627;&#x62F;&#x648;&#x645; Ubuntu 14.04</title><link>https://academy.hsoub.com/devops/deployment/puppet/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-foreman-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%86%D9%82%D8%A7%D8%B7-puppet-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r32/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_04/Foreman_480x300.jpg.c183e86dba8edd3c772c4dd8e1862be4.jpg" /></p>

<p style="line-height: 24.8888893127441px;">هذا المقال هو الجزء الثّالث من سلسلة <a style="line-height: 24.8888893127441px;" href="http://academy.hsoub.com/search/?tags=%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85+puppet+%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85">استخدام puppet لإدارة الخواديم</a> التي تتكوّن من كل من:</p><ul style="line-height: 24.8888893127441px;"><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/">تنصيب Puppet لإدارة البنية التَّحتِيَّة للخواديم</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%88%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-puppet-r22/">ملفّات البيان (Manifests) والوحدات (Modules) في Puppet</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-foreman-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%86%D9%82%D8%A7%D8%B7-puppet-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r32/">كيف تستخدم Foreman لإدارة نقاط Puppet على الخادوم Ubuntu 14.04</a></li></ul><h2 id="كيف-تستخدم-foreman-لإدارة-نقاط-puppet-على-الخادوم-ubuntu-1404">مُقدمة</h2><p>Foreman هي أحد الأدوات مَفتوحة المَصدر، والّتي تُستخدم في إدارة الخواديم، وذلك بتوفير طريقة سهلة ومرنة في العمل جنبًا إلى جنبٍ مع الأداة Puppet (أو Chef) وذلك بهدف أتمتة المهام ونشر التطبيقات، وهي مناسبة لكافة أحجام البُنى التَّحْتِيَّة، وتعمل على معظم توزيعات <code>لينكس</code>. تُقدّم هذه التسهيلات عبر توفير واجهة ويب، وAPI، وبالإضافة إلى أوامر الطرفية CLI، مما يجعل الإعداد المُسبق <code>provisioning</code> ومُراقبة الخواديم أسهل من أي وقتٍ مضى.</p><p>سيتناول هذا الشرح كيفيّة تنصيب الأداة <code>Foreman</code> مع الأداة <code>Puppet</code>، واستخدامها في إدارة الخواديم. سيتمّ استغلال <code>Foreman</code> في قدرتها على إصدار التقارير وميزة External Node Classifier والّتي يُشار إليها بالاختصار (ENC)، بهدف تسهيل إدارة الأداة Puppet.</p><h2 id="متطلبات-بيئة-العمل-2">مُتَطَلَّبات بيئة العمل</h2><p>سيتمّ تنصيب الأداة <code>Foreman</code> على خادوم جديد، يحمل الاسم “foreman”، وسيُمثل خادومًا مَركزيًّا آخر للأداة Puppet. يُمكن تنصيب الأداة <code>Foreman</code> على الخادوم المَركزيّ الحالي، ولكن يجب التنبه هنا إلى أنّه سيتمّ استبدال ملف البيان الافتراضيّ <code>site.pp</code> بمَلفّ جديد، وذلك من شأنه أنّ يُلغي العلاقة بين العُملاء الحاليين والخادوم المَركزيّ، ويُمكن تجاوز ذلك بالإعداد مرّة أخرى ليُدير الخادوم <code>Foreman</code> نقاط العُملاء هذه Puppet agent nodes</p><p>تَعتمد الأداة Foreman على الأداة Puppet بشكل كبير لإدارة إعدادات العُملاء، ولذلك فمن الضروريّ توفّر الأمور التّالية قبل البدء بتطبيق محتويات هذا الشرح:</p><ul><li><strong>صلاحيّة وصول كامل:</strong> بالاستعانة بالأمر <code>sudo</code> يُمكن عمل كافّة التغيرات المطلوبة.</li><li><strong>خدمة DNS على الشبكة الخاصّة:</strong> إعداد خدمة DNS لترجمة أسماء الخواديم إلى IPs أي (Forward DNS lookup)، وترجمة الـIPs إلى أسماء الخواديم أي (reverse DNS lookup)، ويَجب على كل خادوم أنّ يَمتلك اسمًا فريدًا خاصًا به على مستوى الشبكة الداخلية. يُمكن الرجوع إلى الشرح الخاصّ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04">كيفية إعداد خادوم DNS في الشبكة الخاصّة</a>. في حال عدم توفّر خادوم DNS، فيُمكن استخدام الملف <code>hosts</code> لترجمة العناوين.</li><li><strong>إعداد الجدار الناري firewall:</strong> من الضروريّ الوصول إلى الخادوم المَركزيّ الخاصّ بالأداة Puppet عبر المنفذ 8140، ولذلك يجب التأكد من عدم منع الجدار الناري لهذا المنفذ. يُمكن الاستعانة بالشرح التّالي لمعرفة <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server">كيفية السماح بالطلبات الواردة باستخدام UFW</a>.</li></ul><p>بعد إتمام المُتَطَلَّبات السابقة من المُمكن الآن الانتقال إلى إنشاء الخادوم Foreman والذي سيكون بنفس الوقت هو خادوم مَركزيّ Puppet master.</p><h2 id="إنشاء-خادوم-foreman">إنشاء خادوم Foreman</h2><p>سيتمّ إنشاء خادوم جديد يعمل بالتوزيعة Ubuntu 14.04 x64، ويحمل اسم المجال المؤهل بالكامل “foreman.nyc2.example.com”، وإعداد خادوم DNS بناءً على هذا الاسم.</p><p>يُمكن الرُجوع إلى القسم الخاصّ بـ <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04#MaintainingDNSRecords">صيانة سجلات DNS</a> في حال عدم توفّر المَعرفة لفعل ذلك. في حقيقة الأمر كل ما يجب عمله هو إضافة سجلّين الأول من نوع “A” والثاني من نوع “PRT”، والسماح للعميل الجديد بعمل استعلامات دوريّة <code>recursive queries</code>، وأيضًا يجب التأكد من إعداد DNS لترجمة أسماء الخواديم من دون استخدام “اسم النطاق المُؤهل بالكامل” Fully Qualified Domain Name</p><h3 id="التأكد-من-أن-اسم-الخادوم-هو-اسم-المجال-المؤهل-بالكامل">التأكّد من أنّ اسم الخادوم هو اسم المجال المؤهل بالكامل:</h3><p>لمعرفة اسم الخادوم الكامل FQDN يُمكن استخدام الأمر التّالي</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">hostname –f</pre><p>الأمر السابق يجب أنّ يَعرض اسم المجال المؤهل بالكامل الخاصّ بالخادوم أي “foreman.nyc2.example.com”، وفي حال عرض اسم فقط أي “foreman” فيجب إجراء التعديلات التالية:</p><ul><li>تحرير الملف <code>hosts</code> ليُشير السجل 127.0.0.1 إلى اسم المجال الكامل.</li></ul><p>سيتمّ استخدام المُحرر Vi:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo vi /etc/hosts</pre><p>السجل سيكون بالشكل التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">127.0.1.1       foreman</pre><p>ليُعدّل ويصبح بالشكل التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">127.0.1.1       foreman.nyc2.example.com foreman</pre><ul><li>تحرير الملف <code>hostname</code></li></ul><p>سيتمّ تحرير المَلفّ الخاصّ باسم الخادوم:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo vi /etc/hostname</pre><p>يجب التأكد من أنّ الاسم هو اسم المجال الكامل:<br> </p><pre data-pbcklang="php" data-pbcktabsize="4" class="php ipsCode prettyprint">“foreman.nyc2.example.com”</pre><p>ولتطبيق التعديلات بشكل مُباشر وآني يُمكن تنفيذ الأمر التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo hostname --file /etc/hostname</pre><h2 id="تنصيب-الأداة-foreman">تنصيب الأداة Foreman</h2><p>سيتمّ استخدم المُنصب الخاصّ بالأداة Foreman، فهو أسهل طريقة لتنصيب هذه الأداة مع المُكونات الخاصّة بها، مع إعدادات افتراضيّة تسمح لنا بالعمل بشكل أسرع مع الأداة، وذلك بتوفير العناصر التّالية:</p><ul><li>تنصيب الأداة Foreman</li><li>تنصيب الأداة Puppet</li><li>خادوم الويب Apache مع SSL والوحدة Passenger</li></ul><p>سيتمّ في البداية إضافة مستودع Foreman:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo sh -c 'echo "deb http://deb.theforeman.org/ trusty 1.5" &gt; /etc/apt/sources.list.d/foreman.list'
sudo sh -c 'echo "deb http://deb.theforeman.org/ plugins 1.5" &gt;&gt; /etc/apt/sources.list.d/foreman.list'
wget -q http://deb.theforeman.org/pubkey.gpg -O- | sudo apt-key add –</pre><p>تحميل المُنصب:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo apt-get update &amp;&amp; sudo apt-get install foreman-installer</pre><p>قبل تشغيل المُنصب يجب التأكد من أنّ الأمر <code>ping $(hostname –f)</code> يُظهر العنوان الحقيقي للخادوم وليس العنوان 127.0.0.1</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/ping.png.d4f76a04fda144fc84526a4795e68225.png"><img data-fileid="1445" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/ping.thumb.png.c0a50483958a312802d162bbe1a9e367.png"></a></p><p>تشغيل المُنصب:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo foreman-installer</pre><p>الأمر السابق يعرض مُخرجات output كما في التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">Your puppet version does not support progress bar
Preparing installation Done
  Success!
  * Foreman is running at https://foreman.nyc2.example.com
      Default credentials are 'admin: hzdQZPZ97KJ32BKn '
  * Foreman Proxy is running at https://foreman.nyc2.example.com:8443
  * Puppetmaster is running at port 8140
  The full log is at /var/log/foreman-installer/foreman-installer.log</pre><p>تدلّ السطور السابقة على استكمال تنصيب الأداة بشكل صحيح. كما تعرض بيانات الدخول المُستخدمة مع واجهة الويب.</p><h3 id="تفعيل-diffs">تفعيل Diffs</h3><p>يَسمح تفعيل الخيار “diffs” لمُدير النظام باستعراض تغييرات مَلفّ الإعدادات على شكل تقرير ضِمن الأداة Foreman Reports.</p><p>ولتفعيل هذه الميزة سيتمّ تحرير المَلفّ <code>puppet.conf</code>:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo vi /etc/puppet/puppet.conf</pre><p>وتغيير قيمة الخيار <code>show_diff</code> إلى <code>true</code>:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">    show_diff     = true</pre><h3 id="إضافة-الخادوم-foreman-إلى-قاعدة-البيانات">إضافة الخادوم Foreman إلى قاعدة البيانات</h3><p>يَقوم الأمر <code>puppet agent</code> بإضافة الخادوم “foreman” إلى قاعدة البيانات الخاصّة بالأداة Foreman، وبذلك يكون الخادوم “foreman” أول عميلٍ خاصّ بالأداة Foreman، وتتمّ إدارته من قبلها.</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo puppet agent –test</pre><h2 id="تسجيل-الدخول-باستخدام-واجهة-الويب">تسجيل الدخول باستخدام واجهة الويب</h2><p>يجب في بداية الأمر الدخول وتغير كلمة المرور الخاصّة بحساب المُدير admin، حيثُ يُمكن الوصول لواجهة الويب عن طريق الشبكة العامّة public network الخاصّة بالخادوم الافتراضيّ الخاصّ VPS، إما عن طريق اسم المجال المؤهل بالكامل أو عنوان الـIP public network.</p><p>يَستخدم Foreman بشكل افتراضيّ شهادات الأداة Puppet، والّتي على الأغلب لن تكون مَوثوقة بالنسبة للمُتصفح. يُمكن تجاهل التحذير الخاص بالمُتصفح في الوقت الحالي، أو يُمكن استبدال الشهادة الحالية بأُخرى تُطابق اسم المجال ومُوقعة من قبل مُفوّض شهادات مَوثوق (trusted CA authority). بغض النظر عن الطريقة المُتبعة في الاستمرار ستكون صفحة تسجيل الدخول على الشكل التّالي:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-loging-web-interface.png.80dcf94db562353ce38cb58bf8ae0015.png"><img data-fileid="1446" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-loging-web-interface.thumb.png.6fa3301be696fa4a7009184556d215ae.png"></a></p><p>عند تنصيب الأداة Foreman بالأمر <code>foreman-installer</code> كانت بيانات الدخول الافتراضيّة على الشكل التّالي، والّتي سيتمّ استخدامها لتسجيل الدخول:</p><ul><li><strong>اسم المُستخدم:</strong> admin</li><li><strong>كلمة المُرور:</strong> hzdQZPZ97KJ32BKn</li></ul><h3 id="لوحة-المعلومات-المختصرة-الخاصة-بالأداة-foreman">لوحة المعلومات المُختصرة الخاصّة بالأداة Foreman</h3><p>يُظهر تسجيل الدخول مُباشرةً لوحة التحكم، ويُعرض من خلالها نظرة شاملة على بيئة عمل Puppet، حيثُ يوجد مُلَخَّص يُسمى “حالة إعدادات المُضيف” (Host Configuration Status)، والذي يَعرض عدد نقاط العُملاء (Puppetagent nodes) وحالة كلٍ منها. يُظهر المُلَخَّص الحالي خادوم وحيد وذلك في القسم “good host”.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/dashboard-foreman.png.9920728b31fb620211b0ed528f1a8a38.png"><img data-fileid="1447" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/dashboard-foreman.thumb.png.81198a839131a5bb37421887706cee1c.png"></a></p><p>يوجد في الجانب الأسفل من المُلَخَّص السابق مُلَخَّص آخر للأحداث الأخيرة، ورسمٌ بيانيٌ مع عدد العُملاء الّتي قامت بعمل اتصال في الثلاثين دقيقة الأخيرة. تُقدّم هذه المعلومات لمحة عامّة وشاملة عن عمل منظومة Puppet.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-events.png.def065f4810736f095c9bfa2c6ee5e5c.png"><img data-fileid="1448" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-events.thumb.png.882d3524a0688f04aaec570d648d28c8.png"></a></p><p>كما ستكون لوحة المعلومات على الشكل التّالي عند وجود أي خطأ:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-error.png.394f576763b38c183abe461fec9ff333.png"><img data-fileid="1449" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-error.thumb.png.3aac36eaff488921c94badd62c4e38c2.png"></a></p><h2 id="تغيير-كلمة-مرور-حساب-المدير-admin-password">تغيير كلمة مرور حساب المُدير Admin Password</h2><p>تمّت الإشارة سابقًا إلى ضرورة تغيير كلمة مُرور حساب المُدير <code>admin</code> ولعمل ذلك يجب التوجّه إلى “Admin User” في الزاوية العلوية من جهة اليمين والنقر على “My account”:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-my-account.png.1766d52e1cad6e92cf959598e1aab7b6.png"><img data-fileid="1450" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-my-account.thumb.png.4dc169776a874837288478749fc9c8b9.png"></a></p><p>ومنها إلى النماذج واختيار الكلمة المناسبة.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-password.png.5d0b178fafd642241ab4d0b4dcb8c168.png"><img data-fileid="1464" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-password.thumb.png.24684277bff3558f717fa71818ebcdf7.png"></a></p><h2 id="إضافة-خدمة-مزامنة-الوقت-ntp-إلى-foreman">إضافة خدمة مُزامنة الوقت NTP إلى Foreman</h2><p>تتطلّب Puppet الحفاظ على دقةٍ وانسجامٍ في الوقت بين الخواديم، ولهذا سوف يُستخدم Foreman لإدارة خدمة NTP على المُضيف “foreman” والذي هو بنفس الوقت Puppet master.</p><p>يُمكن التوجّه إلى <a rel="external nofollow" href="https://forge.puppetlabs.com/">https://forge.puppetlabs.com</a> والبحث عن الوحدة NTP لمعرفة المزيد عنها وماتُقدمه، والّتي ستكون بالاسم <code>puppetlabs/ntp</code>.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/puppet-forge.png.9c775faa5326f75cd206c951b4458713.png"><img data-fileid="1451" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/puppet-forge.thumb.png.eb95802f3b81446285523ef7437456e7.png"></a></p><p>سيتمّ تنصيب الأداة NTP البيئة “production” الخاصّة بالأداة Puppet master وذلك عبر الأمر التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo puppet module install -i /etc/puppet/environments/production/modules puppetlabs/ntp</pre><p>من المُفترض عرض مخرجات كما في التّالي والتي تدل على تنصيب الوحدة module بشكل صحيح:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">Notice: Preparing to install into /etc/puppet/environments/production/modules ...
Notice: Downloading from https://forge.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/environments/production/modules
└─┬ puppetlabs-ntp (v3.1.2)
  └── puppetlabs-stdlib (v4.3.2)</pre><p>قد تمّ تنصيب الوحدة على Puppet master، ولكن يجب إضافتها إلى الأداة Foreman قبل أنّ يُصبح بالإمكان استخدامها.</p><p>في واجهة الويب الخاصّة بالأداة Foreman، ومن القائمة “configure” والاختيار “puppet classes”:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-puppet-classes.png.62aef38120be366979a95162e0b8f17b.png"><img data-fileid="1452" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-puppet-classes.thumb.png.7b6ceb0379d90b41cabca4d834c85ec7.png"></a></p><p>سيتمّ النقر على الزر “Import from foreman.nyc2.example.com”:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-import-puppet-class.png.edbb447ff6977a2cdd8919303c6d070b.png"><img data-fileid="1453" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-import-puppet-class.thumb.png.349d10a2b9abd6cd72b3d97e9837e313.png"></a></p><p>ومن ثمّ اختيار بيئة العمل “production”، ثُمّ الضغط على الزر “update”، وبذلك تكون الوحدة ntp مُستوردة imported داخل الأداة <code>Foreman</code>، وجاهزة للاستخدام.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-change-enviroment.png.4b5d9dc87a0cae9fb0e09d96fcf83f4d.png"><img data-fileid="1454" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-change-enviroment.thumb.png.0520f208874bc67869231aebddf7cd9c.png"></a></p><h2 id="الاستغناء-عن-الإعدادات-الافتراضية-للأداة-ntp">الاستغناء عن الإعدادات الافتراضيّة للأداة NTP</h2><p>من الجيّد اختيار إعدادات مُخصّصة بدلًا من الافتراضيّة للأداة NTP لتوافق الموقع الجغرافي للخواديم الخاصّة بنا، ويُمكن الرجوع إلى <a rel="external nofollow" href="http://www.pool.ntp.org/en/">صفحة المشروع</a> لاختيار الخيار الأنسب.</p><p>في الصفحة السابقة وهي “Puppet Classes”، وبعد الضغط على الصنف “ntp”، سيتمّ الانتقال إلى وضع التحرير، ومنه إلى التبويب “Smart Class Parameter”</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-smart-class.png.886048aaff56b67173432b6692241fd8.png"><img data-fileid="1455" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-smart-class.thumb.png.b0f8df0f8ebe7d164a03b8f09752de70.png"></a></p><p>وبعد التدرّج بالصفحة إلى الأسفل يوجد اختيار بالاسم “servers” في الشريط الجانبيّ</p><p>بعد اختيار “servers”، سيتمّ اختيار “Override”، وذلك لكتابة الإعدادات المُخصّصة. بعد ذلك سيتمّ اختيار نوع المُعامل ليكون على شكل مصفوفة array، وبعد ذلك سيتمّ تغيير القيمة الافتراضيّة إلى القيم المُخصّصة، وذلك على شكل مصفوفة.</p><p style="text-align: center;"><img data-fileid="o_19jl2bk121si1c2em1aqqm1epk2i" class="ipsImage ipsImage_thumbnailed" src=""><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-ntp-settings.png.5f6e1b40fe08811ea0b268ebbf26302b.png"><img data-fileid="1456" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-ntp-settings.thumb.png.1956852b7b5ef05b49661e67538f17ba.png"></a></p><p> </p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">["0.us.pool.ntp.org","1.us.pool.ntp.org","2.us.pool.ntp.org","3.us.pool.ntp.org"]</pre><p>أصبح من المُمكن تطبيق الإعدادات وذلك بالضغط على “Submit”. بعد تطبيق الإعدادات المُخصّصة فإن أي عميل يستخدم هذه الوحدة ستكون هذه الإعدادات المُخصّصة هي الافتراضيّة الخاصّة به.</p><h2 id="إعداد-foreman-ليستخدم-الوحدة-ntp">إعداد Foreman ليستخدم الوحدة NTP</h2><p>أصبح الآن من المُمكن استخدام الوحدة NTP في إدارة الأداة NTP على المُضيف Foreman.</p><p>من القائمة “Hosts”، ومن ثمّ الاختيار “ALL Hosts”، ومن ثمّ زر التحرير “Edit” على الجانب الأيمن.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-edit-host.png.874938e3313307632b463b07b0af8dce.png"><img data-fileid="1457" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-edit-host.thumb.png.7d49296e267d991bf37134c27ddb222c.png"></a></p><p> </p><p>من التبويب “puppet classes”، ومن القسم الخاصّ بالأصناف المُتاحة، سيتمّ الضغط على الصنف “ntp” لتوسيعه، بعد ذلك سيتمّ الضغط على إشارة الزائد (+) الّتي بجانب الخيار “ntp”.</p><p style="text-align: center;"><img data-fileid="o_19jl2cag0akq16hgr2o1i1ri982s" class="ipsImage ipsImage_thumbnailed" src=""><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-add-class.png.cc74f24197f7652434da06fb2524d2bf.png"><img data-fileid="1458" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-add-class.thumb.png.b8406ecdd82bb74a60d0be51a640b972.png"></a></p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-include-class.png.a0f5146cae35a3945bffb99094ef3d40.png"><img data-fileid="1459" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-include-class.thumb.png.d74fc983bc6da4ada1a64cc773278962.png"></a></p><p>سينتقل الصنف “ntp” بعد الضغط على إشارة الزائد إلى القسم الخاصّ بالأصناف المُدرجة. بذلك ستُطبّق هذه الوحدة على العُملاء عند اتصالها مع الخادوم المَركزيّ، ولتطبيق الإعدادات سيتمّ الضغط على “submit”.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-submit.png.dc33a8bb644df8419334c15fce54d998.png"><img data-fileid="1460" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-submit.thumb.png.de3e2989ef87df75ee4fc614471e457a.png"></a></p><h2 id="استعراض-إعدادات-puppet">استعراض إعدادات Puppet</h2><p>بعد الانتهاء من إعداد المُضيف السابق والضغط على زر “الإرسال”، سيتمّ الانتقال التلقائي إلى صفحة مُلخّص المُضيف.</p><p>ولرؤية المعلومات الّتي تمّ تطبيقها على العميل عند الاتصال بالخادوم المَركزيّ، يُمكن الضغط على زر “YAML”.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-yaml.png.ecfe7c92db120c4ebbe0f29085bb15ca.png"><img data-fileid="1461" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-yaml.thumb.png.912a4331e64373f0537b7f351f89e626.png"></a></p><p>لتُعرض المعلومات على الشكل التّالي:</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">---
classes:
  ntp:
    server_list:
    - 0.us.pool.ntp.org
    - 1.us.pool.ntp.org
    - 2.us.pool.ntp.org
    - 3.us.pool.ntp.org
parameters:
  puppetmaster: foreman.nyc2.example.com
  root_pw: 
  foreman_env: production
  owner_name: Admin User
  owner_email: root@nyc2.example.com
environment: production</pre><h2 id="تشغيل-عميل-puppet">تشغيل عميل Puppet</h2><p>سيتمّ تطبيق التغييرات السابقة الآن، ودون الحاجة للانتظار للاتصال التّالي، ولذلك سيتمّ تشغيل نسخة العميل من الأداة Puppet على الخادوم Foreman.</p><pre data-pbcklang="php" data-pbcktabsize="" class="php ipsCode prettyprint">sudo puppet agent –test</pre><p>بهذا يكون قد تمّ استخدام الأداة Foreman لإعداد الخادوم “foreman”، وإنّ إعداد بقية خواديم العُملاء هو مُشابه تمامًا لما تمّ عمله مع الخادوم “foreman”.</p><h2 id="إضافة-عملاء-جدد-إلى-foreman">إضافة عُملاء جُدد إلى Foreman</h2><p>الآن بعد أنّ انتهى إعداد الخادوم <code>Foreman</code>، أصبح بالإمكان إضافة المزيد من hosts لتصبح مُدارة من قبل الأداة <code>Foreman</code>، وطريقة الإضافة هي نفس طريقة إضافة نقاط عُملاء Puppet إلى الخادوم المَركزيّ. يتوفّر المزيد من التفاصيل في [الجزء الأول](رابط الجزء الأول) من هذه السلسلة. مع الانتباه إلى ربط العُملاء مع الخادوم المَركزيّ للأداة Puppet (وهو الخادوم Foreman في نفس الوقت).</p><p>يجب توقيع الشهادة الخاصّة بكل عميل على الخادوم <code>Foreman</code>، ويتمّ ذلك عبر سطر الأوامر، كما تمّ الأمر مع إعداد Puppet، أو من المُمكن استخدام واجهة الويب الخاصّة بالأداة <code>Foreman</code>.</p><p>يُمكن استخدام واجهة الويب لتوقيع الشهادات من الصفحة “smart proxy” والاختيار “Certificates”.</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-smart-proxy.png.7b8ac2b48cee9fff36863072e55b4933.png"><img data-fileid="1462" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-smart-proxy.thumb.png.77cb7694e204f36aefbc7506d4194d28.png"></a></p><p>أو بالإمكان حذف شهادة عميل حاليّة:</p><p style="text-align: center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-delete-cert.png.3121e424fc07ceffeb448bbf5e63341a.png"><img data-fileid="1463" class="ipsImage ipsImage_thumbnailed" src="https://academy.hsoub.com/uploads/monthly_2015_04/foreman-delete-cert.thumb.png.c6a5958d0fef9d7f84e012865aec13b4.png"></a></p><h2 id="الختام">الخاتمة</h2><p>الآن وبعد أنّ تمّ بناء خادوم Foreman، أصبح من المُمكن استخدام الوحدات الخاصّة بالأداة Puppet على مستوى مُتقدم من الفعاليّة لإدارة الخواديم على مستويات متعددة وفي كامل البِنيَة التَّحتيَّة، ومن المُستحسن الآن استعراض المزيد من الوحدات المُتوفّرة على مُجتمع Puppet، أو حتّى كتابة وحدة جديدة مخصّصة لُتلبي احتياجات مُعيّنة.</p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-use-foreman-to-manage-puppet-nodes-on-ubuntu-14-04">How To Use Foreman To Manage Puppet Nodes on Ubuntu 14.04</a> لصاحبه <a rel="external nofollow" href="https://twitter.com/thisismitch">Mitchell Anicas </a></p>
]]></description><guid isPermaLink="false">32</guid><pubDate>Fri, 24 Apr 2015 06:39:00 +0000</pubDate></item><item><title>&#x645;&#x644;&#x641;&#x651;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646; (Manifests)  &#x648;&#x627;&#x644;&#x648;&#x62D;&#x62F;&#x627;&#x62A; (Modules) &#x641;&#x64A; Puppet</title><link>https://academy.hsoub.com/devops/deployment/puppet/%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%88%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-puppet-r22/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/puppet_480x300.png.13d4128897183b54ec8fbb06f68b0cdf.png" /></p>
<p>&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1602;&#1575;&#1604; &#1607;&#1608; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610; &#1605;&#1606; &#1587;&#1604;&#1587;&#1604;&#1577; <a style="line-height: 24.8888893127441px;" href="http://academy.hsoub.com/search/?tags=%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85+puppet+%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85">&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; puppet &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1610;&#1605;</a>&nbsp;&#1575;&#1604;&#1578;&#1610; &#1578;&#1578;&#1603;&#1608;&#1617;&#1606; &#1605;&#1606; &#1603;&#1604; &#1605;&#1606;:</p><ul style="line-height: 24.8888893127441px;"><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/">&#1578;&#1606;&#1589;&#1610;&#1576; Puppet &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1576;&#1606;&#1610;&#1577; &#1575;&#1604;&#1578;&#1617;&#1614;&#1581;&#1578;&#1616;&#1610;&#1617;&#1614;&#1577; &#1604;&#1604;&#1582;&#1608;&#1575;&#1583;&#1610;&#1605;</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%88%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-puppet-r22/">&#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; (Manifests) &#1608;&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; (Modules) &#1601;&#1610; Puppet</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-foreman-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%86%D9%82%D8%A7%D8%B7-puppet-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r32/">&#1603;&#1610;&#1601; &#1578;&#1587;&#1578;&#1582;&#1583;&#1605; Foreman &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1606;&#1602;&#1575;&#1591; Puppet &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1608;&#1605; Ubuntu 14.04</a></li></ul><h2>&#1605;&#1615;&#1602;&#1583;&#1605;&#1577;</h2><p>&#1576;&#1593;&#1583; &#1573;&#1578;&#1605;&#1575;&#1605; <a href="http://academy.hsoub.com/devops/deployment/puppet/-r16/">&#1573;&#1593;&#1583;&#1575;&#1583; &#1605;&#1606;&#1592;&#1608;&#1605;&#1577; Puppet &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1593;&#1578;&#1605;&#1583; &#1593;&#1604;&#1609; &#1605;&#1601;&#1607;&#1608;&#1605; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; &#1608;&#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569;</a>&#1548; &#1571;&#1589;&#1576;&#1581; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1604;&#1575;&#1574;&#1605; &#1575;&#1604;&#1570;&#1606; &#1575;&#1604;&#1578;&#1591;&#1585;&#1617;&#1602; &#1573;&#1604;&#1609; &#1570;&#1604;&#1610;&#1617;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; modules &#1608;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifests&#1548; &#1608;&#1604;&#1603;&#1610; &#1578;&#1615;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1577; Puppet &#1576;&#1575;&#1604;&#1588;&#1603;&#1604; &#1575;&#1604;&#1571;&#1605;&#1579;&#1604;&#1548; &#1610;&#1580;&#1576; &#1601;&#1607;&#1605; &#1576;&#1606;&#1610;&#1577; &#1571;&#1608;&#1578;&#1585;&#1603;&#1610;&#1576;&#1577; &#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1608;&#1593; &#1605;&#1606; &#1575;&#1604;&#1605;&#1604;&#1601;&#1575;&#1578;. &#1587;&#1608;&#1601; &#1610;&#1578;&#1606;&#1575;&#1608;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1571;&#1587;&#1575;&#1587;&#1610;&#1575;&#1578; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1608;&#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1576;&#1606;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1608;&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1575;&#1604;&#1578;&#1610; &#1578;&#1587;&#1575;&#1593;&#1583; &#1593;&#1604;&#1609; &#1601;&#1607;&#1605; &#1575;&#1604;&#1605;&#1576;&#1575;&#1583;&#1574; &#1575;&#1604;&#1571;&#1587;&#1575;&#1587;&#1610;&#1577; &#1601;&#1610; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; Puppet &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1605;&#1548; &#1608;&#1584;&#1604;&#1603; &#1593;&#1606; &#1591;&#1585;&#1610;&#1602; &#1588;&#1585;&#1581; &#1579;&#1604;&#1575;&#1579; &#1591;&#1585;&#1602; &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1601;&#1610; &#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1616;&#1586;&#1605; LAMP &#1593;&#1604;&#1609; &#1582;&#1575;&#1583;&#1605; Ubuntu 14.04 &#1610;&#1593;&#1605;&#1604; &#1593;&#1604;&#1609; "&#1582;&#1575;&#1583;&#1605; &#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617; &#1582;&#1575;&#1589;&#1617;" VPS.</p><h2>&#1605;&#1615;&#1578;&#1614;&#1591;&#1614;&#1604;&#1617;&#1614;&#1576;&#1575;&#1578; &#1576;&#1610;&#1574;&#1577; &#1575;&#1604;&#1593;&#1605;&#1604;</h2><p>&#1602;&#1576;&#1604; &#1575;&#1604;&#1588;&#1585;&#1608;&#1593; &#1601;&#1610; &#1578;&#1591;&#1576;&#1610;&#1602; &#1605;&#1615;&#1581;&#1578;&#1608;&#1610;&#1575;&#1578; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1605;&#1606; &#1575;&#1604;&#1590;&#1585;&#1608;&#1585;&#1610;&#1617; &#1578;&#1608;&#1601;&#1617;&#1585; &#1576;&#1610;&#1574;&#1577; &#1593;&#1605;&#1604; &#1578;&#1587;&#1578;&#1582;&#1583;&#1605; &#1606;&#1592;&#1575;&#1605; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1608;&#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1608;&#1610;&#1605;&#1603;&#1606; &#1575;&#1604;&#1585;&#1580;&#1608;&#1593; &#1573;&#1604;&#1609; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1571;&#1608;&#1604; &#1605;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1593;&#1606; &#1603;&#1610;&#1601;&#1610;&#1577; <a href="http://academy.hsoub.com/devops/deployment/puppet/-r16/">&#1578;&#1606;&#1589;&#1610;&#1576; Puppet &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1576;&#1606;&#1610;&#1577; &#1575;&#1604;&#1578;&#1581;&#1578;&#1610;&#1577; &#1604;&#1604;&#1582;&#1608;&#1575;&#1583;&#1605; </a>&#1548; &#1603;&#1605;&#1575; &#1571;&#1606;&#1617;&#1607; &#1610;&#1580;&#1576; &#1578;&#1608;&#1601;&#1617;&#1585; &#1582;&#1575;&#1583;&#1605; &#1580;&#1583;&#1610;&#1583; &#1604;&#1610;&#1603;&#1608;&#1606; &#1606;&#1602;&#1591;&#1577; &#1593;&#1605;&#1610;&#1604; (Puppet agent node) &#1604;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; Puppet master.</p><h3>&#1573;&#1606;&#1588;&#1575;&#1569; &#1606;&#1602;&#1591;&#1577; &#1593;&#1605;&#1610;&#1604; &#1580;&#1583;&#1610;&#1583;&#1577;</h3><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1582;&#1575;&#1583;&#1605; &#1580;&#1583;&#1610;&#1583; &#1610;&#1593;&#1605;&#1604; &#1576;&#1578;&#1608;&#1586;&#1610;&#1593;&#1577; &#1571;&#1608;&#1576;&#1608;&#1606;&#1578;&#1608; 14.04&nbsp;&#1608;&#1610;&#1581;&#1605;&#1604; &#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;lamp-1&rdquo;&#1548; &#1608;&#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1593;&#1604;&#1610;&#1607;&#1548; &#1608;&#1590;&#1605;&#1617;&#1607; &#1573;&#1604;&#1609; &#1576;&#1602;&#1610;&#1617;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1575;&#1604;&#1605;&#1615;&#1583;&#1575;&#1585;&#1577; &#1605;&#1606; &#1602;&#1576;&#1604; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617;&#1548; &#1608;&#1584;&#1604;&#1603; &#1576;&#1606;&#1601;&#1587; &#1575;&#1604;&#1591;&#1585;&#1610;&#1602;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1605;&#1617;&#1578; &#1576;&#1607;&#1575; &#1573;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1601;&#1610; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1571;&#1608;&#1604;.</p><h2>&#1571;&#1587;&#1575;&#1587;&#1610;&#1575;&#1578; &#1603;&#1578;&#1575;&#1576;&#1577; &#1588;&#1610;&#1601;&#1585;&#1577; Puppet</h2><p>&#1587;&#1578;&#1578;&#1605;&#1617; &#1605;&#1585;&#1575;&#1580;&#1593;&#1577; &#1576;&#1593;&#1590; &#1575;&#1604;&#1605;&#1601;&#1575;&#1607;&#1610;&#1605; &#1608;&#1575;&#1604;&#1605;&#1615;&#1589;&#1591;&#1604;&#1581;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1585;&#1578;&#1576;&#1591;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1608;&#1584;&#1604;&#1603; &#1602;&#1576;&#1604; &#1575;&#1604;&#1582;&#1608;&#1590; &#1601;&#1610; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1601;&#1610; &#1603;&#1578;&#1575;&#1576;&#1577; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1607;&#1575;.</p><h3>&#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1583;</h3><p>&#1578;&#1578;&#1603;&#1608;&#1617;&#1606; &#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1576;&#1588;&#1603;&#1604;&#1613; &#1571;&#1587;&#1575;&#1587;&#1610;&#1617; &#1605;&#1606; &#1578;&#1589;&#1585;&#1610;&#1581;&#1575;&#1578; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; resource declarations&#1548; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1614;&#1589;&#1601; &#1581;&#1575;&#1604;&#1577;&#1611; &#1605;&#1615;&#1593;&#1610;&#1606;&#1577; &#1605;&#1606; &#1575;&#1604;&#1606;&#1592;&#1575;&#1605;&#1548; &#1605;&#1579;&#1604; &#1575;&#1587;&#1605; &#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; &#1605;&#1615;&#1593;&#1610;&#1606; &#1571;&#1608; &#1608;&#1580;&#1608;&#1576; &#1608;&#1580;&#1608;&#1583; &#1605;&#1614;&#1604;&#1601;&#1617;&#1613; &#1605;&#1615;&#1593;&#1610;&#1606;&#1548; &#1571;&#1608; &#1581;&#1578;&#1617;&#1609; &#1608;&#1580;&#1608;&#1576; &#1578;&#1608;&#1601;&#1617;&#1585; &#1571;&#1581;&#1583; &#1575;&#1604;&#1581;&#1586;&#1605; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605;. &#1601;&#1610; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577; &#1605;&#1579;&#1575;&#1604;&#1612; &#1593;&#1604;&#1609; &#1578;&#1589;&#1585;&#1610;&#1581; &#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1604;&#1575;&#1587;&#1605; &#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; &#1605;&#1615;&#1593;&#1610;&#1617;&#1606;:</p><pre class="ipsCode prettyprint">user { 'samir':
  ensure     =&gt; present,
  uid        =&gt; '1000',
  gid        =&gt; '1000',
  shell      =&gt; '/bin/bash',
  home       =&gt; '/home/samir'
}
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1578;&#1614;&#1603;&#1608;&#1606; &#1576;&#1606;&#1610;&#1577; &#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1593;&#1604;&#1609; &#1575;&#1604;&#1588;&#1603;&#1604; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</span>
</pre><pre class="ipsCode prettyprint">resource_type { 'resource_name'
  attribute =&gt; value
  ...
}

&#1606;&#1608;&#1593; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; { '&#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583;'
  &#1575;&#1604;&#1582;&#1575;&#1589;&#1610;&#1617;&#1577; =&gt; &#1575;&#1604;&#1602;&#1610;&#1605;&#1577;
  ...
}
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1610;&#1589;&#1601; &#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1605;&#1614;&#1608;&#1585;&#1616;&#1583;&#1611;&#1575; &#1605;&#1615;&#1593;&#1610;&#1606;&#1611;&#1575; &#1608;&#1607;&#1608; &#1575;&#1587;&#1605; &#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605; "samir" &#1608;&#1575;&#1604;&#1582;&#1608;&#1575;&#1589;&#1617; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1607;. &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1593;&#1585;&#1575;&#1590; &#1571;&#1606;&#1608;&#1575;&#1593; &#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1616;&#1583; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1575;&#1604;&#1605;&#1615;&#1578;&#1575;&#1581;&#1577; &#1604;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1576;&#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</span>
</pre><pre class="ipsCode prettyprint">puppet resource --types</pre><h3>&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; Manifests</h3><p>&#1578;&#1615;&#1583;&#1593;&#1609; &#1575;&#1604;&#1578;&#1593;&#1604;&#1610;&#1605;&#1575;&#1578; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1576;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifests&#1548; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1581;&#1578;&#1608;&#1610; &#1593;&#1604;&#1609; &#1588;&#1610;&#1601;&#1585;&#1577; Puppet&#1548; &#1608;&#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1604;&#1601;&#1575;&#1578; &#1578;&#1587;&#1578;&#1582;&#1583;&#1605; &#1575;&#1604;&#1604;&#1575;&#1581;&#1602;&#1577; <span style="font-family:'courier new', courier, monospace;"><code>.pp</code>.</span> &#1610;&#1608;&#1580;&#1583; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617; &#1601;&#1610; &#1575;&#1604;&#1605;&#1587;&#1575;&#1585; <span style="font-family:'courier new', courier, monospace;"><code>/etc/puppet/manifests/site.pp</code>.</span></p><p>&#1601;&#1610; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1571;&#1608;&#1604; &#1605;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1578;&#1605;&#1617; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606;&#1613; &#1603;&#1575;&#1606;&#1578; &#1605;&#1615;&#1607;&#1605;&#1578;&#1607; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617; &#1608;&#1578;&#1606;&#1589;&#1610;&#1576; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache&#1548; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1603;&#1578;&#1575;&#1576;&#1577; &#1575;&#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1608;&#1593; &#1605;&#1606; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1580;&#1586;&#1569;.</p><h3>&#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; Classes</h3><p>&#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1601;&#1610; Puppet &#1607;&#1610; &#1593;&#1576;&#1575;&#1585;&#1577; &#1593;&#1606; &#1602;&#1591;&#1593;&#1577; &#1605;&#1606; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1576;&#1585;&#1605;&#1580;&#1610;&#1577; &#1608;&#1575;&#1604;&#1578;&#1610; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1605;&#1603;&#1606; &#1575;&#1587;&#1578;&#1583;&#1593;&#1575;&#1574;&#1607;&#1575; &#1601;&#1610; &#1571;&#1610; &#1605;&#1603;&#1575;&#1606; &#1605;&#1606; &#1588;&#1610;&#1601;&#1585;&#1577;&#1611; &#1605;&#1575;. &#1578;&#1615;&#1608;&#1578;&#1610;&#1581; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577;&#1548; &#1605;&#1605;&#1575; &#1610;&#1615;&#1602;&#1604;&#1617;&#1604; &#1605;&#1606; &#1608;&#1602;&#1578; &#1575;&#1604;&#1578;&#1593;&#1583;&#1610;&#1604; &#1608;&#1589;&#1610;&#1575;&#1606;&#1577; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1601;&#1610; &#1608;&#1602;&#1578;&#1613; &#1604;&#1575;&#1581;&#1602;&#1613;. &#1603;&#1605;&#1575; &#1578;&#1580;&#1593;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1605;&#1606; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1571;&#1608;&#1590;&#1581; &#1608;&#1571;&#1587;&#1607;&#1604; &#1601;&#1610; &#1575;&#1604;&#1601;&#1607;&#1605; &#1608;&#1575;&#1604;&#1602;&#1585;&#1575;&#1569;&#1577;.</p><h3>&#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1578;&#1593;&#1585;&#1610;&#1601; &#1575;&#1604;&#1589;&#1606;&#1601;</h3><p>&#1610;&#1580;&#1593;&#1604; &#1578;&#1593;&#1585;&#1610;&#1601; &#1575;&#1604;&#1589;&#1606;&#1601; &#1605;&#1606; &#1575;&#1604;&#1589;&#1606;&#1601; &#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605;&#1611;&#1575; &#1601;&#1610; &#1571;&#1580;&#1586;&#1575;&#1569;&#1613; &#1605;&#1615;&#1582;&#1578;&#1604;&#1601;&#1577; &#1605;&#1606; &#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifests&#1548; &#1608;&#1604;&#1603;&#1606; &#1601;&#1610; &#1606;&#1601;&#1587; &#1575;&#1604;&#1608;&#1602;&#1578; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1604;&#1575; &#1578;&#1615;&#1601;&#1587;&#1585;. &#1610;&#1608;&#1590;&#1581; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1608;&#1578;&#1593;&#1585;&#1610;&#1601; &#1575;&#1604;&#1589;&#1606;&#1601; &#1601;&#1610; Puppet.</p><pre class="ipsCode prettyprint">class example_class {
  ...
  code
  ...
}
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1578;&#1615;&#1593;&#1585;&#1617;&#1601;&#1615; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585;&#1615; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1577; &#1589;&#1606;&#1601;&#1611;&#1575; &#1576;&#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;example_class&rdquo;&#1548; &#1608;&#1578;&#1578;&#1608;&#1590;&#1593; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1577; Puppet &#1576;&#1610;&#1606; &#1575;&#1604;&#1581;&#1575;&#1589;&#1616;&#1585;&#1578;&#1610;&#1606; &ldquo;{}&rdquo;</span>
</pre><h3>&#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601;</h3><p>&#1604;&#1575; &#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1589;&#1606;&#1601; &#1573;&#1604;&#1575; &#1593;&#1606;&#1583;&#1605;&#1575; &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1583;&#1593;&#1575;&#1572;&#1607; &#1601;&#1610; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifest&#1548; &#1581;&#1610;&#1579;&#1615; &#1571;&#1606;&#1617; &#1607;&#1584;&#1575; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1610;&#1582;&#1576;&#1585; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1571;&#1606;&#1617; &#1578;&#1602;&#1608;&#1605; &#1576;&#1578;&#1601;&#1587;&#1610;&#1585; evaluate &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1615;&#1578;&#1608;&#1590;&#1593;&#1577; &#1583;&#1575;&#1582;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1589;&#1606;&#1601;&#1548; &#1608;&#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1576;&#1591;&#1585;&#1610;&#1602;&#1578;&#1610;&#1606; &#1605;&#1582;&#1578;&#1604;&#1601;&#1578;&#1610;&#1606;: &#1591;&#1585;&#1610;&#1602;&#1577;&#1612; &#1593;&#1575;&#1583;&#1610;&#1577; normal&#1548; &#1608;&#1591;&#1585;&#1610;&#1602;&#1577;&#1612; &#1578;&#1588;&#1576;&#1607; &#1591;&#1585;&#1610;&#1602;&#1577; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; resource-like.</p><p>&#1578;&#1614;&#1603;&#1608;&#1606; &#1591;&#1585;&#1610;&#1602;&#1577; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1593;&#1575;&#1583;&#1610;&#1577; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1603;&#1604;&#1605;&#1577; &#1575;&#1604;&#1605;&#1601;&#1578;&#1575;&#1581;&#1610;&#1617;&#1577; <span style="font-family:'courier new', courier, monospace;"><code>include</code></span> &#1590;&#1605;&#1617;&#1606; &#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1603;&#1605;&#1575; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:<code> </code></p><pre class="ipsCode prettyprint">include example_class</pre><p>&#1587;&#1578;&#1602;&#1608;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1576;&#1578;&#1601;&#1587;&#1610;&#1585; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1589;&#1606;&#1601; &ldquo;<span style="font-family:'courier new', courier, monospace;">example_class</span>&rdquo; &#1576;&#1593;&#1583; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;.</p><p>&#1610;&#1581;&#1583;&#1579; &#1575;&#1604;&#1606;&#1608;&#1593; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610; &#1605;&#1606; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606;&#1583;&#1605;&#1575; &#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1589;&#1606;&#1601; &#1603;&#1605;&#1575; &#1607;&#1608; &#1575;&#1604;&#1581;&#1575;&#1604; &#1593;&#1606;&#1583; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1605;&#1614;&#1608;&#1585;&#1616;&#1583;&#1548; &#1608; &#1603;&#1605;&#1575; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">class { 'example_class': }</pre><p>&#1610;&#1587;&#1605;&#1581; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1606;&#1608;&#1593; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610; &#1605;&#1606; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; resource-like &#1576;&#1578;&#1581;&#1583;&#1610;&#1583; &#1605;&#1615;&#1593;&#1575;&#1605;&#1604;&#1575;&#1578; parameters&#1548; &#1608;&#1575;&#1604;&#1578;&#1610; &#1578;&#1602;&#1608;&#1605; &#1576;&#1578;&#1580;&#1575;&#1607;&#1604; &#1608;&#1578;&#1580;&#1575;&#1608;&#1586; &#1575;&#1604;&#1602;&#1610;&#1605; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1604;&#1582;&#1608;&#1575;&#1589;&#1617; &#1575;&#1604;&#1589;&#1606;&#1601; class attributes. &#1601;&#1610; &#1581;&#1575;&#1604; &#1575;&#1604;&#1585;&#1580;&#1608;&#1593; &#1573;&#1604;&#1609; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1571;&#1608;&#1604; &#1605;&#1606; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1601;&#1587;&#1610;&#1578;&#1590;&#1581; &#1571;&#1606;&#1617;&#1607; &#1576;&#1575;&#1604;&#1601;&#1593;&#1604; &#1602;&#1583; &#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1607;&#1584;&#1575; &#1575;&#1604;&#1606;&#1608;&#1593; &#1605;&#1606; &#1575;&#1604;&#1578;&#1589;&#1575;&#1585;&#1610;&#1581; &#1593;&#1606;&#1583;&#1605;&#1575; &#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1605;&#1615;&#1602;&#1583;&#1605;&#1577; &#1605;&#1606; &#1605;&#1593;&#1575;&#1605;&#1604; Puppet &#1604;&#1578;&#1606;&#1589;&#1610;&#1576; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;host2&rdquo;.</p><pre class="ipsCode prettyprint">node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    =&gt; '80',
    docroot =&gt; '/var/www/html'
  }
}
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1608;&#1575;&#1604;&#1570;&#1606; &#1576;&#1593;&#1583; &#1571;&#1606;&#1617; &#1578;&#1605;&#1617; &#1588;&#1585;&#1581; &#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1616;&#1583; &#1608;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1608;&#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601;&#1548; &#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1606;&#1575;&#1608;&#1604; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; modules &#1576;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1601;&#1589;&#1610;&#1604;.</span>
</pre><h3>&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; Modules</h3><p>&#1578;&#1578;&#1571;&#1604;&#1617;&#1601; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1605;&#1606; &#1605;&#1580;&#1605;&#1608;&#1593;&#1577; &#1605;&#1606; &#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifests &#1608;&#1605;&#1580;&#1605;&#1608;&#1593;&#1577; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1593;&#1591;&#1610;&#1575;&#1578; (&#1605;&#1579;&#1604; &#1575;&#1604;&#1581;&#1602;&#1575;&#1574;&#1602; facts &#1608;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; files&#1548; &#1608;&#1606;&#1605;&#1575;&#1584;&#1580; templates)&#1548; &#1608;&#1604;&#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1580;&#1605;&#1608;&#1593;&#1577; &#1578;&#1606;&#1592;&#1610;&#1605; &#1605;&#1587;&#1575;&#1585;&#1610; &#1605;&#1615;&#1581;&#1583;&#1583;. &#1578;&#1615;&#1587;&#1575;&#1593;&#1583; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1593;&#1604;&#1609; &#1578;&#1606;&#1592;&#1610;&#1605; &#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1581;&#1610;&#1579;&#1615; &#1571;&#1606;&#1617;&#1607;&#1575; &#1578;&#1615;&#1602;&#1583;&#1605; &#1575;&#1604;&#1605;&#1615;&#1585;&#1608;&#1606;&#1577; &#1601;&#1610; &#1578;&#1602;&#1587;&#1610;&#1605; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1576;&#1585;&#1605;&#1580;&#1610;&#1577; &#1575;&#1604;&#1605;&#1578;&#1605;&#1579;&#1617;&#1604;&#1577; &#1576;&#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1573;&#1604;&#1609; &#1571;&#1580;&#1586;&#1575;&#1569;&#1613; &#1605;&#1615;&#1587;&#1578;&#1602;&#1604;&#1577;&#1548; &#1608;&#1610;&#1615;&#1593;&#1578;&#1576;&#1585; &#1584;&#1604;&#1603; &#1591;&#1585;&#1610;&#1602;&#1577;&#1611; &#1601;&#1593;&#1617;&#1575;&#1604;&#1577;&#1611; &#1608;&#1593;&#1605;&#1604;&#1610;&#1617;&#1577; &#1601;&#1610; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1604;&#1578;&#1606;&#1592;&#1610;&#1605; &#1605;&#1593;&#1592;&#1605; &#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifests &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet.</p><p>&#1578;&#1615;&#1608;&#1590;&#1593; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; modules &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1601;&#1610; &#1575;&#1604;&#1605;&#1587;&#1575;&#1585; <span style="font-family:'courier new', courier, monospace;"><code>/etc/puppet/modules</code></span>.</p><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1591;&#1585;&#1617;&#1602; &#1573;&#1604;&#1609; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1575;&#1604;&#1604;&#1575;&#1586;&#1605;&#1577; &#1604;&#1603;&#1578;&#1575;&#1576;&#1577; &#1608;&#1581;&#1583;&#1577; &#1605;&#1615;&#1576;&#1587;&#1617;&#1591;&#1577; basic module&#1548; &#1608;&#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1585;&#1580;&#1608;&#1593; &#1573;&#1604;&#1609; &#1575;&#1604;&#1578;&#1608;&#1579;&#1610;&#1602; &#1575;&#1604;&#1585;&#1617;&#1587;&#1605;&#1610;&#1617; &#1608;&#1575;&#1604;&#1580;&#1586;&#1569; <a rel="external nofollow" href="https://docs.puppetlabs.com/puppet/latest/reference/modules_fundamentals.html">&#1575;&#1604;&#1582;&#1575;&#1589; &#1576;&#1571;&#1587;&#1575;&#1587;&#1610;&#1575;&#1578; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1601;&#1610; Puppet</a>.</p><h2>&#1578;&#1591;&#1608;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;</h2><p>&#1604;&#1588;&#1585;&#1581; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577;&#1548; &#1608;&#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1608;&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578;&#1548; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; Puppet &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1608;&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP &#1593;&#1604;&#1609; &#1606;&#1592;&#1575;&#1605; &#1575;&#1604;&#1578;&#1588;&#1594;&#1610;&#1604; &#1571;&#1608;&#1576;&#1608;&#1606;&#1578;&#1608;&nbsp;(&#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1588;&#1575;&#1576;&#1607; &#1573;&#1604;&#1609; <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04">&#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581;</a>)&#1548; &#1608;&#1605;&#1606; &#1575;&#1604;&#1580;&#1610;&#1617;&#1583; &#1602;&#1585;&#1575;&#1569;&#1577; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1604;&#1605;&#1593;&#1585;&#1601;&#1577; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1578;&#1606;&#1589;&#1610;&#1576; &#1608;&#1573;&#1593;&#1583;&#1575;&#1583; &#1607;&#1584;&#1607; &#1575;&#1604;&#1581;&#1616;&#1586;&#1605; &#1576;&#1588;&#1603;&#1604;&#1613; &#1610;&#1583;&#1608;&#1610;&#1617; &#1602;&#1576;&#1604; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; Puppet &#1601;&#1610; &#1584;&#1604;&#1603;.</p><p>&#1575;&#1604;&#1607;&#1583;&#1601; &#1575;&#1604;&#1606;&#1607;&#1575;&#1574;&#1610; &#1575;&#1604;&#1584;&#1610; &#1610;&#1589;&#1576;&#1608; &#1573;&#1604;&#1610;&#1607; &#1607;&#1584;&#1575; &#1575;&#1604;&#1588;&#1585;&#1581; &#1607;&#1608; &#1582;&#1575;&#1583;&#1605; &#1571;&#1608;&#1576;&#1608;&#1606;&#1578;&#1608;&nbsp;&#1605;&#1593; &#1575;&#1604;&#1593;&#1606;&#1575;&#1589;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577;:</p><ul><li>&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1586;&#1605;&#1577; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache</li><li>&#1578;&#1588;&#1594;&#1610;&#1604; &#1582;&#1583;&#1605;&#1577; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache</li><li>&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1586;&#1605;&#1577; &#1582;&#1575;&#1583;&#1605; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; MySQL</li><li>&#1578;&#1588;&#1594;&#1610;&#1604; &#1582;&#1583;&#1605;&#1577; &#1582;&#1575;&#1583;&#1605; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; MySQL</li><li>&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1586;&#1605;&#1577; PHP5</li><li>&#1605;&#1614;&#1604;&#1601;&#1617; script &#1604;&#1575;&#1582;&#1578;&#1576;&#1575;&#1585; PHP &#1608;&#1607;&#1608; &#1575;&#1604;&#1605;&#1604;&#1601; info.php</li><li>&#1578;&#1581;&#1583;&#1610;&#1579; "&#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1581;&#1586;&#1605; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1605;&#1577;" apt &#1602;&#1576;&#1604; &#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1581;&#1616;&#1586;&#1605; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1577;.</li></ul><p>&#1601;&#1610;&#1605;&#1575; &#1610;&#1604;&#1610; &#1579;&#1604;&#1575;&#1579;&#1577; &#1571;&#1602;&#1587;&#1575;&#1605; &#1578;&#1588;&#1585;&#1581; &#1591;&#1615;&#1585;&#1602;&#1611;&#1575; &#1605;&#1615;&#1582;&#1578;&#1604;&#1601;&#1577; &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1604;&#1578;&#1581;&#1602;&#1610;&#1602; &#1606;&#1601;&#1587; &#1575;&#1604;&#1594;&#1575;&#1610;&#1577;&#1548; &#1608;&#1607;&#1610; &#1582;&#1575;&#1583;&#1605; &#1610;&#1581;&#1578;&#1608;&#1610; &#1593;&#1604;&#1609; &#1575;&#1604;&#1581;&#1616;&#1586;&#1605; LAMP &#1608;&#1610;&#1593;&#1605;&#1604; &#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1604;&#1575;&#1574;&#1605;. &#1587;&#1610;&#1615;&#1608;&#1590;&#1617;&#1581; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1571;&#1608;&#1604; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1608;&#1581;&#1610;&#1583; &#1608;&#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1576;&#1587;&#1617;&#1591;&#1548; &#1571;&#1605;&#1575; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610; &#1587;&#1610;&#1608;&#1590;&#1617;&#1581; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1576;&#1606;&#1575;&#1569; &#1608;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1589;&#1606;&#1575;&#1601; &#1608;&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1576;&#1606;&#1575;&#1569;&#1611; &#1593;&#1604;&#1609; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1605;&#1591;&#1608;&#1617;&#1585; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1571;&#1608;&#1604;&#1548; &#1608;&#1571;&#1582;&#1610;&#1585;&#1611;&#1575; &#1587;&#1610;&#1608;&#1590;&#1617;&#1581; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1579;&#1617;&#1575;&#1604;&#1579; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1581;&#1583;&#1575;&#1578;&#1613; &#1605;&#1615;&#1591;&#1608;&#1617;&#1585;&#1577; &#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1587;&#1576;&#1602; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1616;&#1586;&#1605; LAMP &#1576;&#1588;&#1603;&#1604;&#1613; &#1587;&#1585;&#1610;&#1593;&#1613; &#1608;&#1587;&#1607;&#1604;.</p><h2>&#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1571;&#1608;&#1604;: &#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1608;&#1581;&#1610;&#1583;:</h2><p>&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1607;&#1608; &#1605;&#1615;&#1604;&#1575;&#1574;&#1605; &#1580;&#1583;&#1611;&#1575; &#1604;&#1605;&#1615;&#1583;&#1585;&#1575;&#1569; &#1575;&#1604;&#1571;&#1606;&#1592;&#1605;&#1577; &#1575;&#1604;&#1584;&#1610;&#1606; &#1604;&#1605; &#1610;&#1603;&#1578;&#1576;&#1608;&#1575; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1605;&#1606; &#1602;&#1576;&#1604;&#1548; &#1587;&#1610;&#1615;&#1591;&#1608;&#1617;&#1614;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617;&#1615; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1593;&#1604;&#1609; &#1606;&#1602;&#1591;&#1577; &#1593;&#1605;&#1610;&#1604; Puppet agent node&#1548; &#1608;&#1610;&#1615;&#1606;&#1601;&#1584; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1605;&#1585; <span style="font-family:'courier new', courier, monospace;"><code>puppet apply</code></span>&#1548; &#1608;&#1604;&#1584;&#1604;&#1603; &#1604;&#1610;&#1587; &#1605;&#1606; &#1575;&#1604;&#1590;&#1585;&#1608;&#1585;&#1610;&#1617; &#1578;&#1608;&#1601;&#1617;&#1585; &#1605;&#1606;&#1592;&#1608;&#1605;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1608;&#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; &#1604;&#1573;&#1578;&#1605;&#1575;&#1605; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604;.</p><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1585;&#1603;&#1610;&#1586; &#1593;&#1604;&#1609; &#1603;&#1610;&#1601;&#1610;&#1617;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1610;&#1614;&#1587;&#1578;&#1582;&#1583;&#1605; &#1575;&#1604;&#1571;&#1606;&#1608;&#1575;&#1593; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577; &#1605;&#1606; &#1578;&#1589;&#1575;&#1585;&#1610;&#1581; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; resource declarations:</p><ul><li>exec: &#1604;&#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1608;&#1575;&#1605;&#1585; &#1605;&#1579;&#1604; &#1575;&#1604;&#1571;&#1605;&#1585; <span style="font-family:'courier new', courier, monospace;"><code>apt-get</code></span></li><li>package: &#1604;&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1586;&#1605;&#1577; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; apt</li><li>service: &#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1593;&#1605;&#1604; &#1582;&#1583;&#1605;&#1577; &#1605;&#1575;</li><li>file: &#1604;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1608;&#1580;&#1608;&#1583; &#1605;&#1604;&#1601;&#1613; &#1605;&#1575; &#1571;&#1608;&#1593;&#1583;&#1605;&#1607;</li></ul><h3>&#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;</h3><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1580;&#1583;&#1610;&#1583; &#1593;&#1604;&#1609; &#1582;&#1575;&#1583;&#1605; &#1580;&#1583;&#1610;&#1583; &#1610;&#1581;&#1605;&#1604; &#1575;&#1604;&#1575;&#1587;&#1605; "lamp-1" &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">sudo vi /etc/puppet/manifests/lamp.pp</pre><p>&#1608;&#1576;&#1573;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1575;&#1604;&#1578;&#1575;&#1604;&#1610;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1610;&#1603;&#1608;&#1606; &#1602;&#1583; &#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1616;&#1583; &#1575;&#1604;&#1605;&#1591;&#1604;&#1608;&#1576;&#1577;.</p><pre class="ipsCode prettyprint"># &#1578;&#1581;&#1583;&#1610;&#1579; &#1571;&#1583;&#1575;&#1577; &#1575;&#1604;&#1581;&#1586;&#1605; &#1575;&#1604;&#1605;&#1578;&#1602;&#1583;&#1605;&#1577;
exec { 'apt-update':                    # exec resource named 'apt-update'
  command =&gt; '/usr/bin/apt-get update'  # command this resource will run
}

# &#1578;&#1606;&#1589;&#1610;&#1576; &#1582;&#1575;&#1583;&#1605; &#1571;&#1576;&#1575;&#1578;&#1588;&#1610;
package { 'apache2':
  require =&gt; Exec['apt-update'],        # require 'apt-update' before installing
  ensure =&gt; installed,
}

# &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1593;&#1605;&#1604; &#1582;&#1583;&#1605;&#1577; &#1571;&#1576;&#1575;&#1578;&#1588;&#1610;
service { 'apache2':
  ensure =&gt; running,
}

# &#1578;&#1606;&#1589;&#1610;&#1576; &#1582;&#1575;&#1583;&#1605; &#1602;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578;
package { 'mysql-server':
  require =&gt; Exec['apt-update'],        # require 'apt-update' before installing
  ensure =&gt; installed,
}

# &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1593;&#1605;&#1604; &#1582;&#1575;&#1583;&#1605; &#1602;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578;
service { 'mysql':
  ensure =&gt; running,
}

# &#1578;&#1606;&#1589;&#1610;&#1576; &#1604;&#1594;&#1577; &#1576;&#1610; &#1573;&#1578;&#1588; &#1576;&#1610;
package { 'php5':
  require =&gt; Exec['apt-update'],        # require 'apt-update' before installing
  ensure =&gt; installed,
}

# &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1608;&#1580;&#1608;&#1583; &#1605;&#1614;&#1604;&#1601;&#1617;
file { '/var/www/html/info.php':
  ensure =&gt; file,
  content =&gt; '&lt;?php  phpinfo(); ?&gt;',    # phpinfo code
  require =&gt; Package['apache2'],        # require 'apache2' package before creating
}
</pre><p>&#1571;&#1589;&#1576;&#1581; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1570;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1605;&#1585; <code>puppet apply</code>&#1548; &#1575;&#1604;&#1584;&#1610; &#1610;&#1615;&#1593;&#1578;&#1576;&#1585; &#1605;&#1606; &#1606;&#1608;&#1593; standalone&#1548; &#1601;&#1607;&#1608; &#1610;&#1582;&#1578;&#1604;&#1601; &#1593;&#1606; &#1575;&#1604;&#1571;&#1605;&#1585; <code>puppet agent</code> &#1575;&#1604;&#1584;&#1610; &#1610;&#1587;&#1578;&#1583;&#1593;&#1610; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1605;&#1606; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617;. &#1604;&#1578;&#1606;&#1601;&#1610;&#1584; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1608;&#1607;&#1608; &#1605;&#1575; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1593;&#1605;&#1604;&#1607; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; "lamp-1" &#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">sudo puppet apply --test</pre><p>&#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1593;&#1585;&#1590; &#1587;&#1591;&#1608;&#1585; &#1593;&#1583;&#1617;&#1577; &#1603;&#1605;&#1582;&#1585;&#1580;&#1575;&#1578; output&#1548; &#1610;&#1614;&#1592;&#1607;&#1585; &#1605;&#1606; &#1582;&#1604;&#1575;&#1604;&#1607;&#1575; &#1581;&#1575;&#1604;&#1577; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1608;&#1575;&#1604;&#1578;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1605;&#1617;&#1578; &#1593;&#1604;&#1610;&#1607;&#1548; &#1608;&#1584;&#1604;&#1603; &#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1578;&#1608;&#1575;&#1601;&#1602; &#1605;&#1593; &#1605;&#1575; &#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1576;&#1607; &#1605;&#1606; &#1605;&#1614;&#1608;&#1575;&#1585;&#1616;&#1583; &#1601;&#1610; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; manifest. &#1601;&#1610; &#1581;&#1575;&#1604; &#1593;&#1583;&#1605; &#1608;&#1580;&#1608;&#1583; &#1571;&#1582;&#1591;&#1575;&#1569;&#1548;&#1571;&#1608; &#1605;&#1588;&#1575;&#1603;&#1604; &#1601;&#1610; &#1593;&#1605;&#1604;&#1610;&#1577; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1548; &#1601;&#1610;&#1615;&#1601;&#1578;&#1585;&#1590; &#1593;&#1606;&#1583; &#1575;&#1587;&#1578;&#1593;&#1585;&#1575;&#1590; &#1575;&#1604;&#1589;&#1601;&#1581;&#1577; <code>info.php</code> &#1593;&#1585;&#1590; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1578;&#1615;&#1588;&#1610;&#1585; &#1573;&#1604;&#1609; &#1593;&#1605;&#1604; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache &#1608;&#1604;&#1594;&#1577; PHP &#1603;&#1605;&#1575; &#1607;&#1608; &#1605;&#1591;&#1604;&#1608;&#1576;.</p><p>&#1604;&#1605; &#1610;&#1603;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1573;&#1604;&#1617;&#1575; &#1573;&#1593;&#1583;&#1575;&#1583;&#1611;&#1575; &#1576;&#1587;&#1610;&#1591;&#1611;&#1575; &#1604;&#1605;&#1575; &#1610;&#1615;&#1605;&#1603;&#1606; &#1593;&#1605;&#1604;&#1607; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; <code>Puppet</code>&#1548; &#1608;&#1584;&#1604;&#1603; &#1571;&#1606;&#1617;&#1607; &#1604;&#1605; &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1605;&#1606;&#1592;&#1608;&#1605;&#1577; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; &#1608;&#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; (agent/master setup)&#1548; &#1571;&#1610;&#1590;&#1611;&#1575; &#1604;&#1575; &#1610;&#1578;&#1608;&#1601;&#1617;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1604;&#1576;&#1602;&#1610;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607; &#1605;&#1585;&#1617;&#1577;&#1611; &#1571;&#1615;&#1582;&#1585;&#1609;&#1548; &#1603;&#1605;&#1575; &#1604;&#1575;&#1578;&#1602;&#1608;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1576;&#1575;&#1604;&#1578;&#1614;&#1601;&#1581;&#1617;&#1589;&#1616; &#1576;&#1588;&#1603;&#1604; &#1583;&#1608;&#1585;&#1610;&#1617;&#1613; (&#1603;&#1604;&#1617; 30 &#1583;&#1602;&#1610;&#1602;&#1577;) &#1605;&#1606; &#1581;&#1575;&#1604;&#1577; &#1582;&#1608;&#1575;&#1583;&#1605;&#1607;&#1575; &#1601;&#1610; &#1581;&#1575;&#1604; &#1571;&#1606;&#1617;&#1607;&#1575; &#1605;&#1615;&#1578;&#1608;&#1575;&#1601;&#1602;&#1577; &#1605;&#1593; &#1605;&#1575; &#1607;&#1608; &#1605;&#1615;&#1593;&#1583;&#1617; &#1604;&#1607;&#1575; &#1601;&#1610; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;.</p><p>&#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610;&#1548; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1578;&#1581;&#1608;&#1610;&#1604; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1573;&#1604;&#1609; &#1608;&#1581;&#1583;&#1577; module&#1548; &#1608;&#1576;&#1584;&#1604;&#1603; &#1610;&#1615;&#1589;&#1576;&#1581; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1605;&#1603;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607; &#1605;&#1593; &#1576;&#1602;&#1610;&#1617;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569;.</p><h2>&#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1579;&#1617;&#1575;&#1606;&#1610;: &#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; modules</h2><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1581;&#1583;&#1577; &#1605;&#1615;&#1576;&#1587;&#1617;&#1591;&#1577; &#1575;&#1593;&#1578;&#1605;&#1575;&#1583;&#1611;&#1575; &#1593;&#1604;&#1609; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606; &#1581;&#1616;&#1586;&#1605; LAMP &#1575;&#1604;&#1605;&#1615;&#1591;&#1608;&#1617;&#1585; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1548; &#1608;&#1584;&#1604;&#1603; &#1576;&#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1606;&#1577; &#1576;&#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617; Puppet master. &#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1581;&#1583;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577; &#1593;&#1576;&#1585; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1587;&#1575;&#1585; &#1580;&#1583;&#1610;&#1583; &#1601;&#1610; &#1575;&#1604;&#1605;&#1587;&#1575;&#1585; <code>modules</code> &#1575;&#1604;&#1582;&#1575;&#1589;&#1617; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet&#1548; &#1608;&#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1587;&#1575;&#1585; &#1610;&#1580;&#1576; &#1571;&#1606;&#1617; &#1610;&#1615;&#1591;&#1575;&#1576;&#1602; &#1575;&#1587;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577;&#1548; &#1605;&#1615;&#1581;&#1578;&#1608;&#1610;&#1611;&#1575; &#1576;&#1583;&#1575;&#1582;&#1604;&#1607; &#1605;&#1587;&#1575;&#1585;&#1611;&#1575; &#1576;&#1575;&#1604;&#1575;&#1587;&#1605; <code>manifests</code>&#1548; &#1608;&#1576;&#1583;&#1575;&#1582;&#1604;&#1607; &#1605;&#1614;&#1604;&#1601;&#1617; <code>init.pp</code>. &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601;&#1617; &#1610;&#1580;&#1576; &#1571;&#1606;&#1617; &#1610;&#1581;&#1578;&#1608;&#1610; &#1601;&#1602;&#1591; &#1593;&#1604;&#1609; &#1589;&#1606;&#1601; &#1610;&#1615;&#1591;&#1575;&#1576;&#1602; &#1575;&#1587;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577;.</p><h3>&#1573;&#1606;&#1588;&#1575;&#1569; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; Module</h3><p>&#1604;&#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1581;&#1583;&#1577; &#1580;&#1583;&#1610;&#1583;&#1577; &#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1587;&#1575;&#1585; &#1580;&#1583;&#1610;&#1583; &#1576;&#1575;&#1604;&#1575;&#1587;&#1605; <code>lamp</code>&#1548; &#1608;&#1575;&#1604;&#1584;&#1610; &#1607;&#1608; &#1575;&#1587;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1571;&#1610;&#1590;&#1611;&#1575;:</p><pre class="ipsCode prettyprint">cd /etc/puppet/modules
sudo mkdir -p lamp/manifests
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1608;&#1605;&#1606; &#1579;&#1615;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1608;&#1578;&#1581;&#1585;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; </span><span style="font-family:'courier new', courier, monospace;"><code style="line-height:1.6;">init.pp</code></span>
</pre><pre class="ipsCode prettyprint">sudo vi lamp/manifests/init.pp</pre><p>&#1583;&#1575;&#1582;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601;&#1617; &#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1589;&#1606;&#1601; &#1576;&#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;lamp&rdquo;</p><pre><code>class lamp {

}
</code></pre><p>&#1576;&#1593;&#1583; &#1584;&#1604;&#1603; &#1587;&#1610;&#1578;&#1605;&#1617; &#1606;&#1587;&#1582; &#1605;&#1615;&#1581;&#1578;&#1608;&#1610;&#1575;&#1578; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1617;&#1584;&#1610; &#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1572;&#1607; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1571;&#1608;&#1604; &#1583;&#1575;&#1582;&#1604; &#1607;&#1584;&#1575; &#1575;&#1604;&#1589;&#1606;&#1601;&#1548; &#1608;&#1576;&#1584;&#1604;&#1603; &#1610;&#1603;&#1608;&#1606; &#1602;&#1583; &#1578;&#1605;&#1617; &#1578;&#1593;&#1585;&#1610;&#1601; &#1589;&#1606;&#1601; &#1580;&#1583;&#1610;&#1583; &#1576;&#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;lamp&rdquo;&#1548; &#1608;&#1604;&#1603;&#1606; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1578;&#1610; &#1610;&#1581;&#1578;&#1608;&#1610;&#1607;&#1575; &#1607;&#1584;&#1575; &#1575;&#1604;&#1589;&#1606;&#1601; &#1604;&#1606; &#1610;&#1578;&#1605;&#1617; &#1578;&#1601;&#1587;&#1610;&#1585;&#1607;&#1575; (evaluate) &#1607;&#1606;&#1575;&#1548; &#1608;&#1604;&#1603;&#1606;&#1607;&#1575; &#1571;&#1589;&#1576;&#1581;&#1578; &#1580;&#1575;&#1607;&#1586;&#1577; &#1604;&#1603;&#1610; &#1578;&#1615;&#1587;&#1578;&#1583;&#1593;&#1609; (&#1571;&#1610; &#1610;&#1615;&#1589;&#1585;&#1581; &#1593;&#1606;&#1607;&#1575;)&#1548; &#1608;&#1571;&#1589;&#1576;&#1581; &#1576;&#1575;&#1604;&#1573;&#1605;&#1603;&#1575;&#1606; &#1575;&#1604;&#1608;&#1589;&#1608;&#1604; &#1573;&#1604;&#1609; &#1607;&#1584;&#1575; &#1575;&#1604;&#1589;&#1606;&#1601; &#1603;&#1608;&#1581;&#1583;&#1577; module &#1605;&#1606; &#1602;&#1576;&#1604; &#1605;&#1614;&#1604;&#1601;&#1617;&#1575;&#1578; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1571;&#1615;&#1582;&#1585;&#1609;&#1548; &#1608;&#1584;&#1604;&#1603; &#1601;&#1602;&#1591; &#1604;&#1571;&#1606;&#1617;&#1607; &#1610;&#1615;&#1581;&#1602;&#1617;&#1602; &#1602;&#1608;&#1575;&#1593;&#1583; &#1578;&#1593;&#1585;&#1610;&#1601; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1591;&#1576;&#1602;&#1611;&#1575; &#1604;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet.</p><h3>&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; Modules &#1601;&#1610; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;&#1617;</h3><p>&#1576;&#1593;&#1583; &#1571;&#1606;&#1617; &#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617; &#1608;&#1581;&#1583;&#1577; &#1605;&#1615;&#1576;&#1587;&#1617;&#1591;&#1548; &#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1593;&#1583;&#1575;&#1583; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;&#1617; (main manifest) &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607; &#1601;&#1610; &#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;lamp-1&rdquo;.</p><p>&#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;&#1617; &#1604;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1608;&#1575;&#1604;&#1584;&#1610; &#1610;&#1581;&#1605;&#1604; &#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;puppet&rdquo; &#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1581;&#1585;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;&#1617;:</p><pre class="ipsCode prettyprint">sudo vi /etc/puppet/manifests/site.pp</pre><p>&#1608;&#1605;&#1606; &#1579;&#1605;&#1617; &#1573;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577;&#1548; &#1605;&#1593; &#1575;&#1604;&#1575;&#1606;&#1578;&#1576;&#1575;&#1607; &#1571;&#1606;&#1617;&#1607; &#1601;&#1610; &#1581;&#1575;&#1604; &#1608;&#1580;&#1608;&#1583; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1615;&#1587;&#1576;&#1602;&#1577; &#1601;&#1610; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601;&#1617; &#1605;&#1606; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1571;&#1608;&#1604; &#1601;&#1604;&#1575; &#1576;&#1571;&#1587; &#1605;&#1606; &#1582;&#1584;&#1601;&#1607;&#1575;.</p><pre class="ipsCode prettyprint">node default { }

node 'lamp-1' {

}
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1578;&#1614;&#1587;&#1605;&#1581; &#1602;&#1591;&#1593;&#1577; &#1606;&#1602;&#1591;&#1577; node block &#1576;&#1578;&#1581;&#1583;&#1610;&#1583; &#1588;&#1610;&#1601;&#1585;&#1577; Puppet &#1575;&#1604;&#1578;&#1610; &#1587;&#1608;&#1601; &#1578;&#1615;&#1591;&#1576;&#1617;&#1602; &#1593;&#1604;&#1609; &#1606;&#1602;&#1591;&#1577; &#1593;&#1605;&#1610;&#1604; &#1605;&#1615;&#1593;&#1610;&#1606;&#1548; &#1608;&#1578;&#1615;&#1591;&#1576;&#1617;&#1602; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &ldquo;default&rdquo; &#1593;&#1604;&#1609; &#1580;&#1605;&#1610;&#1593; &#1606;&#1602;&#1575;&#1591; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1575;&#1604;&#1578;&#1610; &#1604;&#1575; &#1578;&#1605;&#1604;&#1603; &#1602;&#1591;&#1593;&#1577; &#1606;&#1602;&#1591;&#1577; &#1605;&#1615;&#1581;&#1583;&#1583;&#1577; &#1604;&#1607;&#1575;&#1548; &#1608;&#1607;&#1610; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1601;&#1575;&#1585;&#1594;&#1577; &#1608;&#1604;&#1606; &#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1593;&#1583;&#1610;&#1604; &#1593;&#1604;&#1610;&#1607;&#1575;. &#1605;&#1575; &#1610;&#1607;&#1605; &#1605;&#1606; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1607;&#1608; &#1602;&#1591;&#1593;&#1577; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1581;&#1605;&#1604; &#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;lamp-1&rdquo; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1587;&#1608;&#1601; &#1578;&#1615;&#1591;&#1576;&#1617;&#1602; &#1593;&#1604;&#1609; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &ldquo;lamp-1&rdquo; &#1601;&#1602;&#1591;.</span>
</pre><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1590;&#1605;&#1610;&#1606; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &ldquo;lamp&rdquo; &#1583;&#1575;&#1582;&#1604; &#1602;&#1591;&#1593;&#1577; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &ldquo;lamp-1&rdquo;.</p><pre class="ipsCode prettyprint">  include lamp</pre><p>&#1587;&#1578;&#1603;&#1608;&#1606; &#1575;&#1604;&#1606;&#1578;&#1610;&#1580;&#1577; &#1575;&#1604;&#1606;&#1607;&#1575;&#1574;&#1610;&#1617;&#1577; &#1604;&#1604;&#1605;&#1617;&#1604;&#1601;&#1617; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1593;&#1604;&#1609; &#1575;&#1604;&#1588;&#1603;&#1604; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">de default { } 

node 'lamp-1' {
  include lamp 
}              
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1576;&#1593;&#1583; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1548; &#1587;&#1578;&#1602;&#1608;&#1605; &#1606;&#1587;&#1582;&#1577; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &#1605;&#1606; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; </span><code style="line-height:1.6;">Puppet</code><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;"> &#1575;&#1604;&#1605;&#1608;&#1580;&#1608;&#1583;&#1577; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;lamp-1&rdquo; &#1593;&#1606;&#1583; &#1587;&#1581;&#1576; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1607;&#1575; &#1605;&#1606; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617;&#1548; &#1576;&#1578;&#1601;&#1587;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610; &#1608;&#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &ldquo;lamp&rdquo; &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1616;&#1586;&#1605; LAMP&#1548; &#1608;&#1601;&#1610; &#1581;&#1575;&#1604; &#1575;&#1604;&#1585;&#1594;&#1576;&#1577; &#1601;&#1610; &#1575;&#1604;&#1578;&#1580;&#1585;&#1576;&#1577; &#1575;&#1604;&#1605;&#1615;&#1576;&#1575;&#1588;&#1585;&#1577; &#1583;&#1608;&#1606; &#1575;&#1606;&#1578;&#1592;&#1575;&#1585; &#1575;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604; &#1575;&#1604;&#1578;&#1604;&#1602;&#1575;&#1574;&#1610;&#1617;&#1548; &#1576;&#1575;&#1604;&#1573;&#1605;&#1603;&#1575;&#1606; &#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;lamp&rdquo;</span>
</pre><pre class="ipsCode prettyprint">sudo puppet agent --test</pre><p>&#1576;&#1593;&#1583; &#1575;&#1587;&#1578;&#1603;&#1605;&#1575;&#1604; &#1603;&#1575;&#1601;&#1577; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1606; &#1575;&#1604;&#1580;&#1610;&#1617;&#1583; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1571;&#1606;&#1617; &#1575;&#1604;&#1571;&#1605;&#1608;&#1585; &#1578;&#1610;&#1587;&#1610;&#1585; &#1593;&#1604;&#1609; &#1605;&#1575;&#1610;&#1615;&#1585;&#1575;&#1605;&#1548; &#1608;&#1584;&#1604;&#1603; &#1576;&#1575;&#1587;&#1578;&#1593;&#1585;&#1575;&#1590; &#1575;&#1604;&#1589;&#1601;&#1581;&#1577; info.php &#1593;&#1604;&#1609; &#1582;&#1575;&#1583;&#1605; &ldquo;lamp&rdquo;.</p><pre class="ipsCode prettyprint">http://lamp_1 _IP/info.php</pre><p>&#1571;&#1608; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; cURL &#1605;&#1606; &#1575;&#1604;&#1591;&#1585;&#1601;&#1610;&#1617;&#1577; terminal.</p><p>&#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1604;&#1575;&#1581;&#1592; &#1571;&#1606;&#1617;&#1607; &#1576;&#1575;&#1604;&#1573;&#1605;&#1603;&#1575;&#1606; &#1575;&#1604;&#1570;&#1606; &#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;lamp&rdquo; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1572;&#1607;&#1575; &#1576;&#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606;&#1607;&#1575; &#1601;&#1610; node blocks &#1571;&#1615;&#1582;&#1585;&#1609;. &#1573;&#1606;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1607;&#1608; &#1571;&#1601;&#1590;&#1604; &#1591;&#1585;&#1610;&#1602;&#1577; &#1604;&#1578;&#1607;&#1610;&#1574;&#1577; &#1588;&#1610;&#1601;&#1585;&#1577; Puppet &#1604;&#1573;&#1593;&#1575;&#1583;&#1577; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1607;&#1575; &#1605;&#1585;&#1617;&#1577; &#1571;&#1615;&#1582;&#1585;&#1609;&#1548; &#1603;&#1605;&#1575; &#1571;&#1606;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1610;&#1615;&#1587;&#1575;&#1593;&#1583; &#1593;&#1604;&#1609; &#1578;&#1606;&#1592;&#1610;&#1605; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1576;&#1571;&#1587;&#1604;&#1608;&#1576; &#1605;&#1606;&#1591;&#1602;&#1610;&#1617;&#1548; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1584;&#1610; &#1610;&#1606;&#1593;&#1603;&#1587; &#1593;&#1604;&#1609; &#1602;&#1585;&#1575;&#1569;&#1577; &#1608;&#1601;&#1607;&#1605; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1577; <code>Puppet</code>.</p><h2>&#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1579;&#1617;&#1575;&#1604;&#1579;: &#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1608;&#1581;&#1583;&#1575;&#1578; &#1605;&#1615;&#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1576;&#1602;&#1611;&#1575;</h2><p>&#1610;&#1608;&#1580;&#1583; &#1605;&#1615;&#1587;&#1578;&#1608;&#1583;&#1593;&#1612; &#1582;&#1575;&#1589;&#1617;&#1612; &#1576;&#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1605;&#1615;&#1578;&#1608;&#1601;&#1617;&#1585; &#1593;&#1604;&#1609; <a rel="external nofollow" href="https://forge.puppetlabs.com/">Puppet Forge</a>&#1548; &#1608;&#1575;&#1604;&#1584;&#1610; &#1610;&#1615;&#1587;&#1607;&#1604; &#1605;&#1606; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1593;&#1606;&#1583; &#1578;&#1591;&#1608;&#1610;&#1585; &#1575;&#1604;&#1576;&#1616;&#1606;&#1618;&#1610;&#1614;&#1577; &#1575;&#1604;&#1578;&#1617;&#1614;&#1581;&#1618;&#1578;&#1616;&#1610;&#1617;&#1614;&#1577;. &#1610;&#1615;&#1605;&#1603;&#1606; &#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1576;&#1602;&#1611;&#1575; &#1576;&#1588;&#1603;&#1604;&#1613; &#1587;&#1585;&#1610;&#1593;&#1613; &#1593;&#1576;&#1585; &#1575;&#1604;&#1571;&#1605;&#1585; <span style="font-family:'courier new', courier, monospace;"><code>puppet module</code></span>&#1548; &#1608;&#1605;&#1606; &#1590;&#1605;&#1606; &#1607;&#1584;&#1607; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1575;&#1604;&#1605;&#1615;&#1593;&#1583;&#1617;&#1577; &#1605;&#1615;&#1587;&#1576;&#1602;&#1611;&#1575; &#1610;&#1608;&#1580;&#1583; &#1608;&#1581;&#1583;&#1575;&#1578; &#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1578;&#1606;&#1589;&#1610;&#1576; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache &#1608;&#1582;&#1575;&#1583;&#1605; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; MySQL. &#1604;&#1584;&#1604;&#1603; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;&#1615; &#1607;&#1584;&#1607; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1575;&#1604;&#1580;&#1575;&#1607;&#1586;&#1577; &#1601;&#1610; &#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1616;&#1586;&#1605; LAMP.</p><h3>&#1578;&#1606;&#1589;&#1610;&#1576; &#1608;&#1581;&#1583;&#1575;&#1578; Apache &#1608;MySQL</h3><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1584;&#1575;&#1578; &#1575;&#1604;&#1575;&#1587;&#1605; <span style="font-family:'courier new', courier, monospace;"><code>puppetlabs-apache</code></span> &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;master&rdquo; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">sudo puppet module install puppetlabs-apache</pre><p>&#1610;&#1614;&#1593;&#1585;&#1590; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1605;&#1615;&#1582;&#1585;&#1580;&#1575;&#1578; &#1578;&#1615;&#1588;&#1610;&#1585; &#1573;&#1604;&#1609; &#1578;&#1606;&#1589;&#1610;&#1576; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1576;&#1588;&#1603;&#1604; &#1589;&#1581;&#1610;&#1581;:</p><pre class="ipsCode prettyprint">Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
&#9492;&#9472;&#9516; puppetlabs-apache (v1.0.1)
  &#9500;&#9472;&#9472; puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
  &#9492;&#9472;&#9472; puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1571;&#1610;&#1590;&#1611;&#1575; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1582;&#1575;&#1583;&#1605; &#1602;&#1575;&#1593;&#1583;&#1577; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; </span><span style="font-family:'courier new', courier, monospace;"><code style="line-height:1.6;">puppetlabs-mysql</code></span><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">:</span>
</pre><pre class="ipsCode prettyprint">sudo puppet module install puppetlabs-mysql</pre><p>&#1608;&#1576;&#1607;&#1584;&#1575; &#1578;&#1603;&#1608;&#1606; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &ldquo;apache&rdquo; &#1608;&rdquo;mysql&rdquo; &#1580;&#1575;&#1607;&#1586;&#1577; &#1604;&#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605;.</p><h3>&#1578;&#1581;&#1585;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;</h3><p>&#1571;&#1605;&#1575; &#1575;&#1604;&#1570;&#1606; &#1608;&#1576;&#1593;&#1583; &#1571;&#1606;&#1617; &#1578;&#1605;&#1617; &#1578;&#1581;&#1605;&#1610;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578;&#1548; &#1587;&#1610;&#1578;&#1605;&#1617; &#1578;&#1581;&#1585;&#1610;&#1585; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610; &#1604;&#1610;&#1587;&#1578;&#1582;&#1583;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577; &#1604;&#1578;&#1606;&#1589;&#1610;&#1576; &#1581;&#1616;&#1586;&#1605; LAMP&#1548; &#1608;&#1584;&#1604;&#1603; &#1576;&#1578;&#1581;&#1585;&#1610;&#1585; &#1607;&#1584;&#1575; &#1575;&#1604;&#1605;&#1604;&#1601; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;master&rdquo;.</p><pre class="ipsCode prettyprint">sudo vi /etc/puppet/manifests/site.pp<code>
</code></pre><p>&#1610;&#1615;&#1605;&#1603;&#1606; &#1581;&#1584;&#1601; &#1571;&#1610;&#1617;&#1577; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1605;&#1615;&#1587;&#1576;&#1602;&#1577; &#1601;&#1610; &#1581;&#1575;&#1604; &#1608;&#1580;&#1608;&#1583;&#1607;&#1575;&#1548; &#1608;&#1605;&#1606; &#1579;&#1605;&#1617; &#1573;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577;:</p><pre class="ipsCode prettyprint">node default { }

node 'lamp-1' {

}</pre><p>&#1587;&#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1593;&#1606; &#1589;&#1606;&#1601; &#1576;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1606;&#1605;&#1591; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1604;&#1610;&#1587;&#1578;&#1582;&#1583;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1581;&#1605;&#1604; &#1575;&#1604;&#1575;&#1587;&#1605; &ldquo;apache&rdquo;&#1548; &#1608;&#1584;&#1604;&#1603; &#1583;&#1575;&#1582;&#1604; &#1575;&#1604;&#1606;&#1602;&#1591;&#1577; &ldquo;lamp-1&rdquo;:</p><pre class="ipsCode prettyprint">class { 'apache':                # use the "apache" module
    default_vhost =&gt; false,        # don't use the default vhost
    default_mods =&gt; false,         # don't load default mods
    mpm_module =&gt; 'prefork',       # use the "prefork" mpm_module
  }
   include apache::mod::php        # include mod php
   apache::vhost { 'example.com':  # create a vhost called "example.com"
    port    =&gt; '80',               # use port 80
    docroot =&gt; '/var/www/html',    # set the docroot to the /var/www/html
  }</pre><p>&#1578;&#1602;&#1576;&#1604; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &ldquo;apache&rdquo; &#1605;&#1615;&#1593;&#1575;&#1605;&#1604;&#1575;&#1578; parameters&#1548; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1605;&#1606; &#1588;&#1571;&#1606;&#1607;&#1575; &#1573;&#1604;&#1594;&#1575;&#1569; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1607;&#1575;&#1548; &#1601;&#1610; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1577; &#1578;&#1605;&#1617; &#1578;&#1605;&#1585;&#1610;&#1585; &#1576;&#1593;&#1590; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1576;&#1587;&#1610;&#1591;&#1577;&#1548; &#1581;&#1610;&#1579;&#1615; &#1578;&#1605;&#1617; &#1578;&#1593;&#1591;&#1610;&#1604; &#1575;&#1604;&#1605;&#1615;&#1590;&#1610;&#1601; &#1575;&#1604;&#1575;&#1601;&#1578;&#1585;&#1575;&#1590;&#1610;&#1617;&#1548; &#1608;&#1575;&#1604;&#1575;&#1587;&#1578;&#1593;&#1575;&#1590;&#1577; &#1593;&#1606;&#1607; &#1576;&#1605;&#1615;&#1590;&#1610;&#1601; &#1610;&#1587;&#1578;&#1591;&#1610;&#1593; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; PHP&#1548; &#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604;&#1548; &#1610;&#1615;&#1605;&#1603;&#1606; &#1605;&#1615;&#1585;&#1575;&#1580;&#1593;&#1577; <a rel="external nofollow" href="https://forge.puppetlabs.com/puppetlabs/apache">&#1575;&#1604;&#1605;&#1608;&#1602;&#1593; &#1575;&#1604;&#1585;&#1587;&#1605;&#1610;&#1617;</a>.</p><p>&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1582;&#1575;&#1583;&#1605; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; MySQL &#1605;&#1615;&#1588;&#1575;&#1576;&#1607; &#1604;&#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; Apache. &#1604;&#1606; &#1610;&#1578;&#1605;&#1617; &#1578;&#1593;&#1602;&#1610;&#1583; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1607;&#1606;&#1575; &#1576;&#1575;&#1593;&#1578;&#1576;&#1575;&#1585; &#1571;&#1606;&#1617;&#1607; &#1604;&#1606; &#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1602;&#1608;&#1575;&#1593;&#1583; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606;&#1575;&#1578; &#1601;&#1610; &#1605;&#1579;&#1575;&#1604;&#1606;&#1575; &#1576;&#1588;&#1603;&#1604;&#1613; &#1601;&#1593;&#1604;&#1610;&#1617;. &#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1590;&#1575;&#1601;&#1577; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1573;&#1604;&#1609; &#1583;&#1575;&#1582;&#1604; node block.</p><pre class="ipsCode prettyprint"> class { 'mysql::server':
    root_password =&gt; 'password',
  }</pre><p>&#1603;&#1605;&#1575; &#1601;&#1610; &#1608;&#1581;&#1583;&#1577; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache&#1548; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1605;&#1603;&#1606; &#1578;&#1582;&#1589;&#1610;&#1589; &#1573;&#1593;&#1583;&#1575;&#1583; &#1608;&#1581;&#1583;&#1577; MySQL &#1576;&#1578;&#1605;&#1585;&#1610;&#1585; &#1605;&#1615;&#1593;&#1575;&#1605;&#1604;&#1575;&#1578; parameters&#1548; &#1608;&#1604;&#1605;&#1586;&#1610;&#1583; &#1605;&#1606; &#1575;&#1604;&#1578;&#1601;&#1575;&#1589;&#1610;&#1604; &#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1604;&#1585;&#1580;&#1608;&#1593; &#1573;&#1604;&#1609; <a rel="external nofollow" href="https://forge.puppetlabs.com/puppetlabs/mysql">&#1575;&#1604;&#1605;&#1608;&#1602;&#1593; &#1575;&#1604;&#1585;&#1587;&#1605;&#1610;&#1617;</a>.</p><p>&#1571;&#1605;&#1575; &#1575;&#1604;&#1570;&#1606; &#1601;&#1587;&#1610;&#1578;&#1605;&#1617; &#1573;&#1590;&#1575;&#1601;&#1577; &#1605;&#1614;&#1604;&#1601;&#1617; &#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1605;&#1615;&#1607;&#1605;&#1578;&#1607; &#1575;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1606;&#1587;&#1582; &#1575;&#1604;&#1605;&#1601; info.php &#1573;&#1604;&#1609; &#1575;&#1604;&#1605;&#1603;&#1575;&#1606; &#1575;&#1604;&#1605;&#1615;&#1604;&#1575;&#1574;&#1605;. &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1585;&#1617;&#1577; &#1587;&#1610;&#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1605;&#1604; &ldquo;source&rdquo;&#1548; &#1603;&#1605;&#1575; &#1607;&#1608; &#1605;&#1615;&#1608;&#1590;&#1581; &#1601;&#1610; &#1575;&#1604;&#1587;&#1591;&#1608;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577;.</p><pre class="ipsCode prettyprint">  file { 'info.php':                                # file resource name
    path =&gt; '/var/www/html/info.php',               # destination path
    ensure =&gt; file,
    require =&gt; Class['apache'],                     # require apache class be used
    source =&gt; 'puppet:///modules/apache/info.php',  # specify location of file to be copied
  }</pre><p>&#1610;&#1582;&#1578;&#1604;&#1601; &#1575;&#1604;&#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1606;&#1587;&#1576;&#1610;&#1611;&#1575; &#1593;&#1605;&#1617;&#1575; &#1578;&#1605;&#1617; &#1587;&#1575;&#1576;&#1602;&#1611;&#1575;&#1548; &#1575;&#1604;&#1575;&#1582;&#1578;&#1604;&#1575;&#1601; &#1607;&#1608; &#1571;&#1606;&#1617;&#1607; &#1578;&#1605;&#1617; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1605;&#1604; &ldquo;source&rdquo; &#1576;&#1583;&#1604;&#1611;&#1575; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1605;&#1604; &ldquo;content&rdquo;&#1548; &#1581;&#1610;&#1579;&#1615; &#1610;&#1582;&#1576;&#1585; &#1575;&#1604;&#1605;&#1615;&#1593;&#1575;&#1605;&#1604; &ldquo;Source&rdquo; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1576;&#1571;&#1606;&#1617; &#1578;&#1602;&#1608;&#1605; &#1576;&#1606;&#1587;&#1582; &#1575;&#1604;&#1605;&#1614;&#1604;&#1601; &#1576;&#1583;&#1604;&#1611;&#1575; &#1605;&#1606; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1581;&#1578;&#1608;&#1575;&#1607;. &#1578;&#1615;&#1601;&#1587;&#1617;&#1585; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Puppet &#1575;&#1604;&#1605;&#1589;&#1583;&#1585; &#1575;&#1604;&#1605;&#1615;&#1581;&#1583;&#1583; (&#1575;&#1604;&#1602;&#1610;&#1605;&#1577;) <span style="font-family:'courier new', courier, monospace;"><code>puppet:///modules/apache/info.php</code></span> &#1573;&#1604;&#1609; <span style="font-family:'courier new', courier, monospace;"><code>/etc/puppet/modules/apache/files/info.php</code></span>&#1548; &#1608;&#1604;&#1584;&#1604;&#1603; &#1610;&#1580;&#1576; &#1573;&#1606;&#1588;&#1575;&#1569; &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585; &#1604;&#1603;&#1610; &#1610;&#1593;&#1605;&#1604; &#1578;&#1589;&#1585;&#1610;&#1581; &#1575;&#1604;&#1605;&#1614;&#1608;&#1585;&#1616;&#1583; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602; &#1576;&#1588;&#1603;&#1604; &#1589;&#1581;&#1610;&#1581;.</p><p>&#1610;&#1578;&#1605;&#1617; &#1573;&#1606;&#1588;&#1575;&#1569; &#1575;&#1604;&#1605;&#1604;&#1601; <span style="font-family:'courier new', courier, monospace;"><code>info.php</code></span> &#1576;&#1578;&#1606;&#1601;&#1610;&#1584; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;:</p><pre class="ipsCode prettyprint">sudo sh -c 'echo "&lt;?php  phpinfo(); ?&gt;" &gt; /etc/puppet/modules/apache/files/info.php'
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">&#1576;&#1593;&#1583; &#1571;&#1606;&#1617; &#1610;&#1602;&#1608;&#1605; &#1575;&#1604;&#1593;&#1605;&#1610;&#1604; &ldquo;lamp-1&rdquo; &#1576;&#1587;&#1581;&#1576; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1607; &#1605;&#1606; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617;&#1548; &#1587;&#1610;&#1602;&#1608;&#1605; &#1576;&#1578;&#1601;&#1587;&#1610;&#1585; evaluate &#1605;&#1614;&#1604;&#1601;&#1617; &#1575;&#1604;&#1576;&#1610;&#1575;&#1606; &#1575;&#1604;&#1585;&#1574;&#1610;&#1587;&#1610;&#1617; &#1608;&#1578;&#1591;&#1576;&#1610;&#1602; &#1575;&#1604;&#1608;&#1581;&#1583;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1615;&#1588;&#1603;&#1604; &#1573;&#1593;&#1583;&#1575;&#1583; &#1581;&#1616;&#1586;&#1605; LAMP. &#1604;&#1578;&#1591;&#1576;&#1610;&#1602; &#1575;&#1604;&#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578; &#1575;&#1604;&#1580;&#1583;&#1610;&#1583;&#1577; &#1576;&#1588;&#1603;&#1604; &#1605;&#1615;&#1576;&#1575;&#1588;&#1585; &#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1605;&#1585; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &ldquo;lamp-1&rdquo;:</span><code>
</code></pre><pre class="ipsCode prettyprint">sudo puppet agent --test</pre><p>&#1576;&#1593;&#1583; &#1575;&#1604;&#1575;&#1606;&#1578;&#1607;&#1575;&#1569;&#1548; &#1587;&#1578;&#1603;&#1608;&#1606; &#1581;&#1616;&#1586;&#1605; LAMP &#1605;&#1615;&#1606;&#1589;&#1576;&#1577;&#1548; &#1603;&#1605;&#1575; &#1601;&#1610; &#1575;&#1604;&#1605;&#1579;&#1575;&#1604; &#1575;&#1604;&#1571;&#1608;&#1604;&#1548; &#1608;&#1604;&#1604;&#1578;&#1571;&#1603;&#1583; &#1605;&#1606; &#1593;&#1605;&#1604; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache &#1608;PHP&#1548; &#1610;&#1615;&#1605;&#1603;&#1606; &#1575;&#1587;&#1578;&#1593;&#1585;&#1575;&#1590; &#1575;&#1604;&#1589;&#1601;&#1581;&#1577; &#1575;&#1604;&#1578;&#1617;&#1575;&#1604;&#1610;&#1577;:</p><pre class="ipsCode prettyprint">http://lamp_1 _IP/info.php</pre><p>&#1578;&#1614;&#1593;&#1585;&#1590; &#1575;&#1604;&#1589;&#1601;&#1581;&#1577; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1577; &#1605;&#1593;&#1604;&#1608;&#1605;&#1575;&#1578; &#1593;&#1606; &#1575;&#1587;&#1578;&#1603;&#1605;&#1575;&#1604; &#1578;&#1606;&#1589;&#1610;&#1576; &#1605;&#1615;&#1601;&#1587;&#1617;&#1585; PHP &#1576;&#1588;&#1603;&#1604;&#1613; &#1605;&#1615;&#1604;&#1575;&#1574;&#1605;&#1548; &#1571;&#1610;&#1590;&#1611;&#1575; &#1576;&#1584;&#1604;&#1603; &#1610;&#1603;&#1608;&#1606; &#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1608;&#1610;&#1576; Apache &#1605;&#1615;&#1606;&#1589;&#1576;&#1611;&#1575; &#1576;&#1588;&#1603;&#1604; &#1589;&#1581;&#1610;&#1581;.</p><h2>&#1575;&#1604;&#1582;&#1575;&#1578;&#1605;&#1577;</h2><p>&#1601;&#1610; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1585;&#1581;&#1604;&#1577; &#1608;&#1576;&#1593;&#1583; &#1605;&#1615;&#1578;&#1575;&#1576;&#1593;&#1577; &#1575;&#1604;&#1571;&#1605;&#1579;&#1604;&#1577; &#1575;&#1604;&#1587;&#1575;&#1576;&#1602;&#1577; &#1608;&#1578;&#1591;&#1576;&#1610;&#1602;&#1607;&#1575;&#1548; &#1608;&#1575;&#1604;&#1617;&#1578;&#1610; &#1602;&#1614;&#1583;&#1605;&#1578; &#1605;&#1593;&#1585;&#1601;&#1577; &#1571;&#1587;&#1575;&#1587;&#1610;&#1577; &#1601;&#1610; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1588;&#1610;&#1601;&#1585;&#1577; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617;&#1577; &#1576;&#1575;&#1604;&#1571;&#1583;&#1575;&#1577; <code>Puppet</code>&#1548; &#1608;&#1591;&#1585;&#1610;&#1602;&#1577; &#1603;&#1578;&#1575;&#1576;&#1577; &#1605;&#1614;&#1604;&#1601;&#1617; &#1576;&#1610;&#1575;&#1606;&#1613; &#1605;&#1615;&#1576;&#1587;&#1617;&#1591;&#1548; &#1608;&#1578;&#1591;&#1608;&#1610;&#1585; &#1575;&#1604;&#1608;&#1581;&#1583;&#1575;&#1578; modules&#1548; &#1571;&#1589;&#1576;&#1581; &#1605;&#1606; &#1575;&#1604;&#1605;&#1615;&#1605;&#1603;&#1606; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; <code>Puppet</code> &#1604;&#1573;&#1593;&#1583;&#1575;&#1583; &#1571;&#1605;&#1608;&#1585;&#1613; &#1571;&#1615;&#1582;&#1585;&#1609; &#1601;&#1610; &#1605;&#1606;&#1592;&#1608;&#1605;&#1577; &#1575;&#1604;&#1582;&#1608;&#1575;&#1583;&#1605;&#1548; &#1608;&#1573;&#1583;&#1575;&#1585;&#1578;&#1607;&#1575; &#1576;&#1588;&#1603;&#1604; &#1610;&#1615;&#1604;&#1576;&#1610; &#1575;&#1604;&#1581;&#1575;&#1580;&#1577; &#1571;&#1603;&#1579;&#1585; &#1605;&#1605;&#1575; &#1607;&#1608; &#1593;&#1604;&#1610;&#1607; &#1575;&#1604;&#1571;&#1605;&#1585; &#1605;&#1606; &#1583;&#1608;&#1606;&#1607;&#1575;.</p><p>&#1610;&#1615;&#1593;&#1578;&#1576;&#1585; &#1575;&#1587;&#1578;&#1582;&#1583;&#1575;&#1605; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; <code>Puppet</code> &#1601;&#1610; &#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1606;&#1592;&#1575;&#1605; &#1608;&#1575;&#1604;&#1605;&#1615;&#1587;&#1578;&#1582;&#1583;&#1605;&#1610;&#1606; &#1608;&#1575;&#1604;&#1578;&#1591;&#1576;&#1610;&#1602;&#1575;&#1578; &#1608;&#1594;&#1610;&#1585;&#1607; &#1605;&#1606; &#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1583; &#1576;&#1583;&#1575;&#1610;&#1577;&#1611; &#1580;&#1610;&#1617;&#1583;&#1577; &#1604;&#1575;&#1587;&#1578;&#1594;&#1604;&#1575;&#1604; &#1607;&#1584;&#1607; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; &#1576;&#1575;&#1604;&#1588;&#1603;&#1604; &#1575;&#1604;&#1571;&#1605;&#1579;&#1604;. &#1605;&#1593; &#1575;&#1604;&#1575;&#1606;&#1578;&#1576;&#1575;&#1607; &#1573;&#1604;&#1609; &#1571;&#1606;&#1617; &#1578;&#1594;&#1610;&#1610;&#1585; &#1607;&#1584;&#1607; &#1575;&#1604;&#1605;&#1614;&#1608;&#1575;&#1585;&#1583; &#1610;&#1580;&#1576; &#1571;&#1606;&#1617; &#1610;&#1578;&#1605;&#1617; &#1593;&#1604;&#1609; &#1575;&#1604;&#1582;&#1575;&#1583;&#1605; &#1575;&#1604;&#1605;&#1614;&#1585;&#1603;&#1586;&#1610;&#1617;&#1548; &#1608;&#1573;&#1604;&#1575; &#1587;&#1608;&#1601; &#1610;&#1578;&#1605; &#1573;&#1604;&#1594;&#1575;&#1569; &#1607;&#1584;&#1607; &#1575;&#1604;&#1578;&#1594;&#1610;&#1610;&#1585;&#1575;&#1578; &#1601;&#1610; &#1575;&#1604;&#1605;&#1585;&#1617;&#1577; &#1575;&#1604;&#1602;&#1575;&#1583;&#1605;&#1577; &#1575;&#1604;&#1617;&#1578;&#1610; &#1578;&#1602;&#1608;&#1605; &#1576;&#1607;&#1575; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569; &#1576;&#1575;&#1604;&#1575;&#1578;&#1589;&#1575;&#1604; &#1575;&#1604;&#1583;&#1608;&#1585;&#1610;&#1617; &#1604;&#1587;&#1581;&#1576; &#1573;&#1593;&#1583;&#1575;&#1583;&#1575;&#1578;&#1607;&#1575; &#1605;&#1606; &#1575;&#1604;&#1601;&#1607;&#1585;&#1587; &#1575;&#1604;&#1582;&#1575;&#1589;&#1617; &#1576;&#1607;&#1575;.</p><p>&#1601;&#1610; &#1575;&#1604;&#1580;&#1586;&#1569; &#1575;&#1604;&#1579;&#1617;&#1575;&#1604;&#1579; &#1608;&#1575;&#1604;&#1571;&#1582;&#1610;&#1585; &#1605;&#1606; <a href="http://academy.hsoub.com/search/?tags=%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85+puppet+%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85">&#1607;&#1584;&#1607; &#1575;&#1604;&#1587;&#1604;&#1587;&#1604;&#1577;</a> &#1587;&#1610;&#1578;&#1605;&#1617; &#1575;&#1604;&#1578;&#1593;&#1585;&#1617;&#1601; &#1593;&#1604;&#1609; &#1575;&#1604;&#1571;&#1583;&#1575;&#1577; Foreman &#1604;&#1573;&#1583;&#1575;&#1585;&#1577; &#1575;&#1604;&#1593;&#1615;&#1605;&#1604;&#1575;&#1569;.&nbsp;</p><p>&#1578;&#1585;&#1580;&#1605;&#1577; -&#1608;&#1576;&#1578;&#1589;&#1585;&#1617;&#1601;- &#1604;&#1604;&#1605;&#1602;&#1575;&#1604;&nbsp;<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/getting-started-with-puppet-code-manifests-and-modules">Getting Started With Puppet Code: Manifests and Modules</a></p>
]]></description><guid isPermaLink="false">22</guid><pubDate>Mon, 30 Mar 2015 13:48:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628; Puppet &#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x628;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x651;&#x64E;&#x62D;&#x62A;&#x650;&#x64A;&#x651;&#x64E;&#x629; &#x644;&#x644;&#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;</title><link>https://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/puppet_480x300.png.712b9cdb5ffbded9d2c5fd1f5eb74389.png" /></p>

<p><span style="line-height:1.6;">ستتناول هذه السلسلة حول </span><a href="http://academy.hsoub.com/search/?tags=%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85+puppet+%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85">استخدام puppet لإدارة الخواديم</a><span style="line-height:1.6;">، والّتي هي عبارة عن ثلاثة أجزاء، الأداة Puppet وما تُقدمه لمُدراء الخوادم من تسهيلات في إدارة وإعداد الخوادم، وكيفيّة كتابة الشيفرة الخاصّة بهذه الأداة، كما سيتمّ التعامل مع الأداة Foreman والتعرّف على ماتُقدمه في هذا الخصوص. تُركز السلسلة على التطبيق العمليّ، لذلك يُنصح بالتطبيق المُباشر للأفكار المَطروحة فذلك أفضل سبيلٍ لتثبيث المَعلومة واحتراف التعامل مع هذه الأداة.</span></p><p>مقالات سلسلة "<a style="line-height: 24.8888893127441px;" href="http://academy.hsoub.com/search/?tags=%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85+puppet+%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85">استخدام puppet لإدارة الخواديم</a> :</p><ul><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-puppet-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%91%D9%8E%D8%AD%D8%AA%D9%90%D9%8A%D9%91%D9%8E%D8%A9-%D9%84%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r16/">تنصيب Puppet لإدارة البنية التَّحتِيَّة للخواديم</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86-manifests-%D9%88%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%81%D9%8A-puppet-r22/">ملفّات البيان (Manifests) والوحدات (Modules) في Puppet</a></li><li><a href="http://academy.hsoub.com/devops/deployment/puppet/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-foreman-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%86%D9%82%D8%A7%D8%B7-puppet-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ubuntu-1404-r32/">كيف تستخدم Foreman لإدارة نقاط Puppet على الخادوم Ubuntu 14.04</a></li></ul><p> </p><h2>مُقدّمة</h2><p>تُقدم مَعامل Puppet أداةً لإدارة الإعدادات وتُطلق عليها Puppet، ومُهمتها مُساعدةُ مُدراء الأنظمة في أتمتت الإعداد المُسبق provisioning وإعداد وإدارة البِنْيَة التَّحْتِيَّة الخاصّة بالخوادم. يُقلل التخطيط المُسبق واستخدام أدوات إدارة الإعدادات مثل الأداة Puppet من الوقت المُستغرق في تكرار المَهام الأساسية، ويُساعد على التأكّد من أنّ الإعدادات مَضْبُوطَةً بشكل دقيق، وتقومُ على أساسٍ واحد فيما بينها في جميع الخوادم. سيتوفّر المَزيد مِن الوقت الذي من المُمكن استغلاله في تحسين جوانب أُخرى في إعداد مَنظومة العمل، بعد احتراف إدارة الخوادم باستخدام الأداة Puppet أو حتّى أي أداة أتمتة أُخرى.</p><p>يتوفّر إصداران من الأداة Puppet، إصدار المشاريع الكبيرة والمؤسسات Puppet Enterprise، والمَفتوح المَصدر. تعمل الأداة Puppet على مُعظم توزيعات نظام التشغيل لينكس ومُختلف مِنصّات UNIX وأنظمة التشغيل Windows.</p><p>سيتناول هذا الشرح كيفيّة تنصيب الإصدار مفتوح المَصدر من الأداة Puppet على نظام رئيسيّ Master ومُمثل/عميل Agent، حيثُ يتألّف هذا النظام أو التقسيم من خادمٍ مركزيّ Puppet Master يحتوي جميع الإعدادات والبيانات المطلوبة لاستكمال المنظومة الإدارية للخوادم، وباقي الخوادم هي عُمَلاء للجهاز المَركزيّ Puppet Agent، والتي تُدار من قِبَله.</p><h2>مُتَطَلَّبات بيئة العمل</h2><p>يَتطلّب تطبيق وإتمام هذا الشرح صلاحيّة وصولٍ كامل root access على جميع الخوادم الّتي ستكون جزء من منظومة Puppet، كما يُطلب إنشاء خادم جديد بتوزيعة Ubuntu الإصدار 14.04 والذي سوف يُمثل النظام المَركزيّ للأداة Puppet.</p><p>قبل الشروع بتنصيب الأداة Puppet يجب التأكّد من الأمور التّالية:</p><ul><li>نظام أسماء النطاقات DNS للشبكة الخاصّة: يجب إعداد خادم DNS لتحويل العناوين بالاتّجاهين، من الأسماء إلى IPs ومن IPs إلى الأسماء، ويَجب على كل خادم أنّ يَمتلك اسمًا فريدًا خاصًا به. يُمكن الرجوع إلى الشرح التّالي بعنوان:<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04"> إعداد خادم الـ DNS في الشبكة الداخليّة</a> لإعداد الخادم الداخليّ، ويَجب استخدام المَلفّ hosts لترجمة الأسماء إلى عنوانين IPs بشكلٍ يدويٍّ في حال عدم توفّر مُخدم DNS.</li><li>مَنافِذُ مَفتوحة على الجدارِ الناريّ firewall: تعمل الأداة Puppet على المنفذ 8140، لذلك في حال وجود جدارٍ ناريٍّ يُقيد الوصول عبر هذا المنفذ فيُمكن الرجوع إلى الشرح الخاصّ بالأداة <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server">UFW</a> لاستعراض الخطواط المَطلوبة للسماح بمرور الطلبات عَبْر هذا المَنفذ.</li></ul><p>سيتمّ العمل على الخوادم التّالية الآن، ولاحقًا سيُضاف إليها خادمٌ في الجزء الثّاني، وآخر في الثّالث.</p><p> </p><p style="text-align:center;"><a class="ipsAttachLink ipsAttachLink_image" rel="external nofollow" href="https://academy.hsoub.com/uploads/monthly_2015_03/vps-network-diagram.png.31c0ed8d8954a51b50ecbcdf7e20be92.png"><img data-fileid="654" class="ipsImage ipsImage_thumbnailed" alt="vps-network-diagram.thumb.png.dfa1d1dba2" src="https://academy.hsoub.com/uploads/monthly_2015_03/vps-network-diagram.thumb.png.dfa1d1dba2944a1aeb646a16c58cd0dc.png"></a></p><p>ستتمّ تنصيب الأداة Puppet على جميع الخوادم السابقة. بيئة العمل السابقة هي نفسها الّتي تمّ العمل بها في <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04">هذا الدّرس</a>.</p><h2>إنشاء الخادوم المَركزيّ Puppet Master Server</h2><p>سيتمُّ استخدام توزيعة أوبونتو الإصدار 14.04 لتَكوْن الخادم المَركزيّ، ويحمل الخادم الاسم “puppet”.</p><p>يُمكن الرُجوع إلى القسم الخاصّ بـ<a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-configure-bind-as-a-private-network-dns-server-on-ubuntu-14-04#MaintainingDNSRecords"> صيانة سجلات DNS</a> في حال عدم توفّر المَعرفة لفعل ذلك. في حقيقة الأمر كل ما يجب عمله هو إضافة سجلّين الأول من نوع "A" والثاني من نوع "PRT"، والسماح للعميل الجديد بعمل استعلامات دوريّة recursive queries، وأيضًا يجب التأكد من إعداد DNS لترجمة أسماء الخوادم من دون استخدام "اسم النطاق المُؤهل بالكامل" Fully Qualified Domain Name.</p><p>استخدام الاسم "puppet" للجهاز المَركزيّ سوف يُبسّط إعداد خوادم العُملاء بشكلٍ نسبيٍّ، وذلك لأنّه الاسم الافتراضيّ الذي سوف تَستخدمه هذه العُملاء عند مُحاولتها الاتصال مع الخادم الرئيسيّ Puppet Master.</p><h3>تنصيب NTP</h3><p>يجب على الخادم الرئيسيّ/المَركزيّ puppet master الحفاظ على توقيتٍ دقيقٍ في ساعة النظام لتفادي أو تجنب المشاكل المُحتملة عند إصدار شهادات العُملاء، وذلك بصفته مُفوّض الشّهادة للعُملاء agent. حيثُ كما يبدو أنّ صلاحيّة هذه الشهادات قد تنتهي عند وجود تعارضٍ في الوقت، ومن أجل ذلك سوف نستخدم "بروتوكول توقيت الشبكة" Network Time Protocol والذي يُشار إليه بالاختصار NTP.</p><p>من المُمكن عمل مُزامنة يدويّة ولمرّة واحدة باستخدام الأمر ntpdate</p><pre class="php ipsCode prettyprint">sudo ntpdate pool.ntp.org</pre><p>يقوم الأمر السابق بتحديث الوقت، ولكن من الضروريّ الاعتماد على الأداة <span style="font-family:'courier new', courier, monospace;">ntpd</span> من أجل المُزامنة التلقائيّة وذلك من شأنه أنّ يقلّل من زمن ظاهرة "<a rel="external nofollow" href="https://en.wikipedia.org/wiki/Clock_drift">انجراف الوقت</a>" Clock drift.</p><pre class="html ipsCode prettyprint">sudo apt-get update &amp;&amp; sudo apt-get -y install ntp</pre><p>من الشائع تحديث إعدادات بروتوكول NTP ليستخدم "pools zones" قريبةً جغرافيًا من خادم NTP، حيثُ من المُمكن الرجوع إلى <a rel="external nofollow" href="http://www.pool.ntp.org/en/">مشروع NTP</a> والبحث عن أقرب pool zone إلى مركز البيانات datacenter المُستخدم، وللتعديل سوف يتمّ تحرير الملف المُسمى ntp.conf بواسطة المُحرر Vi، والذي سوف يتمّ استخدامه طوال هذه السلسلة في التحرير.</p><pre class="php ipsCode prettyprint">sudo vi /etc/ntp.conf</pre><p>سوف يتمّ إضافة الخوادم التّالية في بداية مَلفّ الإعدادات:</p><pre class="php ipsCode prettyprint">server 0.us.pool.ntp.org
server 1.us.pool.ntp.org
server 2.us.pool.ntp.org
server 3.us.pool.ntp.org</pre><p>يتمّ حِفظ الإعدادات السابقة إما بتنفيذ الأمر <span style="font-family:'courier new', courier, monospace;">:wq</span>، أي الحفظ والخروج، أو عبر الاختصار <span style="font-family:'courier new', courier, monospace;">ZZ</span>. والآن يجب إعادة تشغيل الخدمة ليتمّ إضافة الخوادم الجديدة.</p><pre class="php ipsCode prettyprint">sudo service ntp restart</pre><h2>تنصيب الخادوم المَركزيّ Install Puppet Master</h2><p>يوجد طرقٌ عدّة لتنصيب Puppet Master الإصدار مفتوح المصدر، سوف يتمّ استخدام حزمةٍ خاصّة مُقدمة من Puppet Labs وتُسمى “puppetmaster-passenger”، والّتي تتضمّن Puppet master بالإضافة إلى خادم ويب مُجهزٍ بشكل مُسبق للعمل مُباشرةً (Passenger مع Apache)، وذلك من شأنه أنّ يُسهل عمليّة الإعداد مُقارنةً مع الحزمة الأساسيّة فقط puppetmaster.</p><p>يقوم الأمر التّالي بتحميل الحزمة السابقة الذكر من موقع <a rel="external nofollow" href="https://apt.puppetlabs.com/">PuppetLabs</a> في المَسار الرئيسيّ <span style="font-family:'courier new', courier, monospace;">$HOME</span></p><pre class="php ipsCode prettyprint">cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb</pre><p>ولتنصيب الحزمة يتمّ تنفيذ الأمر التّالي:</p><pre class="php ipsCode prettyprint">sudo dpkg -i puppetlabs-release-trusty.deb</pre><p>ومن ثمّ التحديث للحصول آخر الحزم المُتوفّرة.</p><pre class="html ipsCode prettyprint">sudo apt-get update</pre><p>ومن ثمّ تنصيب حزمة <span style="font-family:'courier new', courier, monospace;">puppetmaster-passenger</span>.</p><pre class="html ipsCode prettyprint">sudo apt-get install puppetmaster-passenger</pre><p>وبهذا يكون قد تمّ تنصيب:</p><ul><li>الخادم المَركزيّ Puppet master</li><li>خادم الويب Apache</li><li>الحِزم المَطلوبة لعملية الإعداد</li></ul><p>بسبب استخدام الحزمة الخاصّة (Apache مع Passenger) يتحكم خادم الويب Apache بالأداة Puppet master، بمعنى أنّ هذه الخدمة سوف تعمل عندما يعمل خادم الويب Apache، وتتوقف بتوقفه.</p><p>قبل المُتابعة سوف يتمُ إيقاف Puppet master وذلك بإيقاف خدمة <span style="font-family:'courier new', courier, monospace;">apache2</span>:</p><pre class="php ipsCode prettyprint">sudo service apache2 stop</pre><h2>قفل الإصدار الحالي</h2><p>يُسبب في بعض الأحيان الانتقال من إصدارٍ لإصدارٍ آخر إلى توقّف منظومة الأدة Puppet عن العمل بشكلٍ مُلائمٍ، لذلك من الجيّد الحفاظ على إصدار الأداة Puppet في كامل المَنظومة على إصدار مُوحّد. وفي حال التحديث، من الضروريّ تحديث النسخة المَركزيّة master قبل نسخة العُملاء agent، حيثُ أنّ النسخة المَركزيّة لاتستطيع إدارة نُسخ العُملاء مع إصدارٍ أحدث من إصدارها.</p><p>لمعرفة الإصدار الحالي للأداة Puppet يُمكن تنفيذ الأمر التّالي:</p><pre class="html ipsCode prettyprint">puppet help | tail -n 1</pre><p>الإصدار الحالي والذي تعتمد عليه هذه السلسلة هو Puppet v3.7.4. من المُمكن استخدام الأداة <span style="font-family:'courier new', courier, monospace;">APT</span> وميزة <span style="font-family:'courier new', courier, monospace;">pin</span> لقفل إصدار الأداة Puppet للتحديثات الجذرية major والبسيطة minor والسماح بالترقيعات patches -يُمكن الرُجوع إلى <a rel="external nofollow" href="http://semver.org/lang/ar/">الإدارة الدلاليّة لنُسخ البرمجيات</a> لمزيد من التفاصيل حول إدارة الإصدار- ولذلك سوف يتمّ إنشاء مَلفّ جديد في المسار الخاصّ بتفضيلات الأداة <span style="font-family:'courier new', courier, monospace;">apt</span>.</p><pre class="php ipsCode prettyprint">sudo vi /etc/apt/preferences.d/00-puppet.pref</pre><p>كما سوف يتمّ قفل التحديثات لثلاث حزم وهي: <span style="font-family:'courier new', courier, monospace;">puppet</span>، <span style="font-family:'courier new', courier, monospace;">puppet common</span>، <span style="font-family:'courier new', courier, monospace;">puppetmaster-passenger</span> وذلك بإضافة السطور التالية إلى المَلف السابق.</p><pre class="php ipsCode prettyprint"># /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.7*
Pin-Priority: 501

</pre><h2><span style="line-height:1.6;">إعداد الأسماء والشهادات</span></h2><p>تستخدم الأداة Puppet شهادات SSL لتوثيق الاتصال بين الخادم المَركزيّ والعُملاء، حيثُ يُمثل الجهاز المَركزيّ دور "مُفوّض الشهادة" certificate authority، ويجب على CA أنّ يُولد الشهادة الخاصّة به والّتي تُستخدم في توقيع طلبات شهادات العُملاء.</p><h3>التخلّص من الشهادات الحاليّة</h3><p>يجب حذف أيّة شهادات SSL حاليّة قد تمّ إنشاؤها أثناء تنصيب حزمة puppet لإعداد مُفوّض الشهادة بشكل مُلائم. المسار الافتراضيّ لشهادات SSL الخاصّة بالحزمة توجد في المسار التّالي: <span style="font-family:'courier new', courier, monospace;">/var/lib/puppet/ssl</span></p><pre class="php ipsCode prettyprint">sudo rm -rf /var/lib/puppet/ssl</pre><h3>إعداد الشهادة</h3><p>عند إنشاء شهادة الجهاز المَركزيّ، يجب إضافة أي اسم DNS من المُمكن أنّ تستخدمه العُملاء للاتصال مع الجهاز المَركزيّ puppet master، في المثال الحالي سوف يتمّ إضافة اسم الخادم “puppet”، و"اسم نطاق مؤهل بالكامل" “<span style="font-family:'courier new', courier, monospace;">puppet.nyc2.example.com</span>”، وذلك بتحرير مَلفّ الإعدادات التّالي:</p><pre class="php ipsCode prettyprint">sudo vi /etc/puppet/puppet.conf</pre><p>والذي يحتوي على البيانات التّالية:</p><pre class="php ipsCode prettyprint">[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY</pre><p>سيتمّ حذف السطر الخاصّ بالخيار <span style="font-family:'courier new', courier, monospace;">templatedir</span> بعد أنّ أصبح غير مُستخدمًا بعد الآن، ومن ثمّ إضافة السطرين التاليين إلى نهاية القسم <span style="font-family:'courier new', courier, monospace;">[main]</span>.</p><pre class="php ipsCode prettyprint">certname = puppet
dns_alt_names = puppet,puppet.nyc2.example.com
</pre><p><span style="line-height:1.6;">من الضروريّ تخصيص اسم الشهادة <span style="font-family:'courier new', courier, monospace;">certname</span> بالاسم “<span style="font-family:'courier new', courier, monospace;">puppet</span>”، لأنّ إعدادات <span style="font-family:'courier new', courier, monospace;">Apache/Passenger</span> مُعدّة لأنّ يكون اسم الشهادة بهذا الاسم. في جميع الأحوال يُمكن تخصيص الاسم حسب الرغبة بالتعديل على مَلفّ الإعداد الخاصّ بـApache:</span></p><pre class="php ipsCode prettyprint">/etc/apache2/sites-available/puppetmaster.conf</pre><p>وبهذا يكون قد تمّ الانتهاء من الإعداد بشكل مُلائم بعد الحفظ والخروج.</p><h3>توليد شهادةٍ جديدة</h3><p>يتمّ إنشاء شهادة جديدة بتنفيذ الأمر التّالي:</p><pre class="php ipsCode prettyprint">sudo puppet master --verbose --no-daemonize</pre><p>الأمر السابق سوف يعرض معلومات تُشير إلى إنشاء الشهادات ومفاتيح SSL، كما يُشير السطر الأخير بدء عمل الأداة<span style="font-family:'courier new', courier, monospace;"> Notice: Starting Puppet master version 3.7.4</span></p><pre class="php ipsCode prettyprint">Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): EC:7D:ED:15:DE:E3:F1:49:1A:1B:9C:D8:04:F5:46:EF:B4:33:91:91:B6:5D:19:AC:21:D6:40:46:4A:50:5A:29
Notice: Signed certificate request for ca
...
Notice: Signed certificate request for puppet
Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/ca/requests/puppet.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppet at '/var/lib/puppet/ssl/certificate_requests/puppet.pem'
Notice: Starting Puppet master version 3.7.4
</pre><p><span style="line-height:1.6;">لمعرفة معلومات عن الشهادة التي تمّ إصدارها بالإمكان تنفيذ الأمر التّالي:</span></p><pre class="php ipsCode prettyprint">sudo puppet cert list -all</pre><p>يعرض الأمر السابق قائمة بجميع الشهادات المُوقعة وطلبات الشهادة غير المُوقعة. حتّى الآن سوف يعرض الأمر السابق الشهادة الخاصّة بالخادم الرئيسيّ فقط، وذلك لأنّه لم يتمّ إضافة أي شهادات أخرى ليتمّ عرضها.</p><pre class="php ipsCode prettyprint">+ "puppet" (SHA256) A5:72:AA:19:AF:E8:D2:9A:E8:99:B9:F0:19:B6:0A:7D:05:0D:0D:F6:BA:CE:F5:09:6F:73:0F:0C:DE:24:11:84 (alt names: "DNS:puppet", "DNS:puppet.nyc2.example.com")
</pre><p><span style="line-height:1.6;">إلى هنا تكون الخدمة الخاصّة بالجهاز المَركزيّ Puppet master service هي تقريبًا جاهزة للعمل.</span></p><h2>إعداد الجهاز المَركزيّ Puppet Master</h2><p>يحتوي مَلفّ الإعداد الرئيسيّ الخاصّ بالأداة puppet المُسمى <span style="font-family:'courier new', courier, monospace;">puppet.conf</span> على ثلاثة أقسام:<span style="font-family:'courier new', courier, monospace;"> [main] </span>و <span style="font-family:'courier new', courier, monospace;">[master]</span> و <span style="font-family:'courier new', courier, monospace;">[agent]</span>. كما هو واضح، يحتوي القسم الرئيسي “<span style="font-family:'courier new', courier, monospace;">main</span>” على الإعدادات العامّة أو الشاملة، أما القسم المُسمى “<span style="font-family:'courier new', courier, monospace;">master</span>” فيحتوي على الإعدادات الخاصّة بالخادم الرئيسي puppet master، ويحتوي القسم “<span style="font-family:'courier new', courier, monospace;">agent</span>” على الإعدادات الخاصّة بخوادم العُملاء. بغض النظر عن التعديلات السابقة الّتي تمّت على هذا المَلفّ، تعمل الإعدادات الافتراضيّة بشكل مُناسب في بيئة العمل البسيطة وغير المُعقدة. يُمكن الرجوع إلى التوثيق الرسمي لمزيد من التفاصيل حول مَلفّ <span style="font-family:'courier new', courier, monospace;"><a rel="external nofollow" href="https://docs.puppetlabs.com/puppet/latest/reference/config_file_main.html">puppet.conf</a></span>. ولتحرير هذا المَلف يُمكن تنفيذ الأمر التّالي:</p><pre class="php ipsCode prettyprint">sudo vi /etc/puppet/puppet.conf</pre><h3>مَلفّ البيان الرئيسيّ (Main Manifest File)</h3><p>تستخدم الأداة Puppet لغة مُحددة المجال DSL وهي اختصار domain-specific language، ومُهمّة هذه اللغة هي كتابة أوصاف أو تصوّرات مَلفّ الإعدادات الخاصّ بالنظام، وتُحفظ هذه الأوصاف في ملفات تُسمى “<span style="font-family:'courier new', courier, monospace;">mainfests</span>”، والّتي تحمل اللاحقة .pp. يتوضّع مَلفّ الـ <span style="font-family:'courier new', courier, monospace;">manifest</span> الرئيسيّ وهو الافتراضيّ في المسار <span style="font-family:'courier new', courier, monospace;">/etc/puppet/manifests/site.pp</span>. سوف يتمّ تناول أساسيات التعامل مع هذا النوع من الملفات فيما بعد، ولكن الآن سيتمّ استخدام مَلفّ خُلَّبي placeholder للمُتابعة:</p><pre class="php ipsCode prettyprint">sudo touch /etc/puppet/manifests/site.pp</pre><h3>تشغيل الخادوم المَركزيّ Puppet Master</h3><p>أصبح من المُمكن الآن تشغيل Puppet master عبر تشغيل خدمة <span style="font-family:'courier new', courier, monospace;">apache2</span>:</p><pre class="php ipsCode prettyprint">sudo service apache2 start</pre><p>يعمل الخادم الرئيسيّ Puppet master كما يجب، ولكن حتى الآن هو لا يُدير أيًا من العُملاء بعد.</p><h2>تنصيب خوادم العُملاء Puppet Agent</h2><p>يجب تنصيب أداة العميل الخاصة بالأداة Puppet على جميع الخوادم التي من المُفترض إدارتها من قبل الجهاز المَركزيّ Puppet master، في أغلب الحالات هذا يتضمّن كل الخوادم في البِنْيَة التَّحْتِيَّة، حيثُ كما تمّت الإشارة في المُقدمة أنّ الأداة Puppet مُتوافقة مع أغلب توزيعات لينوكس الشائعة، وبعض منصات يونكس وأنظمة التشغيل "ويندوز". بسبب الاختلاف في الإعداد بين الأنظمة سوف يتمّ التركيز على خوادم Ubuntu و Debian، أما التعليمات الخاصّة بالتنصيب على بقيّة المنصات فيُمكن الحصول عليها من التوثيق الرسميّ: <a rel="external nofollow" href="https://docs.puppetlabs.com/guides/install_puppet/pre_install.html#next-install-puppet">Puppet Labs Docs</a></p><p><strong>ملاحظة:</strong> من المُهم جدًا إعداد جميع العُملاء لاستخدام DNS مُلائم قبل تنصيب نسخة العُملاء على الخوادم.</p><h3>التعامل مع خوادم Ubuntu / Debian</h3><p>تستخدم جميع خوادم العُملاء في أمثلة هذا الشرح توزيعة أوبونتو 14.04، وذلك باستخدام خادم افتراضيّ خاصّ VPS، والإعدادات التّالية سوف يتمّ تطبيقها على جميع هذه الخوادم وهي: <span style="font-family:'courier new', courier, monospace;">host1،</span> <span style="font-family:'courier new', courier, monospace;">host2</span><span style="font-family:'courier new', courier, monospace;line-height:11.1999998092651px;">،</span> <span style="font-family:'courier new', courier, monospace;">ns1</span><span style="font-family:'courier new', courier, monospace;line-height:11.1999998092651px;">،</span> <span style="font-family:'courier new', courier, monospace;">ns2</span>.</p><p>سوف يتمّ في البداية تحميل الحزمة من موقع مَعامل Puppet كما حصل مع نسخة Puppet master.</p><pre class="php ipsCode prettyprint">cd ~; wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb</pre><p>تنصيب الحزمة:</p><pre class="php ipsCode prettyprint">sudo dpkg -i puppetlabs-release-trusty.deb</pre><p>تحديث قوائم الحزم المُتوفّرة:</p><pre class="php ipsCode prettyprint">sudo apt-get update</pre><p>تنصيب حزمة العُملاء puppet:</p><pre class="php ipsCode prettyprint">sudo apt-get install puppet</pre><p>الأداة بشكل افتراضيّ تَكون غير مُفعلة، ولتغيير ذلك يجب تحديث مَلفّها الافتراضيّ:</p><pre class="php ipsCode prettyprint">sudo vi /etc/default/puppet</pre><p>تغيير قيمة <span style="font-family:'courier new', courier, monospace;">START</span> إلى “<span style="font-family:'courier new', courier, monospace;">yes</span>”:</p><pre class="php ipsCode prettyprint">START=yes</pre><h3>قفل الإصدار الحالي</h3><p>سوف يتمّ استخدام ميزة <span style="font-family:'courier new', courier, monospace;">pin</span> الخاصة بالأداة <span style="font-family:'courier new', courier, monospace;">apt</span> لقفل الإصدار الحالي الخاصّ بـ Puppet agent:</p><pre class="php ipsCode prettyprint">sudo vi /etc/apt/preferences.d/00-puppet.pref</pre><p>لقفل الإصدار الحالي سوف يتمّ إضافة السطور التّالية إلى المَلفّ السابق:</p><pre class="php ipsCode prettyprint"># /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common
Pin: version 3.7*
Pin-Priority: 501

</pre><h3><span style="line-height:1.6;">إعداد نسخة العميل Puppet Agent</span></h3><p>قبل تشغيل نسخة العميل من الضروريّ تغيير بعض الإعدادات، وذلك بتحرير مَلفّ إعداد نسخة العميل <span style="font-family:'courier new', courier, monospace;">puppet.conf</span>، وهو نسخة مُطابقة لنسخة لملف الإعداد الأوليّ لنسخة Puppet master:</p><pre class="php ipsCode prettyprint">sudo vi /etc/puppet/puppet.conf</pre><p>سيتمّ حذف السطر الخاصّ بالخَيار <span style="font-family:'courier new', courier, monospace;">templatedir</span> كما تمّ سابقَا مع نسخة الخادم المَركزيّ، بالإضافة إلى ذلك سوف يتمّ حذف القسم المُسمى <span style="font-family:'courier new', courier, monospace;">[master] </span>وكافة السطور الّتي تخصّه.</p><p>إنّ تمكّنت الخوادم من الاتصال بالخادم المَركزيّ Puppet master بالاسم “<span style="font-family:'courier new', courier, monospace;">puppet</span>”، فيُمكن للعُملاء استخدام هذا الاسم للاتصال بالخادم المَركزيّ، أما في حال عدم توفّر الجهاز المَركزيّ تحت الاسم “puppet” فيجب إضافة اسم المجال الكامل FQDN الخاصّ بالخادم المَركزيّ Puppet master، ومن المُستحسن عمل ذلك في جميع الأحوال.</p><pre class="php ipsCode prettyprint">[agent]
server = puppet.nyc2.example.com</pre><p>بعد الإعدادات السابقة أصبحت نسخة العميل من الأداة Puppet agent جاهزة للعمل، وذلك بتنفيذ الأمر التّالي:</p><pre class="php ipsCode prettyprint">sudo service puppet start</pre><p>لن يُظهر تنفيذ الأمر السابق أيّة مُخرجات output في حال أنّ الإعدادات طُبقت بشكل صحيح. يتمّ عند التشغيل الأول للأداة Puppet agent توليد شهادة SSL وإرسال طلب توقيع signing request إلى الخادم المَركزيّ Puppet master، وبعد أنّ يُوقع الخادم المَركزيّ شهادة العميل سيكون الاتصال جاهزًا بينهما.</p><p>تجدرُ الإشارة هنا أنّه في حال كان هذا العميل هو العميل الأول، فمن المُستحسن محاولة توقيع الشهادة على الخادم المَركزيّ Puppet master قبل إضافة باقي العُملاء، وعندما يتمّ التأكد من أنّ الأمور تجري على ما يُرام، عندها يُمكن إضافة باقي العُملاء من دون التخوف من وقوع مُشكلات مُحتملة مع باقي الخوادم.<br>توقيع طلب العُملاء على الخادم المَركزيّ:</p><p>تُرسل الأداة Puppet عند تشغيلها للمرّة الأولى على خادم العميل Puppet agent طلب توقيع شهادة إلى الخادم المَركزيّ Puppet master، ولن يتمكّن الخادم المَركزيّ من التحكم بالخادم العميل حتى يوقع على هذه الشهادة. سوف يتمّ توضيح هذه النقطة في الفقرة التّالية.</p><h3>عرض طلبات الشهادة الحالية</h3><p>يتمّ تنفيذ الأمر التّالي على الجهاز المَركزيّ Puppet master ليَعرض جميع طلبات الشهادة غير المُوقعة:</p><pre class="php ipsCode prettyprint">sudo puppet cert list</pre><p>سيُظهر الأمر السابق طلبًا وحيدًا حتّى الآن، وهو للعميل الذي تمّ إعداده سابقًا، وسيبدو بالشكل التّالي، حيثُ الاسم هو اسم المجال الكامل FQDN:</p><pre class="php ipsCode prettyprint">"host1.nyc2.example.com" (SHA256) 5F:DB:E0:6D:8B:1F:C8:A3:04:4E:CD:48:6F:9F:D7:89:14:38:FB:5B:EF:2F:09:76:C5:13:A9:E0:4D:D2:C5:FC</pre><p>يجب الانتباه هنا إلى أنّ المُخرج السابق لا يحتوي على إشارة الزائد (+)، وذلك يُشير إلى أنّ هذه الشهادة غير مُوقعة بعد.</p><h3>توقيع الطلب</h3><p>يُستخدم الأمر puppet cert sign لتوقيع طلب شهادة، ويُضاف إلى هذا الأمر اسم الخادم الخاصّ بهذه الشهادة، على سبيل المثال لتوقيع طلب الخادم<span style="font-family:'courier new', courier, monospace;"> host1.nyc2.example.com</span>، فسوف يتم تنفيذ الأمر التّالي:</p><pre class="php ipsCode prettyprint">sudo puppet cert sign host1.nyc2.example.com</pre><p>الأمر السابق يَعرضُ المُخرَج التّالي، والذي يُشير إلى توقيع طلب الشهادة.</p><pre class="php ipsCode prettyprint">Notice: Signed certificate request for host1.nyc2.example.com
Notice: Removing file Puppet::SSL::CertificateRequest host1.nyc2.example.com at '/var/lib/puppet/ssl/ca/requests/host1.nyc2.example.com.pem'</pre><p>أصبح بإمكان الخادم المَركزيّ Puppet master بعد توقيع طلب الشهادة من الاتصال والتحكم بهذه النقطة node والتي تنتمي إليها هذه الشهادة المُوقعة.</p><p>يُمكن استخدام الأمر التّالي لتوقيع جميع الطلبات الحالية وذلك باستخدام الخيار <span style="font-family:'courier new', courier, monospace;">-all</span>.</p><pre class="php ipsCode prettyprint">sudo puppet cert sign --all</pre><h3>إبطال الشهادات</h3><p>يحتاج مُدير النظام في بعض الحالات إلى حذف أحد العُملاء من الخادم المَركزيّ، ربما لأسباب تتعلق بتحليل المشاكل، أو لأي سببٍ آخر، حيثُ يُمكن إبطال شهادة العميل من الخادم المَركزيّ باستخدام الخيار <span style="font-family:'courier new', courier, monospace;">clean</span> مع اسم الخادم، كما في المثال التّالي:</p><pre class="php ipsCode prettyprint">sudo puppet cert clean hostname</pre><h3>استعراض جميع الطلبات المُوقعة</h3><p>يُستخدم الأمر التّالي لاستعراض جميع الطلبات المُوقعة وغير المُوقعة</p><pre class="php ipsCode prettyprint">sudo puppet cert list –all</pre><p>يَعرض الأمر السابق جميع الطلبات مع الانتباه أنّ الطلبات المُوقعة تُسبق بإشارة الزائد</p><pre class="php ipsCode prettyprint">  "ns2.nyc2.example.com"   (SHA256) E4:F5:26:EB:B1:99:1F:9D:6C:B5:4B:BF:86:14:40:23:E0:50:3F:C1:45:D0:B5:F0:68:6E:B2:0F:41:C7:BA:76
+ "host1.nyc2.example.com" (SHA256) 71:A2:D3:82:15:0D:80:20:D4:7E:E3:42:C2:35:87:83:79:2B:57:1D:D5:5A:EC:F6:8B:EE:51:69:53:EB:6B:A1
+ "host2.nyc2.example.com" (SHA256) F4:79:A6:7C:27:0C:EA:8E:BC:31:66:FF:F2:01:AB:B1:35:7B:9F:5E:C8:C9:CE:82:EE:E8:2F:23:9F:0C:2B:ED
+ "puppet"                 (SHA256) 05:22:F7:65:64:CF:46:0E:09:2C:5D:FD:8C:AC:9B:31:17:2B:7B:05:93:D5:D1:01:52:72:E6:DF:84:A0:07:37 (alt names: "DNS:puppet", "DNS:puppet.nyc2.example.com")

</pre><h2><span style="line-height:1.6;">الخطوات الأولى مع الأداة Puppet</span></h2><p>بعد تجهيز بيئة العمل، سيتمّ التركيز في الفقرات التالية على كيفية عمل بعض المُهِمّات أو الواجبات الأساسية للخوادم وذلك باستخدام الأداة Puppet، وذلك في سبيل عرض الخطوط العريضة لهذه الأداة وآلية عملها.</p><h3>كيف تُجمّع الحقائق</h3><p>تجمع الأداة Puppet الحقائق حول جميع العُقد المُرتبطة بها، وذلك باستخدام أداةٍ تُسمى “facter”. تَجمع الأداة Facter جميع المعلومات المُفيدة في إعداد النظام بشكل افتراضيّ، مثل اسم نظام التشغيل، عنواين برتوكول الانترنت IP، ومفاتيح SSH، وغيرها من المعلومات. كما مِن المُمكن إضافة حقائق مُخصّصة حسب الحاجة لأداء بعض الإعدادات الخاصّة.</p><p>يُمكن الاستفادة من هذه الحقائق المُجمّعة في حالات عديدة. على سبيل المثال، يُمكن إنشاء نموذج إعدادات خادم ويب وتعيين العناوين المُلائمة لمُضيف افتراضي مُحدد دون الآخر، أويُمكن استخدامها في التحكم بمسار الإعدادات، أي تطبيق إعداد معين على حسب حقيقة معينة، فعند معرفة أن النظام هو نظام أوبونتو، فسيكون اسم الخدمة الخاصّة بخادم الويب هي <span style="font-family:'courier new', courier, monospace;">apache2</span>، وفي حال كان نظام التشغيل هو CentOS، فستكون الخدمة الخاصّة بخادم الويب هي <span style="font-family:'courier new', courier, monospace;">httpd</span>. الأمثلة السابقة هي تبسيط لما يُمكن عمله باستخدام هذه الحقائق المُجمّعة.</p><p>لاستعراض قائمة الحقائق والّتي تمّ جمعها بشكلٍ تلقائيّ على خادم العميل يُمكن استخدام الأمر التّالي:</p><pre class="php ipsCode prettyprint">facter</pre><h3>كيفيّة تنفيذ مَلفّ البيان الرئيسي The Main Manifest</h3><p>تقوم العُملاء الخاصّة بالأداة Puppet بالاتصال بالخادم المَركزيّ Puppet master دوريًا كل 30 دقيقة تقريبًا، مُرسلةً حقائق factsعن نفسها إليه، بالإضافة إلى سحب فهرس (catalog) مَلفات البيان، والتي هي قائمة مُجمّعة (compiled) للمَوارِد وحالتها المَطلوبة والمُرتبطة مع هذه العُملاء، وتُحدّد هذه القائمة من قِبل مَلفّ البيان الرئيسيّ main manifest، وفيما بعد تُحاول نقاط العُملاء تطبيق التَغَيُّرات لتُلائم الحالة المَطلوبة. يستمر التسلسل السابق بالتكرار طالما أنّ الخادم المَركزيّ يعمل ومُتصل مع نقاط العُملاء.</p><p>تنفيذ التَغَيُّرات على نقاط العُملاء بشكلٍ يدويٍّ ومُباشر</p><p>يُمكن المُبادرة بعمل اتصال يدويّ بين أحد نقاط العُملاء والخادم المَركزيّ، رُبما لتسريع عملية التطبيق أو في سبيل تحديد مُشكلة ما، أو لمعرفة كيف سوف يؤثّر مَلفّ البيان على أحد الخوادم دون تطبيقه على جميع الخوادم، ويتمّ ذَلِك عبر بتنفيذ الأمر التّالي على الخادم العميل:</p><pre class="php ipsCode prettyprint">puppet agent --test</pre><p>سيقوم الأمر السابق بتطبيق مَلفّ البيان الرئيسي main manifest على الخادم العميل، كما يَعرض هذا الأمر المُخرجات التّالية:</p><pre class="php ipsCode prettyprint">Info: Caching certificate_revocation_list for ca
Info: Retrieving plugin
Info: Caching catalog for host1
Info: Applying configuration version '1423707894'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.01 seconds

</pre><h3><span style="line-height:1.6;">تطبيق مَلفِ بيانٍ كيفيٍ ولمرّة واحدة</span></h3><p>يُتيح الأمر puppet apply تنفيذ مَلفات بيانٍ اختياريّة لاترتبط بمَلف البيان الرئيسيّ، وعلى نقاط العُملاء مُعينة.</p><pre class="php ipsCode prettyprint">sudo puppet apply /etc/puppet/modules/test/init.pp</pre><p>تشغيل مَلفّات البيان بهذا النمط مفيدٌ عندما يكون المُراد اختبار مَلفّ بيان جديد على أحد العُملاء، أو عندما يَكون المُراد تنفيذ مَلفّ البيان لمرّة واحدة فقط، مُثلًا لاستهلال العميل إلى حالة مُعينة.</p><h2>إنشاء مَلفّ بيانٍ رئيسيٍّ مُبسَط</h2><p>تمّت الإشارة سابقًا إلى أنّ مَلفّ البيان الرئيسي على الخادم المَركزيّ من المُفترض تواجده في المسار <span style="font-family:'courier new', courier, monospace;">/etc/puppet/manifests/ </span>وبالاسم <span style="font-family:'courier new', courier, monospace;">site.pp</span>. سيتمّ إضافة بعض التعديلات البسيطة لهذا المَلف:</p><pre class="php ipsCode prettyprint">sudo vi /etc/puppet/manifests/site.pp</pre><p>السطور التّالية تصف مَورِد مَلفّ file resource:</p><pre class="php ipsCode prettyprint">file {'/tmp/example-ip':                                            # التصريح عن مَورد مَلفّ ومسار المَلف
  ensure  =&gt; present,                                               # التأكد من وجود المَلف
  mode    =&gt; 0644,                                                  # تحديد صلاحيات المَلف
  content =&gt; "Here is my Public IP Address: ${ipaddress_eth0}.\n",  # تحديد مُحتوى المَلف واستخدام الحقائق
}</pre><p>يقوم مَلفّ البيان السابق بإنشاء مَلفٍ في المسار <span style="font-family:'courier new', courier, monospace;">/tmp/</span>، والتأكد من وجوده وبالاسم <span style="font-family:'courier new', courier, monospace;">example-ip</span> مع صلاحيات <span style="font-family:'courier new', courier, monospace;">-rw-r--r--</span>، ومُحتوى نصيّ يتضمّن عنوان الـIP الخاصّ بالخادم العميل.</p><p>بالإمكان إما الانتظار حتّى يقوم الخادم العميل بالاتصال مع الخادم المَركزيّ بشكل آليٍّ، أوتنفيذ الأمر puppet agent –test على أحد نقاط العُملاء. لمُشاهدة التغييرات التي قام بها مَلفّ البيان السابق، وبعد ذلك يُمكن تنفيذ الأمر التّالي على الخادم العميل:</p><pre class="php ipsCode prettyprint">Cat /tmp/example-ip</pre><p>والذي سوف يَعرض السطرَ التّالي مع اختلاف العنوان بطبيعة الحال:</p><pre class="php ipsCode prettyprint">Here is my Public IP Address: 10.0.2.15.</pre><h3>استهداف عميلٍ مُحدد</h3><p>من المُهم معرفة أنّه بالإمكان تعريف مَورد مُحدد لعميلٍ مُعين دون الآخرين، ولذلك على الخادم المَركزيّ، ومنه المَلف site.pp:</p><pre class="php ipsCode prettyprint">sudo vi /etc/puppet/manifests/site.pp</pre><p>سيتمّ إضافة السطور التّالية:</p><pre class="php ipsCode prettyprint">node 'ns1', 'ns2' {    # تطبيق المَورد التّالي على الخوادم المُحددة فقط
  file {'/tmp/dns':    # التصريح عن مَورد مَلفّ ومسار المَلف
    ensure =&gt; present, # التأكد من وجود المَلف
    mode =&gt; 0644,      # تحديد صلاحيات المَلف
    content =&gt; "Only DNS servers get this file.\n",
  }
}

node default {}       # تطبيق المَوارد على النقاط التي لم تُعرّف بشكل مُحدد.</pre><p>ستتأكّد الأداة Puppet من وجود المَلف <span style="font-family:'courier new', courier, monospace;">/tmp/dns</span> على الخادمين "ns1" و“ns2”، ومن المُمكن تطبيق الأمر <span style="font-family:'courier new', courier, monospace;">puppet agent –test</span> على الخادمين آنفي الذّكر لعدم الانتظار إلى حين الطلب التلقائي من العُملاء.</p><p>يجدُر الذكر هنا أنّه في حال عدم تعريف مَورد، فإن الأداة Puppet سوف لن تقوم بإجراء أيّة تعديلات على العُملاء، أي في حال حذف المَوارد السابقة من مَلفّ البيان، فإنّ الأداة Puppet لن تَحذف الملفات التي قامت بإنشائها سابقًا، إلا إذا تمّ التصريح بذلك عبر تعديل قيمة <span style="font-family:'courier new', courier, monospace;">ensure</span> إلى <span style="font-family:'courier new', courier, monospace;">absent</span> والّتي تعني غائب أو لا وجود له.</p><p>في حقيقة الأمر لايُظهر تطبيق الأمثلة السابقة قوة الأداة Puppet وما الذي يُمكنها فعله، ولكنه يُبرهن على الأقل أنّها تعمل كما هو مُخططٌ لها.</p><h2>استخدام الوحدات Modules</h2><p>تُستخدم الوحدات modules لتجميع المهام في صيغة واحدة، ويتوفّر العديد من هذه الوحدات في مُجتمع Puppet، مع العلم أنّه يُمكن كتابة وحدة جديدة وعدم التقيد بما يوفره المُجتمع من هذه الوحدات.</p><p>سيتمّ تنصيب وحدة مُعدّة مُسبقًا من موقع Puppet باستخدام الأمر <span style="font-family:'courier new', courier, monospace;">puppetlabs-apache</span>:</p><pre class="php ipsCode prettyprint">sudo puppet module install puppetlabs-apache</pre><p><strong>تحذير</strong>: لا يُفترض استخدام الوحدة السابقة في حال وجود خادم الويب Apache، وذلك من شأنه أنّ يُلغي أيّة إعدادات تُدار من قبل الأداة Puppet.</p><p>يجب الآن تحرير المَلف <span style="font-family:'courier new', courier, monospace;">site.pp</span>، لكي يَستخدم الوحدة المُنصبة (apache). وعلى سبيل المثال سيتمّ اختيار الخادم “host2” لتنصيب خادم الويب <span style="font-family:'courier new', courier, monospace;">Apache</span> لتوضيح المثال:</p><pre class="php ipsCode prettyprint">node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    =&gt; '80',
    docroot =&gt; '/var/www/html'
  }
}

</pre><p><span style="line-height:1.6;">ستقوم الأداة Puppet بتنصيب خادم الويب Apache على العميل “host2”، وإعداد مُضيف افتراضيّ “example.com”، مُصغيًا على المنفذ 80، مع document root بالمسار <span style="font-family:'courier new', courier, monospace;">/var/www/html</span>.</span></p><p>على الخادم “host2” يُمكن تنفيذ الأمر التّالي لتسريع عمليّة التطبيق:</p><pre class="php ipsCode prettyprint">sudo puppet agent --test</pre><p>يَعرض الأمر السابق مُخرجات تُشير إلى تنصيب خادم الويب Apache. بعد استكمال التنصيب، من المُمكن التأكد من عمل خادم الويب بالشكل المطلوب عبر زيارة صفحة الترحيب الافتراضيّة الخاصّة به.</p><h2>خاتمة</h2><p>تمّ التطرّق في هذا الجزء إلى كيفيّة تنصيب الأداة Puppet، وإعدادها إعدادًا أوليًا، وبذلك أصبح بالإمكان التعمّق في المزيد من التفاصيل الخاصّة بهذه الأداة وماتقدمه من تسهيلات لمُدير النظام، وذلك عبر مَلفّات البيان والوحدات الّتي سيتمّ التركيز عليها في الجزء الثاني من هذه السلسلة.</p><p> </p><p>ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-puppet-to-manage-your-server-infrastructure">How To Install Puppet To Manage Your Server Infrastructure</a></p>
]]></description><guid isPermaLink="false">16</guid><pubDate>Tue, 17 Mar 2015 09:27:00 +0000</pubDate></item></channel></rss>
