You are on page 1of 17

‫‪Ansible‬‬

‫ال ‪ ansible‬هي من ال ‪ Configuration Management tool‬وهي اني بعمل ‪config‬‬


‫بطريقه ‪Automation‬‬
‫بنستخدم مع ال ‪ ansible‬برتوكول ال ‪SSH‬‬

‫من مميزاتها‪:‬‬
‫‪ : No Agent (Agentless) -‬مش بتحتاج منك انك تعمل ‪ install‬الي ‪ agent‬عند ال‬
‫‪client.‬‬
‫‪ :Idempotent -‬هي ان لو عندي مثال ‪ script‬ونفذته وعملت عليه أي تعديل وجيت انفذه‬
‫تاني ال هيتم تنفيذه هو التغييرات ال حصلت ع ال‪ script‬فقط‬
‫‪ :Declarative -‬يعني بيقارن ‪ state‬ب ‪ state‬ودا عكس طريقه ال ‪ procedural‬ال‬
‫هي ‪line by line‬‬
infrastructure

Host Inventory Playbook Control Node Edge server


‫ ال بيكون‬file ‫ بتاعي ال دا ال‬scrip ‫دا ال‬ ‫ ال‬server ‫دا ال‬ ‫ ال‬server ‫دا ال‬
‫ او ال‬hosts ‫فيه ال‬ ‫ ال هكتبه وانفذ بيه ال‬ansible ‫عليه ال‬ ‫عاوز انفذ عليه ال‬
‫ ال عاوز‬servers ‫ ال عاوزها‬tasks tasks ‫هعمل عليه ال‬ Tasks
‫اوصلها ال هي ال‬ ssh ‫والزم يكون فيه‬
edge server ‫ بينه‬connectivity
edge ‫وبين ال‬
servre
‫عشان ابدا اشتغل محتاج ‪4‬خطوات‬
‫‪-1‬اعمل ‪ install‬لل ‪ansible‬‬

‫‪ -2‬هعمل ‪ create‬لل ‪ inventory hosts‬ودا ال ‪ file‬ال بيكون فيه ال ‪ hosts‬بتاعتي ال عاوز‬


‫اوصلها عشان انفذ عليها ال ‪tasks‬‬
‫وال ‪ directory default‬بتاعها بيكون ف ال ‪/etc/ansible/hosts‬‬
‫‪ -‬واألفضل نقسم ال ‪ file‬لل ‪ group‬وطريقه كتابته كالتالي‬

‫وبعد كدا ف ال ‪ playbook‬احدد ‪ group‬معينه واعمل عليها ‪ tasks‬معينه‬


‫‪-3‬اعمل ‪ create‬لل ‪ ansible.cfg‬ودا ال ‪ config‬بتاع ال ‪ ansible‬وبحدد فيها اكتر من حاجه‬

‫ال ‪ default‬ال حاجات ال بقول ال ‪ ansible‬استخدمها زي مكان ال ‪ – inventory‬ال ‪. user‬‬


‫ال ‪ privilege‬عشان لما استخدم ‪ sudo‬مع مستخدم عادي ميطلبش مني ال ‪. password‬‬
‫ملحوظة‪ :‬اول ‪ cfg‬بيبص عليه هو ال ‪ directory‬ال انت واقف فيه – ثم لو ملقاش بيدور في ال‬
‫‪ – home dir‬لو ملقاش بيبص علي ال ‪ default‬ال هو ‪. /etc/ansible/ansible.cfg‬‬
‫‪:ssh connection Without password -4‬‬
‫علي ال ‪ master‬هكتب ال ‪ comm‬دا ‪ssh-keygen‬‬
‫ال هيحصل انه هينشا ‪ 2key‬ال ‪ public‬وال ‪ privet‬تحت المسار دا ‪~/.ssh‬‬

‫فهاخد ال ‪public‬‬

‫واضعه عند ال ‪ client‬تحت ال ‪.ssh/authorized_keys‬‬


