<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x62E;&#x627;&#x62F;&#x648;&#x645; Chef</title><link>https://academy.hsoub.com/devops/deployment/chef/?d=4</link><description>DevOps: &#x62E;&#x627;&#x62F;&#x648;&#x645; Chef</description><language>ar</language><item><title>&#x643;&#x62A;&#x627;&#x628;&#x629; &#x627;&#x644;&#x648;&#x635;&#x641;&#x627;&#x62A; Recipes &#x641;&#x64A; &#x627;&#x644;&#x623;&#x62F;&#x627;&#x629; Chef &#x644;&#x625;&#x62F;&#x627;&#x631;&#x629; &#x636;&#x628;&#x637; &#x627;&#x644;&#x62E;&#x648;&#x627;&#x62F;&#x645;</title><link>https://academy.hsoub.com/devops/deployment/chef/%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-%D9%84%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-r692/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_04/---Chef.png.526bc4d85ca936231f1918c70908f001.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/chef/" rel="">Chef</a>، وهي أداة قوية لإدارة الضبط تستفيد من لغة برمجة <a href="https://wiki.hsoub.com/Ruby" rel="external">روبي Ruby</a> لأتمتة إدارة البنية التحتية وإعدادها المسبق، وسنركز على مصطلحات اللغة والصياغة والميزات اللازمة لإنشاء مثال مبسّط للأتمتة الكاملة لنشر خادم ويب Ubuntu 18.04 باستخدام أباتشي Apache.
</p>

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

<ol>
	<li>
		حدّث ذاكرة <code>apt</code> المخبئية.
	</li>
	<li>
		ثبّت أباتشي Apache.
	</li>
	<li>
		أنشئ مجلد المستند الجذر المُخصَّص.
	</li>
	<li>
		ضع ملف <code>index.html</code> في المستند الجذر المخصص.
	</li>
	<li>
		طبّق قالبًا لإعداد المضيف الوهمي المخصص.
	</li>
	<li>
		أعِد تشغيل أباتشي.
	</li>
</ol>

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

<p>
	<strong>ملاحظة</strong>: يهدف هذا المقال إلى تعريفك بلغة Chef وكيفية كتابة الوصفات لأتمتة إعداد خادمك المسبق. اطّلع على <a href="https://academy.hsoub.com/devops/deployment/chef/%D9%86%D8%AD%D9%88%D9%8E-%D9%81%D9%87%D9%85%D9%8D-%D8%A3%D9%81%D8%B6%D9%84-%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-chef-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%8D-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A-%D8%AE%D8%A7%D8%B5-vps-r13/" rel="">كيفية ضبط الأداة Chef</a> لمعرفة الخطوات اللازمة لتثبيت هذه الأداة والبدء باستخدامها.
</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>
		<a href="https://academy.hsoub.com/devops/deployment/puppet/%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-%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%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-puppet-r691/" rel="">مبادئ إدارة ضبط الخوادم Configuration Management: كتابة ملفات البيان Manifests للأداة Puppet</a>
	</li>
	<li>
		مبادئ إدارة ضبط الخوادم Configuration Management: كتابة الوصفات Recipes في الأداة Chef
	</li>
</ul>

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

<p>
	يجب أن نتعرف أولًا على المصطلحات والمفاهيم المهمة التي قدمتها <a href="https://academy.hsoub.com/devops/deployment/chef/" rel="">الأداة Chef</a> قبل البدء بالعمل.
</p>

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

<ul>
	<li>
		خادم Chef: خادم مركزي يخزن المعلومات ويدير الإعداد المُسبق provisioning للعقد nodes.
	</li>
	<li>
		عقدة Chef: خادم فردي يديره خادم Chef.
	</li>
	<li>
		محطة عمل Chef: جهاز متحكِّم يُنشَأ فيه الإعداد المسبق ويُحمَّل على خادم Chef.
	</li>
	<li>
		الوصفة Recipe: ملف يحتوي على مجموعة من التعليمات (الموارد) لتنفيذها، إذ يجب أن تكون الوصفة موجودة في الدليل Cookbook.
	</li>
	<li>
		المورد Resource: جزء من الشيفرة البرمجية الذي يصرّح عن عنصر في النظام والإجراء الذي يجب تنفيذه، فمثلًا نصرّح عن مورد حزمة package مع إجراء التثبيت لتثبيت حزمةٍ ما.
	</li>
	<li>
		الدليل Cookbook: مجموعة من الوصفات والملفات الأخرى ذات الصلة المنظمة بطريقة مُعرَّفة مسبقًا لتسهيل مشاركة وإعادة استخدام أجزاء من الإعداد المسبق.
	</li>
	<li>
		السمات Attributes: هي تفاصيل حول عقدة معينة يمكن أن تكون السمات مؤتمتة، ويمكن تعريفها ضمن الوصفات.
	</li>
	<li>
		السمات المؤتمتة Automatic Attributes: هي المتغيرات العامة التي تحتوي على معلومات حول النظام مثل واجهات الشبكة ونظام التشغيل (المعروفة بالحقائق Facts في الأدوات الأخرى)، وتُجمَع هذه السمات المؤتمتة باستخدام أداة تسمى Ohai.
	</li>
	<li>
		الخدمات: تُستخدَم لبدء تغييرات حالة الخدمة مثل إعادة تشغيل الخدمة أو إيقافها.
	</li>
</ul>

<h3>
	تنسيق الوصفة Recipe
</h3>

<p>
	تُكتَب وصفات Chef باستخدام لغة روبي Ruby، والوصفة هي مجموعة من تعريفات الموارد التي ستنشئ مجموعة من التعليمات خطوة بخطوة لتنفّذها العقد، ويمكن مزج تعريفات الموارد مع شيفرة روبي البرمجية لمزيد من المرونة والتقسيم إلى وحدات Modularity.
</p>

<p>
	إليك مثال بسيط لوصفة ستشغِّل <code>apt-get update</code> ثم تثبّت <code>vim</code>:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_6" style=""><span class="pln">execute </span><span class="str">"apt-get update"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 command </span><span class="str">"apt-get update"</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

apt_package </span><span class="str">"vim"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
</span><span class="kwd">end</span></pre>

<h2>
	كتابة الوصفات Recipes
</h2>

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

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

<p>
	يمكن تعريف المتغيرات المحلية ضمن الوصفات بوصفها متغيرات روبي المحلية العادية، حيث يوضح المثال التالي كيفية إنشاء متغير محلي يُستخدَم ضمن تعريف المورد لاحقًا:
</p>

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

apt_package package </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
</span><span class="kwd">end</span></pre>

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

<h4>
	استخدام السمات Attributes
</h4>

<p>
	تمثل السمات تفاصيلًا حول العقدة، حيث تحتوي أداة Chef على سمات مؤتمتة، وهي سمات تجمعها أداة تسمى Ohai وتحتوي على معلومات حول النظام (مثل المنصة واسم المضيف وعنوان IP الافتراضي)، ولكنها تتيح لك تعريف سماتك المُخصَّصة. للسمات مستويات أولوية مختلفة تُحدَّد حسب نوع السمة التي تنشِئها، تُعَد السمات <code>default</code> الاختيار الأكثر شيوعًا، حيث لا يزال ممكنًا تعديلها لتكون أنواع سمات أخرى عند الرغبة في ذلك.
</p>

<p>
	يوضح المثال التالي كيف سيبدو المثال السابق مع سمة العقدة <code>default</code> بدلًا من متغير محلي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_10" style=""><span class="pln">node</span><span class="pun">.</span><span class="pln">default</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"vim"</span><span class="pln">

apt_package node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
</span><span class="kwd">end</span></pre>

<p>
	الممارسة الموصَى بها عند تعريف متغيرات العقدة هي تنظيمها بوصفها قيمًا مُعمَّاة مختصَرة Hashes باستخدام الدليل Cookbook الحالي المستخدَم بوصفه مفتاحًا. استخدمنا <code>main</code> في حالتنا، لأن لدينا دليل بالاسم نفسه، مما يؤدي إلى تجنب الارتباك إذا أردت العمل مع أدلة متعددة يكون لها سمات بأسماء متماثلة. لاحظ أننا استخدمنا <code>node.default</code> عند تعريف السمة، ولكن استخدمنا <code>node</code> مباشرةً عند الوصول إلى قيمتها لاحقًا. يحدِّد استخدام <code>node.default</code> أننا ننشئ سمة من النوع الافتراضي، ويمكن تعديل قيمة هذه السمة لتكون نوع سمة آخر ذي أولوية أعلى مثل السمات العادية <code>normal</code> أو سمات التجاوز <code>override</code>.
</p>

<p>
	يمكن أن تكون أولوية السمات مربكة بعض الشيء في البداية، ولكنك ستعتادها بعد التدريب عليها، ولتوضيح هذا السلوك اطّلع على المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_12" style=""><span class="pln">node</span><span class="pun">.</span><span class="pln">normal</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln">  </span><span class="pun">=</span><span class="pln"> </span><span class="str">"vim"</span><span class="pln">

node</span><span class="pun">.</span><span class="pln">override</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"git"</span><span class="pln">

node</span><span class="pun">.</span><span class="pln">default</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"curl"</span><span class="pln">

apt_package node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'package'</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
</span><span class="kwd">end</span></pre>

<p>
	الحزمة التي ستُثبَّت في المثال السابق هي الحزمة <code>git</code>، إذ ستجعل الأولوية الأعلى للنوع <code>override</code> تقييم <code>node['main']['package']‎</code> ليكون <code>git</code> بغض النظر عن ترتيب تعريف السمات.
</p>

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

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

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_14" style=""><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">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">package</span><span class="pun">|</span><span class="pln">
 apt_package package </span><span class="kwd">do</span><span class="pln">
   action </span><span class="pun">:</span><span class="pln">install
 </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

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

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_16" 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">

packages</span><span class="pun">.</span><span class="pln">each </span><span class="kwd">do</span><span class="pln"> </span><span class="pun">|</span><span class="pln">package</span><span class="pun">|</span><span class="pln">
 apt_package package </span><span class="kwd">do</span><span class="pln">
   action </span><span class="pun">:</span><span class="pln">install
 </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

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

<p>
	يمكن استخدام التعليمات الشرطية لتحديد ما إذا كان يجب تنفيذ كتلة من الشيفرة البرمجية أم لا ديناميكيًا بناءً على متغير أو خرج أمرٍ ما مثلًا. تدعم الأداة Chef جميع تعليمات روبي الشرطية لإنشاء تعليمات شرطية ضمن الوصفات، وتدعم جميع أنواع الموارد خاصيتين تقيّيمان تعبيرًا قبل تحديد ما إذا كان يجب تنفيذ المهمة أم لا وهما: <code>if_only</code> و <code>not_if</code>.
</p>