‫ومهم اتاكد ان ال ‪ file‬معه )‪ permission (rw‬وال ‪ dir‬معه )‪permission (rwx‬‬

‫نعمل ‪ test‬عن طريق ال ‪ comm‬دا ودا بينفذلي امر واحد فقط‬

‫علي ال ‪ host‬هتخلي ال ‪ user‬ال هتنفذ ال ‪ task‬دي بيه تخليها بصالحيه ال ‪root‬‬

‫ال ‪ playbook‬ودا ال ‪ script‬ال هنفذه علي ال ‪ client‬وبيكون عباره عن ‪yml file‬‬


‫كدا جهزت ال ‪ playbook‬هبدا اعمل ‪ run‬عن طريق االمر دا‬

‫‪ -‬اقدر اعمل اكتر من ‪ play‬داخل ال ‪playbook‬‬


‫ملحوظه ‪ :‬لو عاوز ‪ vim‬يظبتلك المسافات وانت بتكب ال ‪ yml file‬هتعمل الخطوات دي‬
‫‪ -1‬هتفتح ال ‪ file‬دا‬

‫‪ -2‬هتكتب السطر دا‬

‫هنا بقوله لما يبقي نوع ‪ file‬يكون ‪ yml‬خلي المسافة الواحدة تساوي مسافتين ف بتسهل عليا ف‬
‫الكتابة شويا‬

‫ال ‪ : Ansible Ad Hoc‬من خالله اقدر استخدم ‪ module‬واحد فقط ع عكس ال ‪playbook‬‬
‫ال من خالله بقدر استخدم اكتر من ‪module‬‬
‫وبتتكتب بالطريق دي‬

‫هنا بستخدم ال ‪ module‬ال اسمها ‪ Shell‬عشان انفذ ‪ task‬معين علي ال ‪ host group‬ال‬
‫اسمها ‪ webserver‬في ال ‪inventory file‬‬
‫‪: Variables‬‬
‫"}}‪"{{var‬‬ ‫بيتم كتابه ال ‪ variables‬كدا‬

‫فيه طريقتين عشان استخدم ال ‪ Variables‬اول طريقه هي اني هكتبها في ال ‪ playbook‬بتاعي‬


‫بالشكل دا‬

‫ودي مش الطريقه ال ‪recommend‬‬


‫الطريقه التانية وال هي الطريقه ال ‪recommend‬‬
‫هي انك تعمل ‪ file‬منفصل لل ‪ var‬ويكون ‪ yml file‬برضو بالطريقه دي‬
‫‪ -1‬هتعمل ‪create yml fail‬‬

‫‪ -2‬هتكتب بداخله ال ‪ Variables‬ال انت عاوزها بالشكل دا‬

‫‪-3‬هتكتب اسم ال ‪ file‬ال فيه ال ‪ Variables‬في ال ‪ playbook‬بشكل دا‬

‫الزم تكتب اسم ال ‪ file‬صح وهتالقي الدنيا اشتغلت بكل سهوله‬


‫وال ‪ Variables‬فيه نوعين‬
‫‪Dictionary Variables‬‬ ‫‪List Variables‬‬
‫بيكون عباره عن ‪ Value‬بالشكل دا‬ ‫بتكون عبارة عن ‪ list‬بالشكل دا‬

‫او عباره عن ‪ Key‬بالشكل دا‬

‫ال ‪Facts‬‬

‫هي تعتبر‪ Variables‬بيجمع معلومات عن ال ‪ host‬قبل تنفيذ ال ‪ task‬فلو انت مش محتاجها‬


‫اقفلها النها بتستهلك ‪CPU‬و‪RAM‬‬
‫واعرف المعلومات ال جمعها عن طريق االمر دا‬
‫‪: Ansible Vault‬‬

‫هي ‪ tool‬من خاللها بعمل ‪ encrypt‬ل ‪ file‬ولكن عندي ‪ file‬فيه ‪ password‬فمن خالل ال‬
‫‪ vault‬اقدر اعمل ‪ encrypt‬لل ‪ file‬دا بالطريقه دي‬
‫‪ -1‬هعمل ‪ create file‬بال ‪vault‬‬

‫بيطلب مني ‪ password‬لل ‪ file‬بكتبه وبعدين بيفتحلي ال ‪ file‬عشان اكتب ال انا محتاج اكتبه‬
‫‪ -2‬لو عملت ‪ cat‬لل ‪ file‬داه يظهر انه ‪ encrypt‬بالطريقه دي‬

‫‪ -3‬لو محتاج انك تعرض الداتا دي هتكون بالطريقه دي فاالول هيطلب منك ال ‪password‬‬
‫بتاع ال ‪ file‬اول م تكتبه هيعرض الداتا‬
‫‪: Ansible Loops‬‬

‫بستخدم ال ‪ loop‬في حاله اني محتاج اعمل تكرار لل ‪ task‬وليكن مثال محتاج اعمل ‪2user‬‬
‫فالطريقه العادية من غير ال ‪ loop‬هتكون بالشكل دا‬

‫اني هعمل ‪ 2task‬لكل ‪ user‬هعمل ‪ task‬لوحدها‬


‫لكن هنا ممكن استخدم ال ‪ loop‬بحيث بدل م اعمل ‪ 2task‬ال اعمل ‪ task‬واحده واعمل ‪loop‬‬
‫تكرر ال ‪ task‬مره ب اسم اول ‪ user‬ومره ب اسم تاني ‪ user‬بالشكل دا‬
‫هنا عملت ‪ task‬واحده هيجي ينفذ هيشيل ال ‪ var‬ال اسمه ‪ item‬ويضع مكانه ‪testuser1‬‬
‫ويكرر ال ‪ task‬ويشيل ال ‪ var‬ويضع مكانه ‪testuser2‬‬
‫‪ : Ansible Conditionals‬بقدر من خاللها احدد شرط معين بناءا عليه يعمل ‪ run‬لل ‪task‬‬
‫ولو الشرط متحققش يعمل ‪ skip‬لل ‪ task‬دا‬

‫هنا عملت شرط عشان ال ‪ task‬تتنفذ وهو ان الوم ال ‪ selinux status‬تكون ‪enabled‬‬

‫هنا برضو بقوله عشان تنفذ ال ‪ task‬دي الزم يكون ال ‪ os‬بتاعي يكون ‪ Debian‬طب لو مش‬
‫‪ Debian‬مش هينفذ ال ‪ task‬وقدر اضع اكتر من شرط واستخدم ال ‪And-or-not‬‬

‫هنا مثال برضو بقوله استخدم ال ‪ pakg‬ال اسمها ‪ apt‬لو ال ‪ os‬كان ‪ ubuntu‬او ‪ yum‬لو ال‬
‫‪ os‬كان ‪centos‬‬
‫‪ : Ansible Handlers‬من خاللها بحدد ان ‪ task‬معينه يتعملها ‪ run‬بناءا علي ‪ task‬تانيه‬
‫مثال‪ :‬عندي مثال ال ‪ Apache‬لما بيحصل عليه علي تعديل بيطلب ‪ restart‬لل ‪ service‬ف بدل‬
‫م اعمل ‪ task‬لل ‪ restart‬ويحصل ‪ restart‬عطول لما اعمل ‪ run‬لل ‪ task‬ال هعمل‬
‫‪ handlers‬وهعمله ‪ notify‬بعد ‪ task‬ميعنه لما يحصل فيها أي ‪ change‬لل ‪ ntify‬دا يبدا يشغل‬
‫ال ‪. handlers‬‬

‫فلما يحصل أي تغيير ف ال ‪ task‬ال اسمها ‪ write the apache config file‬ال ‪notifyi‬‬
‫هتستدعي ال ‪ handlers‬ال اسمها ‪ restart apache‬ال هي بتعمل ‪ restart‬لل ‪ service‬ال‬
‫اسمها ‪httpd‬‬
‫‪-‬ال ‪ : error handling‬ببساطه دي ‪ handler‬بنستخدمها مع ال ‪ task‬عشان لو ال ‪ task‬دي‬
‫فيها ‪ error‬او هيحصلها ‪ failed‬ال ‪ playbook‬تكمل باقي ال ‪ task‬عادي وبيحصلش ‪failed‬‬
‫لل ‪ playbook‬كله‬
‫اسمها ‪ ignore_errors‬وبستخدمها بالشكل دا‬

‫ملحوظة ‪ :‬ال ‪ command‬دا ‪ /bin/false‬انا بقول ال ‪ shell‬انه يطلعلي ‪error‬‬


‫‪-‬يوجد أيضا ‪ handler‬اخري تسمي ‪ ignore_unreachable‬ممكن استخدمها ف حاله ان لو‬
‫عارف ان ‪ host‬من ال عندي واقع او فيه مشكله مخليه ال ‪ ansible‬مش هيقدر يوصله وبتكون‬
‫بالشكل دا‬

‫‪: Ansible Roles‬‬


‫الهدف منها اني بقلل ال ‪ playbook‬بتاعي بمعني اني بمعل ‪ directory‬لكل حاجه عندي واعمل‬
‫تحت كل ‪ dir‬ال ‪main.yml‬‬
‫‪ -‬ال ‪ : Ansible Galaxy‬هو ‪ community‬زي ال ‪ GitHub‬كدا الناس بتنزل عليه ال‬
‫‪ roles‬ال بتعملها‬
‫ودي ال ‪ command‬ال اكتر استخدمها مع ال ‪galaxy‬‬

‫مثال ‪ :‬هنعمل ‪ role‬وهنشوف ازاي هتكون عمليه منظمة جدا‬


‫‪ -1‬هعمل ‪ role‬ب اسم ‪ mywebserver‬بالطريقه دي‬

‫‪ -2‬لما اعمل ‪ tree‬هيكون هو قسم كل حاجه ممكن احتاجها بالطريقه دي‬

‫وتحت كل ‪ main.yml‬اشوف هي تخص أي واكتب ال انا محتاجه فيها‬


‫‪ -3‬هبدا اعمل ال ‪ playbook‬بتاعي باطريقه دي‬

‫ال ‪ roles‬ال هي ‪ mywebserver‬ال انا انشائتها فوق وتحتها كل حاجه كنا بنكتبها في ال‬
‫‪playbook‬‬
‫‪By: Mostafa Mahmoud Bahgat‬‬

You might also like