<p>
	سيتحقق المثال التالي من وجود <code>php</code> قبل محاولة تثبيت التوسّع <code>php-pear</code>، إذ سيستخدم الأمر <code>which</code> للتحقق مما إذا كان هناك ملف <code>php</code> تنفيذي مُثبَّت حاليًا على هذا النظام، فإذا أعاد الأمر <code>which php</code> القيمة <code>false</code>، فلن تُنفَّذ هذه المهمة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_18" style=""><span class="pln">apt_package </span><span class="str">"php-pear"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
 only_if </span><span class="str">"which php"</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	إذا أردنا تطبيق العكس أي تنفيذ أمر في جميع الأوقات باستثناء الوقت الذي يُقيَّم فيه الشرط على أنه <code>true</code>، فسنستخدم التعليمة <code>not_if</code> بدلًا من ذلك، حيث سيثبت المثال التالي <code>php5</code> ما لم يكن النظام CentOS:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_20" style=""><span class="pln">apt_package </span><span class="str">"php5"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">install
 not_if </span><span class="pun">{</span><span class="pln"> node</span><span class="pun">[</span><span class="str">'platform'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'centos'</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	لنطبّق الآن تقييمات أكثر تعقيدًا، فمثلًا إذا أردتَ تنفيذ عدة مهام وفق شرط محدّد، فيمكنك استخدام أيٍّ من <a href="https://wiki.hsoub.com/Ruby/control_expressions" rel="external">تعليمات روبي الشرطية</a> المعيارية. ينفّذ المثال التالي فقط <code>apt-get update</code> عندما يكون النظام إما دبيان Debian أو أوبنتو Ubuntu:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_22" style=""><span class="kwd">if</span><span class="pln"> node</span><span class="pun">[</span><span class="str">'platform'</span><span class="pun">]</span><span class="pln"> </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"> node</span><span class="pun">[</span><span class="str">'platform'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'ubuntu'</span><span class="pln">
 execute </span><span class="str">"apt-get update"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
   command </span><span class="str">"apt-get update"</span><span class="pln">
 </span><span class="kwd">end</span><span class="pln">
</span><span class="kwd">end</span></pre>

<p>
	تُعَد السمة <code>node['platform']‎</code> سمة مؤتمتة من الأداة Chef، حيث استخدمنا المثال السابق فقط لتوضيح بنية شرطية أكثر تعقيدًا، ولكن يمكن استبدالها باختبار بسيط باستخدام السمة <code>node['platform_family']‎</code> التي ستعيد "debian" لكل من نظامي دبيان وأوبنتو.
</p>

<h3>
	استخدام القوالب templates
</h3>

<p>
	تُستخدَم القوالب عادةً لإعداد ملفات الضبط، مما يسمح باستخدام المتغيرات والميزات الأخرى التي تهدف إلى جعل هذه الملفات أكثر تنوعًا وقابلية لإعادة الاستخدام. تستخدم الأداة Chef قوالب روبي المُضمَّنة Embedded Ruby -أو ERB اختصارًا، وهو التنسيق نفسه الذي تستخدمه الأداة <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>، حيث تدعم هذه القوالب التعليمات الشرطية والحلقات والميزات الأخرى في <a href="https://wiki.hsoub.com/Ruby" rel="external">لغة روبي</a>.
</p>

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

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_8284_24" 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>template</code> لتطبيق القالب، ويوضح المثال التالي الطريقة التي ستطبِّق بها هذا القالب لاستبدال مضيف أباتشي الوهمي الافتراضي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_26" style=""><span class="pln">template </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 source </span><span class="str">"vhost.erb"</span><span class="pln">
 variables</span><span class="pun">({</span><span class="pln"> </span><span class="pun">:</span><span class="pln">doc_root </span><span class="pun">=&gt;</span><span class="pln"> node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'doc_root'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">})</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">create
</span><span class="kwd">end</span></pre>

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

<p>
	تمتلك الأداة Chef نطاقًا أكثر صرامة للمتغيرات على عكس أدوات إدارة الضبط الأخرى التي رأيناها حتى الآن، وهذا يعني أنه يجب تقديم أيّ متغيرات تريد استخدامها ضمن القالب صراحةً عند تعريف المورد <code>template</code>. استخدمنا في مثالنا التابع <code>variables</code> لتمرير السمة <code>doc_root</code> التي نحتاجها في قالب المضيف الوهمي.
</p>

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

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

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

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_28" style=""><span class="pln">service </span><span class="str">"apache2"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  action </span><span class="pun">[</span><span class="pln"> </span><span class="pun">:</span><span class="pln">enable</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">start </span><span class="pun">]</span><span class="pln">
</span><span class="kwd">end</span></pre>

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

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_30" style=""><span class="pln">template </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
 source </span><span class="str">"vhost.erb"</span><span class="pln">
 variables</span><span class="pun">({</span><span class="pln"> </span><span class="pun">:</span><span class="pln">doc_root </span><span class="pun">=&gt;</span><span class="pln"> node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'doc_root'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">})</span><span class="pln">
 action </span><span class="pun">:</span><span class="pln">create
 notifies </span><span class="pun">:</span><span class="pln">restart</span><span class="pun">,</span><span class="pln"> resources</span><span class="pun">(:</span><span class="pln">service </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"apache2"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

<h2>
	مثال عن وصفة Recipe
</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://github.com/erikaheidi/cfmgmt/tree/master/chef" rel="external nofollow">Github</a>، ويحتوي المجلد على الملف Vagrantfile الذي يتيح لك اختبار الوصفة في إعداد مبسّط باستخدام آلة افتراضية تديرها أداة Vagrant.
</p>

<p>
	إليك الوصفة الكاملة:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8284_32" style=""><span class="pln">node</span><span class="pun">.</span><span class="pln">default</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'doc_root'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/vagrant/web"</span><span class="pln">

execute </span><span class="str">"apt-get update"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  command </span><span class="str">"apt-get update"</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

apt_package </span><span class="str">"apache2"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  action </span><span class="pun">:</span><span class="pln">install
</span><span class="kwd">end</span><span class="pln">

service </span><span class="str">"apache2"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  action </span><span class="pun">[</span><span class="pln"> </span><span class="pun">:</span><span class="pln">enable</span><span class="pun">,</span><span class="pln"> </span><span class="pun">:</span><span class="pln">start </span><span class="pun">]</span><span class="pln">
</span><span class="kwd">end</span><span class="pln">

directory node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'doc_root'</span><span class="pun">]</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  owner </span><span class="str">'www-data'</span><span class="pln">
  group </span><span class="str">'www-data'</span><span class="pln">
  mode </span><span class="str">'0644'</span><span class="pln">
  action </span><span class="pun">:</span><span class="pln">create
</span><span class="kwd">end</span><span class="pln">

cookbook_file </span><span class="str">"#{node['main']['doc_root']}/index.html"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  source </span><span class="str">'index.html'</span><span class="pln">
  owner </span><span class="str">'www-data'</span><span class="pln">
  group </span><span class="str">'www-data'</span><span class="pln">
  action </span><span class="pun">:</span><span class="pln">create
</span><span class="kwd">end</span><span class="pln">

template </span><span class="str">"/etc/apache2/sites-available/000-default.conf"</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
  source </span><span class="str">"vhost.erb"</span><span class="pln">
  variables</span><span class="pun">({</span><span class="pln"> </span><span class="pun">:</span><span class="pln">doc_root </span><span class="pun">=&gt;</span><span class="pln"> node</span><span class="pun">[</span><span class="str">'main'</span><span class="pun">][</span><span class="str">'doc_root'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">})</span><span class="pln">
  action </span><span class="pun">:</span><span class="pln">create
  notifies </span><span class="pun">:</span><span class="pln">restart</span><span class="pun">,</span><span class="pln"> resources</span><span class="pun">(:</span><span class="pln">service </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"apache2"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">end</span></pre>

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

<ul>
	<li>
		تبدأ الوصفة في السطر الأول بتعريف السمة <code>node['main']['doc_root']‎</code>، حيث كان بإمكاننا استخدام متغير محلي بسيط هنا، ولكن يجب أن تعرّف الوصفات المتغيرات العامة التي ستُستخدَم في الوصفات المُضمَّنة أو الملفات الأخرى في معظم حالات الاستخدام، لذا يجب إنشاء سمة بدلًا من متغير محلي، لأن المتغير المحلي له نطاق محدود.
	</li>
	<li>
		يشغّل مورد التنفيذ execute الأمرَ <code>apt-get update</code> في الأسطر 3-5.
	</li>
	<li>
		يثبّت المورد apt_package الحزمة <code>apache2</code> في الأسطر 7-10.
	</li>
	<li>
		يفعّل مورد الخدمة service ويبدأ الخدمة <code>apache2</code> في الأسطر 12-15، ويجب إعلام هذا المورد لاحقًا بإعادة تشغيل الخدمة، ويجب أن يأتي تعريف الخدمة قبل أيّ مورد يحاول إعلام الخدمة، وإلّا فستتلقّى خطأ.
	</li>
	<li>
		يستخدم المورد directory في الأسطر 17-22 القيمة التي تعرّفها السمة المخصصة <code>node['main']['doc_root']‎</code> لإنشاء مجلد يكون بمثابة المستند الجذر.
	</li>
	<li>
		يُستخدَم المورد cookbook_file في الأسطر 24-29 لنسخ ملف محلي إلى خادم بعيد، إذ سينسخ هذا المورد الملف <code>index.html</code> ويضعه في المستند الجذر الذي أنشأناه في مهمة سابقة.
	</li>
	<li>
		يطبق مورد القالب template قالب مضيف أباتشي الوهمي ويعلِم خدمة apache2 بإعادة التشغيل في الأسطر 31-36.
	</li>
</ul>

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

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

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

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

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/deployment/chef/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-chef-%D9%88-ruby-%D9%85%D8%B9-rvm-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A-%D8%AE%D8%A7%D8%B5-%D9%8A%D8%B9%D9%85%D9%84-%D8%A8%D9%86%D8%B8%D8%A7%D9%85-ubuntu-r17/" rel="">كيفية تثبيت Chef و Ruby مع RVM على خادوم افتراضي خاص يعمل بنظام Ubuntu</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B1%D8%AC%D8%B9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B4%D9%87%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r615/" rel="">مرجع إلى أشهر أوامر لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">692</guid><pubDate>Sat, 08 Apr 2023 15:03:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; Chef &#x648; Ruby &#x645;&#x639; RVM &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A; &#x62E;&#x627;&#x635; &#x64A;&#x639;&#x645;&#x644; &#x628;&#x646;&#x638;&#x627;&#x645; Ubuntu</title><link>https://academy.hsoub.com/devops/deployment/chef/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-chef-%D9%88-ruby-%D9%85%D8%B9-rvm-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A-%D8%AE%D8%A7%D8%B5-%D9%8A%D8%B9%D9%85%D9%84-%D8%A8%D9%86%D8%B8%D8%A7%D9%85-ubuntu-r17/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/chef-RVM_480x300.png.f4c6e548896eb4abc05d2d0d8b98ed5b.png" /></p>
<h2 dir="rtl">مقدّمة</h2><p dir="rtl">Chef هو عبارة عن أداة مفتوحة المصدر مكتوبة بلغة Ruby، يُستخدم كإطار عمل يسمح لك بأتمتة مهام إدارة خواديم الوب الخاصة بك، كما يسمح لك بنشر خواديم افتراضية خاصة (VPS) مُعدّة مسبقًا دون الحاجة إلى تذكّر كيفية ضبطها بالضبط.</p><p dir="rtl">هذا الأمر مهم للغاية وتزداد أهميته تدريجيًا خاصةً أنه من الشائع امتلاك خواديم خاصة للاختبار، التطوير وإدارة قواعد البيانات بالإضافة لخواديم بيئة العمل الإنتاجية. كل واحدٍ منها له موارده وإعداداته الخاصة.</p><p dir="rtl">إنّ عملية تثبيت وإعداد وتحديث وصيانة خادوم افتراضي خاص (VPS) منفرد تُعتبر عملية مُستهلكة جدًا للوقت. Chef يسمح لك أن تقوم بسهولة بأتمتة هذه المهام وتعديلها بحيث تناسب كل خادومٍ على حدى أوتوماتيكيًا. باختصار، Chef يسمح لك أن توفر الوقت والمال عن طريق توفير نظام يسهُل إعادة استخدامه لاحقًا.</p><p dir="rtl">مطوروا Chef قاموا بتوفير سكربت (Script) سهل الاستخدام لتثبيته على توزيعة Ubuntu، ولكن المشكلة هي أن السكربت الذي قاموا بصناعته ليس قابلًا للاستخدام جيدًا مع إطار عمل Ruby on Rails، هذا الدليل سيرشدك إلى طريقة تثبيت بيئة Ruby حقيقية كاملة.</p><p dir="rtl">ربما تتوقع أن نقوم بتثبيت Ruby عن طريق هذا الأمر:</p><pre class="php ipsCode prettyprint">sudo apt-get install ruby</pre><p dir="rtl">ولكن هذه الطريقة ليست مُستحسنة في الواقع، لأنه حتّى وإن كنتَ لا تستخدم أكثر من إصدار Ruby على نفس الخادوم الافتراضي الخاص (VPS)، فستواجه مشاكل بالتعامل مع تعارض أحجار روبي (Ruby gems) أو بعض المشاكل بالتعامل مع المشاريع التي تتطلب إصدارًا معينًا من حجر روبي (gem). مدير إصدارات روبي (RVM) يستطيع أن يحلّ هذه المشاكل بسهولة.</p><p dir="rtl"><strong>ملاحظة</strong>: يمكنك استخدام <span style="font-family:'courier new', courier, monospace;">rbenv</span> عوضًا عن RVM أيضًا. اُختيرَ RVM لهذا الدليل لأنهما يتساويان بكل الأشياء التي نحتاجها حاليًا، من الأفضل أن تمتلك قوة إضافية ولا تحتاجها بدلًا من أنّ تكتشف أنك بحاجتها ولكن لا تستطيع الحصول عليها.</p><h2 dir="rtl">الخطوة الأولى - كيفية تثبيت روبي مع مدير إصدارات روبي (RVM)</h2><p dir="rtl">يعتمد <span style="line-height:11.1999998092651px;">RVM </span>على ثلاث أمور: Bash, Curl و Git.</p><p dir="rtl">صدفة Bash مثبّتة افتراضيًا على توزيعة أوبونتو، لذا فإنه يتوجب عليك تثبيت كلٍ من Git و Curl فقط حاليًا عن طريق تطبيق الأمر التالي في الطرفية (Terminal):</p><pre class="php ipsCode prettyprint">sudo apt-get install git-core curl
</pre><p dir="rtl">الآن يمكنك تثبيت مدير إصدارات روبي (RVM) عن طريق الأمر:</p><pre class="php ipsCode prettyprint">sudo \curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3</pre><p dir="rtl">ستستغرق هذه العملية حوالي 5 إلى 10 دقائق تقريبًا (اعتمادًا على سرعة اتصالك بالوب بالإضافة إلى الوقت المُستَغرَق ريثما يتم بناء الشفرة المصدرية لروبي).</p><p dir="rtl"><strong>ملاحظة:</strong> Chef يتعارض مع روبي 1.9، ولهذا فإننا نقوم بتثبيت روبي 1.9.3.</p><p dir="rtl">يجب أن ترى الرسالة التالية عندما تكتمل العملية:</p><pre class="php ipsCode prettyprint">* To start using RVM you need to run `source /usr/local/rvm/scripts/rvm` in all your open shell windows, in rare cases you need to reopen all shell windows.
</pre><pre><span style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;line-height:1.6;">افعل ما يطلبه منك، فقط طبّق الأمر:</span>
</pre><pre class="php ipsCode prettyprint">source /usr/local/rvm/scripts/rvm</pre><p dir="rtl">الآن، تأكد من أن روبي تم تثبيتها بشكلٍ صحيح عن طريق الأمر:</p><pre class="php ipsCode prettyprint">ruby -v</pre><p dir="rtl">إذا كانت توزيعتك من معمارية 32 بت فيجب أن ترى:</p><pre class="php ipsCode prettyprint">ruby 1.9.3p448 (2013-06-27 revision 41675) [i686-linux]</pre><p dir="rtl">إمّا إذا كانت من معمارية 64 بت، فيجب أن ترى شيئًا مثل:</p><pre class="php ipsCode prettyprint">ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]</pre><p dir="rtl">الآن، تأكد من أنّ أحجار روبي (Ruby gems) مثبّتة بشكل صحيح عن طريق الأمر:</p><pre class="php ipsCode prettyprint">gem -v</pre><p dir="rtl">يجب أن يتم عرض رقم الإصدار المثبّت مثل:</p><pre class="php ipsCode prettyprint">1.8.25</pre><p dir="rtl">إذا لم تكن مطور روبي أو إطار عمل Rails، فحينها قد ترغب بجعل الإصدار 1.9.3 من روبي هو الافتراضي حاليًا عن طريق الأمر:</p><pre class="php ipsCode prettyprint">rvm use 1.9.3 --default</pre><p dir="rtl"><strong>ملاحظة</strong>: هذا الأمر سيقوم بتجاهل أي إصدار مثبّت من قبل من روبي.</p><h2 dir="rtl">الخطوة الثانية - كيفية تثبيت Chef</h2><p dir="rtl">تثبيت Chef الآن أصبح بالإمكان تنفيذه بسهولة وسرعة عن طريق الأمر:</p><pre class="php ipsCode prettyprint">gem install chef --no-ri --no-rdoc
</pre><p dir="rtl">وللتأكد من أنّ Chef مثبّت بالفعل طبّق:</p><pre class="php ipsCode prettyprint">chef-solo -v</pre><p dir="rtl">وهو ما سيقوم بطباعة رقم الإصدار الحالي من Chef:</p><pre class="php ipsCode prettyprint">Chef: 11.4.4
</pre><p dir="rtl">سنقوم أيضًا بتثبيت بعض الإضافات المفيدة ألا وهي: Knife-Solo, Berkshelf و Foodcritic.</p><p dir="rtl">Knife-Solo هي مُلحق (plug-in) لأداة Knife الخاصة بـChef تجعل عملية إعداد الخواديم المفردة ممكنة باستخدام chef-solo. حيث أنّها تجعل عملية نشر الخواديم الصغيرة سهلة لأنها توفر عليك عناء تشغيل عميل Chef (يدعى chef-client) والذي بدوره يتطلب خادوم chef (يدعى chef-server).</p><p dir="rtl">لتثبيته، طبّق الأمر التالي:</p><pre class="php ipsCode prettyprint">gem install knife-solo --no-ri --no-rdoc
</pre><p dir="rtl">Berkshelf هو مُلحَق يساعدك على كتابة وتحزيم كتب الطبخ (cookbooks وهي ملفات الإعداد الخاصة بإعدادات الخواديم) أو تحميلها باستخدام ملفاتٍ محلية أو مستودع Git أو خادوم Chef.</p><p dir="rtl">عليكَ أولًا تثبيت بعض الاعتماديات التي يحتاجها Berkshelf ليتمكن من العمل:</p><pre class="php ipsCode prettyprint">sudo apt-get install libxslt-dev libxml2-dev
</pre><p dir="rtl">الآن لتثبيت Berkshelf، طبّق الأمر:</p><pre class="php ipsCode prettyprint">gem install berkshelf --no-ri --no-rdoc
</pre><p dir="rtl">وللتأكد من أنّ عملية التثبيت تمت بشكل صحيح، طبّق الأمر:</p><pre class="php ipsCode prettyprint">berks -v
</pre><p dir="rtl">وهو ما يجب أن يعطيك رقم الإصدار المثبّت مثل:</p><pre class="php ipsCode prettyprint">Berkshelf (2.0.7)
</pre><p dir="rtl">مُلحق Foodcritic يساعدك عن الكشف عن المشكلات في كتب الطهي الخاصة بـChef (تُدعى Chef Cookbooks). لتثبيته، طبّق الأمر:</p><pre class="php ipsCode prettyprint">gem install foodcritic --no-ri --no-rdoc
</pre><p dir="rtl">وكالمعتاد، للتأكد من عملية التثبيت:</p><pre class="php ipsCode prettyprint">foodcritic -V
</pre><p dir="rtl">ستحصل على:</p><pre class="php ipsCode prettyprint">foodcritic 2.2.0</pre><p dir="rtl">ملاحظة: في حال كنتَ تتساءل، الخيارات --no-ri –no-rdoc هي ليتم تجنّب إنشاء الوثائق الخاصة بالمُلحقات.</p><h2 dir="rtl">الخطوة التالية</h2><p dir="rtl">هذا الدّرس شرحَ لك كيفية تثبيت Chef على بيئة روبي حقيقية لتكون مناسبة لعملية تطوير البرمجيات. كل شيء تقريبًا أصبحَ جاهزًا للبدء بعملية الأتمتة عن طريق إنشاء وصفاتِكَ الخاصة (recipes) أو باستخدام وصفاتٍ من طرفٍ ثالث (3rd party).</p><p dir="rtl">ترجمة -وبتصرّف- للمقال: <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-install-chef-and-ruby-with-rvm-on-a-ubuntu-vps">How To Install Chef and Ruby with RVM on a Ubuntu VPS</a></p><p dir="rtl"> </p>
]]></description><guid isPermaLink="false">17</guid><pubDate>Tue, 24 Mar 2015 10:52:00 +0000</pubDate></item><item><title>&#x646;&#x62D;&#x648;&#x64E; &#x641;&#x647;&#x645;&#x64D; &#x623;&#x641;&#x636;&#x644; &#x644;&#x628;&#x64A;&#x626;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; Chef &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645;&#x64D; &#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A; &#x62E;&#x627;&#x635; (VPS)</title><link>https://academy.hsoub.com/devops/deployment/chef/%D9%86%D8%AD%D9%88%D9%8E-%D9%81%D9%87%D9%85%D9%8D-%D8%A3%D9%81%D8%B6%D9%84-%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-chef-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85%D9%8D-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A-%D8%AE%D8%A7%D8%B5-vps-r13/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2015_03/chef_480x300.png.b265189d197ad416a675af7ae42a7260.png" /></p>
<h2 dir="rtl">مقدمة</h2><p dir="rtl">توفّر أدوات إدارة الإعدادات وسيلةً سهلة لنشر إعدادات متوافقة لمجموعة من الحواسيب العميلة (client computers) عبر خادوم إدارة مركزي. <a rel="external nofollow" href="https://www.chef.io/">Chef</a> هو واحدٌ من أشهر أدوات إدارة الإعدادات. حيث أنه مكتوب بلغة روبي ويقرأ الإعدادات بناءً على ما يدعى بالوصفات (recipes).</p><p dir="rtl">يوفر <span style="line-height:20.3636360168457px;">Chef </span>وسيلة سريعة لنشر بيئات عمل كاملة عوضًا عن مجرد تطبيقات مفردة. في أي حالة تحتاج فيها إلى تثبيت أي قطعة برمجيات ثمّ تعديل ملفات إعداداتها، يمكن لـChef أن يقوم بأتمتة العملية.</p><p dir="rtl">في هذا الدليل، سنقوم بإلقاء لمحة عامة على كيفية تنظيم Chef لملفاته وما الأدوات والأنظمة التي يستخدمها ليقوم بمهامه.</p><h2 dir="rtl">مصطلحات Chef</h2><p dir="rtl">من المهم فهم عمل مختلف المكونات التي تشكل Chef وتفاصيلها.</p><h3 dir="rtl">بنية Chef التحتية التشغيلية</h3><p dir="rtl">سنبدأ بالحديث عن النماذج المختلفة التي تُشكل استراتيجية التطوير عالية المستوى لـChef. يتم تقسيم نظام Chef حسب الأدوار التي يلعبها كل حاسوب أو آلة:</p><ul><li><p dir="rtl"><strong>خادوم Chef</strong>: هذا هو المكان الرئيسي الذي يتم فيه تخزين إعدادات الوصفات، <span style="line-height:22.3999996185303px;text-align:right;">كتب الوصفات</span> (cookbooks) وتعريفات العُقَد (nodes definitions) وتعريفات محطة العمل (workstation definitions). إنّه الآلة المركزية التي ستستخدمها كل الآلات الأخرى ضمن الشبكة للحصول على إعدادات نشر الخواديم (deployments).</p></li><li><p dir="rtl"><strong>عُقَد Chef</strong>: وهي أهداف النشر التي سيتم ضبطها بواسطة Chef. كل عقدة تمثّل بيئة آلة منفصلة مُحتواة إمّا على خادوم حقيقي أو داخل آلة وهمية.</p></li></ul><p dir="rtl">يحتوي كلٌ من بيئات أنظمة التشغيل هذه على تطبيق عميل Chef لتتمكن من الاتصال مع خادوم Chef.</p><ul><li><p dir="rtl"><strong>محطات عمل Chef</strong>: هذه المحطات (workstations) هي المكان الذي يتم فيه إنشاء أو تعديل تفاصيل إعدادات Chef. يتم دفع ملفات الإعدادات بعدها إلى خادوم Chef الرئيسي، حيث ستكون متوفرة لنشر أي عقدة جديدة.</p></li></ul><p dir="rtl"><span style="line-height:20.3636360168457px;">يسمح لك </span> إعداد مختلف هذه المكونات أن تمتلك محطات عمل أو عُقّد متعددة. يمكن أن يتم إعداد العُقَد مباشرةً عندما تكون على الشبكة وعندما تكون متصلة بالخادوم الرئيسي.</p><p dir="rtl">قد تعطيك العناوين العريضة أعلاه انطباعًا عن أنّ مكونات Chef هي مكونات منفصلة يجب تشغيلها على أجهزة منفصلة، بينما في الواقع، يمكن لآلة واحدة فقط أن تقوم بدور اثنين من هذه المكونات أو حتى جميعها. هناك مشروع يدعى <a rel="external nofollow" href="https://docs.chef.io/chef_solo.html">chef-solo</a> يسمح لك بالتخلي عن استخدام الخادوم المركزي وضبط الحاسوب الذي يتم تثبيته عليه تلقائيًا دون الحاجة للخادوم.</p><h3 dir="rtl">تفاصيل الخادوم</h3><p dir="rtl">الخادوم هو نقطة التحكم المركزية التي يتم الوصول إليها من طرف جميع آلات Chef الأخرى، سواء كدور عميل أو مدير. يمكن القول أنّه عبارة عن مستودع كبير أو قاعدة بيانات لجميع تفاصيل الإعدادات.</p><p dir="rtl">خادوم Chef يعالج الاتصالات والأذونات الواردة من العُقَد ومحطات العمل وينظم البيانات لتكون جاهزة ليتم طلبها من قبل العملاء (clients). يمكن للخادوم أن يتضمن أيضًا واجهة وب للتمكن من إدارة أو ضبط بعض التفاصيل.</p><h3 dir="rtl">تفاصيل العُقَد</h3><p dir="rtl">كما ذُكر أعلاه، يمكن للعقدة أن تكون جهازًا فيزيائيًا أو آلةً وهمية. الشيء الوحيد الذي تحتاجه هو أن يكون لها اتصال بشبكة الويب وأن تكون قادرة على الاتصال بخادوم Chef المركزي. المُستخدم الذي يشغل تطبيق chef يجب أيضًا أن يكون قادرًا على تثبيت البرمجيات وتطبيق التغييرات على النظام.</p><p dir="rtl">كل عقدة تتواصل مع الخادوم المركزي باستخدام تطبيق يُدعى chef-client. هذا التطبيق يعالج عملية طلب البيانات من الخادوم المركزي بالإضافة إلى تنفيذ خطوات الإعداد اللازمة لإيصال العقدة إلى حالتها النهائية. يتواصل كلٌ من برنامج chef-client وخادوم Chef عن طريق استيثاق بمفتاح RSA.</p><p dir="rtl">يستخدم <span style="line-height:20.3636360168457px;">Chef-client </span>أداة تدعى ohai لجلب الإحصائيات عن العقدة. هذه الإحصائيات يتم استخدامها بهدف تثبيت تفاصيل إعدادات معينة وتأهيل المتغيرات المُحتواة داخل الملفات للعمل.</p><h3 dir="rtl">تفاصيل محطة العمل</h3><p dir="rtl">محطة العمل تمتلك الأدوات الضرورية لإنشاء وتعديل تفاصيل الإعدادات لأيٍّ من العُقَد المتوفرة كما أنها قادرة على التواصل مع خادوم Chef لجعلها متوفرة.</p><p dir="rtl">تُعتبر <span style="line-height:20.3636360168457px;">أداة knife </span>أداة مهمة لإدارة Chef على أي محطة عمل . تُستخدم <span style="line-height:20.3636360168457px;">هذه الأداة</span> كبوابة يمكنك من خلالها إعداد أي شيء تريد تخزينه على الخادوم. يمكنها أن تدير العُقَد والإعدادات ويمكن أنّ يتم استخدامها بشكل عام للوصول إلى الخادوم باستخدام "طريقة Chef معينة". بينما من الممكن أن يتم تسجيل الدخول إلى الخادوم باستخدام SSH وعمل جميع التغييرات لكل البيانات المطلوبة يدويًا، فهذه ليست الطريقة المثلى التي ينصح نظام Chef باستخدامها.</p><p dir="rtl">الإعدادات والتعريفات التي يتم إنشاؤها وتعديلها على محطة العمل يتم تلقائيًا إرسالها إلى نظام إدارة إصدارات معين (version control) ومن ثم يتم دفعها إلى الخادوم المركزي. يُدعى المستودع بـ"chef-repo”. وهو يقوم بإدارة كل البيانات المُحتَاجة لإعداد Chef.</p><h2 dir="rtl">هيكلية ملفات مستودع Chef</h2><p dir="rtl">يعالج <span style="line-height:20.3636360168457px;">Chef </span>إعداداته ومعلومات اعتمادياته على محطة العمل باستخدام هيكلية ملفات معيَنة، من المهم فهم هذه الهيكلية بهدف إنشاء وصفات فعالة ودفع التغييرات.</p><p dir="rtl">كما ذكرنا أعلاه، يجب أن يتم إبقاء <span style="line-height:20.3636360168457px;">ملفات إعداد الخادوم</span> تحت نظام إدارة إصدارات بمستودع يدعى "chef-repo”. وهو مجرد مسار (directory) عادي يحتوي على ملفات chef.</p><p dir="rtl">في هذا المجلّد، يمكننا أن نجد هيكلية مشابهة للتالي:</p><ul><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">certificates/</span>: يحتوي على شهادات SSL التي يمكن الوصول إليها من قبل العملاء (clients) للاستيثاق authentication</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">chefignore</span>: يحتوي على الملفات والمسارات التي تُعتبر من ملفات هيكلة Chef الأساسية والتي يجب ألّا يتم دفعها إلى الخادوم.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">config/</span>: يحتوي على واحدٍ من ملفيّ إعدادات المستودع.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">rake.rb</span>: يُعرّف بعض المتغيرات لإنشاء شهادات SSL وبعض الخيارات العامة.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">cookbooks/</span>: يحتوي كتب الوصفات (cookbooks) التي تقوم بإعداد البنية التحتية لمنظمتك.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">data_bags/</span>: يحتوي على حقائب بيانات مختلفة لإعداداتك.</p></li></ul><p dir="rtl">حقائب البيانات محمية بواسطة مسارات فرعية تحتوي تفاصيل إعدادات حساسة. وهي قابلة للوصول فقط من قبل العُقَد التي تمتلك شهادة SSL مطابقة وتحتوي على ملفات بصيغة JSON مع تفاصيل الإعدادات.</p><ul><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">environments/</span>: يحتوي على تفاصيل الإعدادات لنشر بيئات العمل المختلفة. كلّ بيئة معدّلة عن البيئة الافتراضية يجب أن يتم تعريفها داخل هذا المجلد.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">Rakefile</span>: هذا الملف يقوم بتعريف المهام التي يمكن لـchef القيام بها عبر إعداداته.</p></li><li><p dir="rtl"><span style="font-family:'courier new', courier, monospace;">roles/</span>: يحتوي الملفات التي تقوم بتعريف الشروط التي يمكن إسنادها إلى العُقَد.</p></li></ul><h3 dir="rtl">هيكلية ملفات <span style="line-height:22.3999996185303px;text-align:right;">كتب التّحضير</span> لـChef</h3><p dir="rtl">ضمنَ مسار <span style="line-height:22.3999996185303px;text-align:right;">كتب الوصفات</span> (cookbooks) في chef-repo, تقوم المسارات الفرعية بتعريف كتب وصفات معينة من أجل التطبيقات. ضمنَ كل مسار إعداد تطبيقٍ منفصل هناك هيكلية تعرّف كيف يجب أن يتم تثبيت هذه الخدمة ومالتغييرات التي يجب عملها لجعلها تعمل بصورة صحيحة.</p><p dir="rtl">ضمنّ التطبيق، ستجد ملفاتٍ وتعريفاتٍ تعرّف كيف يجب أن يتم تثبيت وإعداد أي تطبيق جديد.</p><p dir="rtl">يحتوي ملف <span style="font-family:'courier new', courier, monospace;">metadata.rb</span> أو <span style="font-family:'courier new', courier, monospace;">metadata.json</span> على معلومات البيانات الوصفية (metadata) حول الخدمة. هذا يتضمن معلوماتٍ أساسية كاسم كتاب الوصفات والإصدار، ولكنه أيضًا مكان حيث يتم تخزين معلومات الاعتماديات. إذا كان كتاب الو<span style="line-height:22.3999996185303px;">صفات</span> هذا يعتمد على كتب <span style="line-height:22.3999996185303px;">وصفات</span> أخرى ليتم تثبيته، فيمكن سردها ضمن هذا الملف وسيتكفل chef بعملية تثبيتها وإعدادها بالإضافة إلى كتاب الو<span style="line-height:22.3999996185303px;">صفات</span> الحالي.</p><p dir="rtl"><span style="line-height:20.3636360168457px;">يحتوي </span>مسار attributes على تعريفات الخواص (attribute definitions) التي يمكن أن يتم استخدامها للكتابة فوق الإعدادات الموجودة أو تعريفها من جديد للعُقَد التي ستمتلك هذه الخدمة.</p><p dir="rtl"><span style="line-height:20.3636360168457px;">يحتوي </span>مسار definitions على الملفات التي تقوم بالإعلان عن الموارد المستخدمة. هذا يعني أنه بإمكانك تجميع تشكيلة من الوظائف تحت عنوانٍ واحد.</p><p dir="rtl"><span style="line-height:20.3636360168457px;">يصف </span>مسار files كيف يجب لـchef أن يقوم بتوزيع الملفات عبر العقدة التي يتم نشر كتاب الو<span style="line-height:22.3999996185303px;">صفات</span> هذا عليها.</p><p dir="rtl"><span style="line-height:20.3636360168457px;">يحتوي </span>مسار recipes على الوصفات التي تقوم بتعريف كيف يجب أن يتم ضبط الخدمات. بشكلٍ عام، الخدمات هي عبارة عن ملفات صغيرة تقوم بضبط أمورٍ معينة ضمنَ النظام الأكبر. إذا كان يتم استخدام كتب <span style="line-height:22.3999996185303px;">وصفات</span> لتثبيت وضبط خادوم ويب، فحينها فالوصفات يمكن أن تُستخدم لتفعيل وحدات إضافية أو لتثبيت جدار ناري افتراضي.</p><p dir="rtl">يتم استخدام مسار templates لتوفير إدارة أكثر تطورًا وتعقيدًا للإعدادات. يمكنك توفير ملفات إعداد كاملة تحتوي بداخلها على أوامر روبي مضمّنة. يمكنك تعريف المتغيرات التي يتم طباعتها في ملفاتٍ أخرى كذلك.</p><h2 dir="rtl">الخاتمة</h2><p dir="rtl">قد لا يكون هذا المقال مُساعدًا لك في كتابة إعدادات Chef الخاصة بك، إلّا أنه يجب أن يعطيكَ لمحةً عامة حول ماهية المكونات المستقلة التي تعمل ضمنَ بيئة نشر معقّدة. بمجرد أن تبدأ بفهم كيفية عمل العقد والخواديم ومحطات العمل بتناسق تامٍ فيما بينها فستكون قادرًا على إيجاد طريقك إلى chef-repo، يمكنك أن تبدأ بفهم كيفية عمل بعض <span style="line-height:22.3999996185303px;text-align:right;">كتب الوصفات</span> المتوفرة.</p><p dir="rtl">ترجمة -وبتصرّف- للمقال <a rel="external nofollow" href="https://www.digitalocean.com/community/tutorials/how-to-understand-the-chef-configuration-environment-on-a-vps">How To Understand the Chef Configuration Environment on a VPS</a></p>
]]></description><guid isPermaLink="false">13</guid><pubDate>Mon, 09 Mar 2015 13:54:00 +0000</pubDate></item></channel></rss>
