{"id":87084,"date":"2020-07-03T13:42:34","date_gmt":"2020-07-03T11:42:34","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron"},"modified":"2020-07-03T13:42:34","modified_gmt":"2020-07-03T11:42:34","slug":"osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","title":{"rendered":"Bazat e Ansible pa t\u00eb cilat playbook-\u00ebt tuaj b\u00ebhen nj\u00eb l\u00ebmsh makaronash t\u00eb ngjitura","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Un\u00eb b\u00ebj shum\u00eb rishikime p\u00ebr kodin e tjer\u00ebve n\u00eb Ansible dhe shkruaj shum\u00eb vet\u00eb. Gjat\u00eb analiz\u00ebs s\u00eb gabimeve (si t\u00eb tjer\u00ebve ashtu edhe t\u00eb mia), si dhe nj\u00eb s\u00ebr\u00eb intervistash, kuptova gabimin kryesor q\u00eb b\u00ebjn\u00eb p\u00ebrdoruesit e Ansible \u2014 ata merren me gj\u00ebra komplekse pa zot\u00ebruar bazat.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb korrigjuar k\u00ebt\u00eb padrejt\u00ebsi universale, vendosa t\u00eb shkruaj nj\u00eb hyrje n\u00eb Ansible p\u00ebr ata q\u00eb e njohin tashm\u00eb. Paralajm\u00ebroj, kjo nuk \u00ebsht\u00eb nj\u00eb p\u00ebrmbledhje e manualeve, \u00ebsht\u00eb nj\u00eb artikull i gjat\u00eb me shum\u00eb shkronja dhe pa figura.<\/p>\n<p><\/p>\n<p>Niveli i pritur i lexuesit \u00ebsht\u00eb q\u00eb ka shkruar disa mij\u00ebra rreshta yaml, tashm\u00eb ka di\u00e7ka n\u00eb prodhim, por \"gjith\u00e7ka duket ndryshe\".<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Emrat<\/h1>\n<p><\/p>\n<p>Gabimi kryesor i p\u00ebrdoruesit t\u00eb Ansible \u00ebsht\u00eb se nuk e di si quhet \u00e7do gj\u00eb. N\u00ebse nuk e dini emrin, nuk mund t\u00eb kuptoni t\u00eb shkruar\u00ebn n\u00eb dokumentacion. Nj\u00eb shembull i gjall\u00eb: n\u00eb intervist\u00eb, nj\u00eb person q\u00eb, duket, pretendonte se kishte shkruar shum\u00eb n\u00eb Ansible, nuk arriti t\u00eb p\u00ebrgjigjej n\u00eb pyetjen \"nga cilat elemente p\u00ebrb\u00ebhet playbook?\". Kur ia vura n\u00eb dukje se \"pritej p\u00ebrgjigje q\u00eb playbook p\u00ebrb\u00ebhet nga play\", pasoi komenti shkat\u00ebrrues \"ne nuk e p\u00ebrdorim k\u00ebt\u00eb\". Njer\u00ebzit shkruajn\u00eb n\u00eb Ansible p\u00ebr para dhe nuk e p\u00ebrdorin play. <em>N\u00eb t\u00eb v\u00ebrtet\u00eb e p\u00ebrdorin, por nuk e din\u00eb se \u00e7far\u00eb \u00ebsht\u00eb.<\/em><\/p>\n<p><\/p>\n<p>Pra, le t\u00eb fillojm\u00eb me t\u00eb thjesht\u00ebn: si quhen gj\u00ebrat. Ndoshta e dini k\u00ebt\u00eb, ndoshta jo, sepse nuk e keni v\u00ebn\u00eb re kur keni lexuar dokumentacionin.<\/p>\n<p><\/p>\n<p>ansible-playbook ekzekuton playbook. Playbook \u2014 \u00ebsht\u00eb nj\u00eb skedar me zgjatjen yml\/yaml, brenda t\u00eb cilit ka di\u00e7ka t\u00eb till\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- hosts: group1\n  roles:\n    - role1\n\n- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Ne tashm\u00eb e kuptuam se i gjith\u00eb ky skedar \u00ebsht\u00eb playbook. Mund t\u00eb tregojm\u00eb ku jan\u00eb rolet (roles), ku jan\u00eb detyrat (tasks). Por ku \u00ebsht\u00eb play? Dhe \u00e7far\u00eb e ndan play nga role ose playbook?<\/p>\n<p><\/p>\n<p>K\u00ebto jan\u00eb t\u00eb gjitha n\u00eb dokumentacion. Dhe kjo kalon pa u v\u00ebn\u00eb re. Fillestar\u00ebt - p\u00ebr shkak se ka shum\u00eb dhe nuk mund t\u00eb mbani mend gjith\u00e7ka menj\u00ebher\u00eb. T\u00eb avancuarit - sepse \"gj\u00ebra triviale\". N\u00ebse jeni t\u00eb avancuar - rishikoni k\u00ebto faqe t\u00eb pakt\u00ebn nj\u00eb her\u00eb n\u00eb gjasht\u00eb muaj, dhe kodi juaj do t\u00eb b\u00ebhet nj\u00eb klas\u00eb m\u00eb i mir\u00eb.<\/p>\n<p><\/p>\n<p>Pra, mbani mend: Playbook \u2014 \u00ebsht\u00eb nj\u00eb list\u00eb, p\u00ebrb\u00ebr\u00eb nga play dhe <code>import_playbook<\/code>.<br \/>\nKjo \u00ebsht\u00eb nj\u00eb play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  roles:\n    - role1<\/code><\/pre>\n<p><\/p>\n<p>dhe kjo \u00ebsht\u00eb gjithashtu nj\u00eb play tjet\u00ebr:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb play? Pse \u00ebsht\u00eb ajo?<\/p>\n<p><\/p>\n<p>Play \u2014 \u00ebsht\u00eb elementi ky\u00e7 p\u00ebr playbook, sepse play dhe vet\u00ebm play lidh list\u00ebn e roleve dhe\/apo detyrave me list\u00ebn e hosteve ku duhet t\u00eb ekzekutohen ato. N\u00eb thell\u00ebsit\u00eb e dokumentacionit mund t\u00eb gjejm\u00eb p\u00ebrmendje p\u00ebr <code>delegate_to<\/code>, pluginet e lookup lokale, konfigurimet specifike p\u00ebr network-cli, hostet jump etj. Ato lejojn\u00eb t\u00eb ndryshoni pak vendndodhjen e ekzekutimit t\u00eb detyrave. Por, harrojeni k\u00ebt\u00eb. \u00c7do nga k\u00ebto opsione t\u00eb men\u00e7ura ka p\u00ebrdorime t\u00eb ve\u00e7anta, dhe ato nuk jan\u00eb universale. Ne po flasim p\u00ebr gj\u00ebrat bazike q\u00eb duhet t\u00eb din\u00eb dhe p\u00ebrdorin t\u00eb gjith\u00eb.<\/p>\n<p><\/p>\n<p>N\u00ebse doni t\u00eb \"b\u00ebni di\u00e7ka\" \"diku\" - shkruani play. Jo rol. Jo rol me module dhe delegat\u00eb. Ju merrni dhe shkruani play. N\u00eb t\u00eb, n\u00eb fush\u00ebn hosts renditni ku t\u00eb ekzekutoni, dhe n\u00eb roles\/tasks - \u00e7far\u00eb t\u00eb ekzekutoni.<\/p>\n<p><\/p>\n<p>\u00cbsht\u00eb e thjesht\u00eb, apo jo? Si mund t\u00eb jet\u00eb ndryshe?<\/p>\n<p><\/p>\n<p>Nj\u00eb nga momentet e karakteristike, kur njer\u00ebzit kan\u00eb d\u00ebshir\u00eb ta b\u00ebjn\u00eb k\u00ebt\u00eb jo p\u00ebrmes play, \u00ebsht\u00eb \"rolin q\u00eb e konfiguron gjith\u00e7ka\". Njer\u00ebzit duan t\u00eb ken\u00eb nj\u00eb rol q\u00eb e konfigur <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sq\/server\/dts-los-angeles\/\"   title=\"server\u00eb\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3633\">server\u00eb<\/a> \u00e7do lloj t\u00eb par\u00eb, dhe server\u00eb t\u00eb llojit t\u00eb dyt\u00eb.<\/p>\n<p><\/p>\n<p>Nj\u00eb shembull arketipik \u00ebsht\u00eb monitorimi. D\u00ebshirojn\u00eb t\u00eb ken\u00eb nj\u00eb rol monitorimi, i cili do t\u00eb konfiguroj\u00eb monitorimin. Roli i monitorimit caktohet n\u00eb hostet e monitorimit (n\u00eb p\u00ebrputhje me play-in). Por, rezulton se p\u00ebr monitorimin na duhen t\u00eb instalojm\u00eb paketat n\u00eb hostet q\u00eb po monitorojm\u00eb. Pse t\u00eb mos p\u00ebrdorim delegate? Dhe gjithashtu duhet t\u00eb konfigurojm\u00eb iptables. delegate? Dhe gjithashtu duhet t\u00eb shkruajm\u00eb\/rregullojm\u00eb konfigurimin p\u00ebr DBMS-n\u00eb, q\u00eb monitorimi t\u00eb funksionoj\u00eb. delegate! E n\u00ebse krijimtaria \u00ebsht\u00eb n\u00ebn flak\u00eb, mund t\u00eb b\u00ebjm\u00eb delegimin <code>include_role<\/code> n\u00eb nj\u00eb cik\u00ebl t\u00eb thelluar p\u00ebrmes nj\u00eb filtri t\u00eb zgjuar mbi list\u00ebn e grupeve, dhe brenda <code>include_role<\/code> mund t\u00eb b\u00ebni gjithashtu <code>delegate_to<\/code> on dhe p\u00ebrs\u00ebri. Dhe k\u00ebshtu fillon...<\/p>\n<p><\/p>\n<p>Nj\u00eb d\u00ebshir\u00eb e mir\u00eb - t\u00eb keni nj\u00eb rol t\u00eb vet\u00ebm monitoring, i cili \"b\u00ebn gjith\u00e7ka\" - na \u00e7on n\u00eb nj\u00eb kaos t\u00eb p\u00ebrbindsh\u00ebm nga i cili zakonisht ka nj\u00eb rrug\u00ebdalje: ta shkruani gjith\u00e7ka nga e para.<\/p>\n<p><\/p>\n<p>Ku ndodhi gabimi k\u00ebtu? N\u00eb at\u00eb moment, kur zbuloni se p\u00ebr t\u00eb kryer detyr\u00ebn \"x\" n\u00eb hostin X duhet t\u00eb shkoni n\u00eb hostin Y dhe t\u00eb b\u00ebni atje \"y\", duhet t\u00eb keni kryer nj\u00eb ushtrim t\u00eb thjesht\u00eb: duhet t\u00eb shkoni dhe t\u00eb shkruani play, e cila n\u00eb hostin Y b\u00ebn y. Jo t\u00eb shtoni di\u00e7ka n\u00eb \"x\", por t\u00eb shkruani nga e para. T\u00eb pakt\u00ebn me variabla t\u00eb forta.<\/p>\n<p><\/p>\n<p>Duket se, n\u00eb paragraf\u00ebt m\u00eb sip\u00ebr gjith\u00e7ka \u00ebsht\u00eb th\u00ebn\u00eb sakt\u00eb. Por kjo nuk \u00ebsht\u00eb rasti juaj! Sepse d\u00ebshironi t\u00eb shkruani kod t\u00eb ri p\u00ebrdorues q\u00eb \u00ebsht\u00eb DRY dhe ngjan si nj\u00eb bibliotek\u00eb, dhe duhet t\u00eb k\u00ebrkoni nj\u00eb metod\u00eb p\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>K\u00ebtu fshihet nj\u00eb tjet\u00ebr gabim i r\u00ebnd\u00eb. Nj\u00eb gabim, i cili shnd\u00ebrroi shum\u00eb projekte nga ato q\u00eb ishin shkruar n\u00eb m\u00ebnyr\u00eb t\u00eb pranueshme (mund t\u00eb ishte m\u00eb mir\u00eb, por gjith\u00e7ka funksionon dhe \u00ebsht\u00eb e leht\u00eb p\u00ebr t\u00eb shtuar) n\u00eb nj\u00eb tmerr t\u00eb plot\u00eb, n\u00eb t\u00eb cilin edhe autori nuk mund t\u00eb kuptoj\u00eb. Ai funksionon, por mbrohu Zot q\u00eb t\u00eb ndryshosh di\u00e7ka.<\/p>\n<p><\/p>\n<p>Ky gabim ting\u00ebllon k\u00ebshtu: roli \u00ebsht\u00eb nj\u00eb funksion bibliotekar. Kjo analogji ka shkat\u00ebrruar kaq shum\u00eb fillesa t\u00eb mira, saq\u00eb \u00ebsht\u00eb thjesht e trishtueshme t\u00eb shikosh. Roli nuk \u00ebsht\u00eb nj\u00eb funksion bibliotekar. Ai nuk mund t\u00eb b\u00ebj\u00eb llogaritje dhe nuk mund t\u00eb marr\u00eb vendime n\u00eb nivelin e play. M\u00eb kujto, cilat jan\u00eb vendimet q\u00eb merr play?<\/p>\n<p><\/p>\n<p>Faleminderit, keni t\u00eb drejt\u00eb. Play merr nj\u00eb vendim (n\u00eb fakt, p\u00ebrmban informacion) se cilat detyra dhe role duhet t\u00eb ekzekutohet n\u00eb cilat hoste.<\/p>\n<p><\/p>\n<p>N\u00ebse ju delegoni k\u00ebt\u00eb vendim te roli, madje edhe me llogaritje, e d\u00ebnon veten tuaj (dhe at\u00eb q\u00eb do t\u00eb p\u00ebrpiqet t\u00eb kuptoj\u00eb kodin tuaj) n\u00eb nj\u00eb ekzistenc\u00eb t\u00eb mjerueshme. Roli nuk vendos se ku do t\u00eb ekzekutohet. Ky vendim merret nga play. Roli b\u00ebn at\u00eb q\u00eb i \u00ebsht\u00eb th\u00ebn\u00eb, atje ku i \u00ebsht\u00eb th\u00ebn\u00eb.<\/p>\n<p><\/p>\n<p>Pse \u00ebsht\u00eb e rrezikshme t\u00eb merresh me programim n\u00eb Ansible dhe pse COBOL \u00ebsht\u00eb m\u00eb i mir\u00eb se Ansible, do t\u00eb flasim n\u00eb kapitullin p\u00ebr variablat dhe jinja. Deri tani le t\u00eb themi nj\u00eb gj\u00eb - \u00e7do llogaritje e juaja l\u00eb pas nj\u00eb ndihmes\u00eb t\u00eb pakthyeshme nga nd\u00ebrrimi i variablave global\u00eb, dhe ju nuk mund t\u00eb b\u00ebni asgj\u00eb p\u00ebr k\u00ebt\u00eb. Sa her\u00eb q\u00eb dy \"ndihmesat\" u takuan - gjith\u00e7ka humb.<\/p>\n<p><\/p>\n<p>V\u00ebrejtje p\u00ebr ata q\u00eb jan\u00eb t\u00eb v\u00ebmendsh\u00ebm: roli, sigurisht, mund t\u00eb ndikoj\u00eb n\u00eb rrjedh\u00ebn e kontrollit. Ka <code>delegate_to<\/code> dhe ai ka p\u00ebrdorime t\u00eb arsyeshme. Ka <code>meta: end host\/play<\/code>. Por! Mos harroni, ne po m\u00ebsojm\u00eb bazat? E harruat p\u00ebr <code>delegate_to<\/code>. Po flasim p\u00ebr kodin m\u00eb t\u00eb thjesht\u00eb dhe m\u00eb t\u00eb bukur n\u00eb Ansible. I cili \u00ebsht\u00eb i leht\u00eb p\u00ebr tu lexuar, i leht\u00eb p\u00ebr tu shkruar, i leht\u00eb p\u00ebr tu debuguar, i leht\u00eb p\u00ebr tu testuar dhe i leht\u00eb p\u00ebr tu shtuar. K\u00ebshtu q\u00eb, edhe nj\u00eb her\u00eb:<\/p>\n<p><\/p>\n<p><strong>play dhe vet\u00ebm play vendos se n\u00eb cilat hoste ekzekutohet \u00e7far\u00eb.<\/strong><\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb seksion ne kuptuam kund\u00ebrshtimin midis play dhe rolit. Tani do t\u00eb flasim p\u00ebr marr\u00ebdh\u00ebniet tasks vs role.<\/p>\n<p><\/p>\n<h1>Detyrat dhe Roli<\/h1>\n<p><\/p>\n<p>Le t\u00eb shqyrtojm\u00eb play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: somegroup\n  pre_tasks:\n    - some_tasks1:\n  roles:\n     - role1\n     - role2\n  post_tasks:\n     - some_task2:\n     - some_task3:<\/code><\/pre>\n<p><\/p>\n<p>Le t\u00eb supozojm\u00eb se duhet t\u00eb b\u00ebni foo. Dhe duket k\u00ebshtu <code>foo: name=foobar state=present<\/code>. Ku duhet ta shkruani k\u00ebt\u00eb? n\u00eb pre? post? T\u00eb krijoni rol?<\/p>\n<p><\/p>\n<p>\u2026 Dhe ku shkuan detyrat?<\/p>\n<p><\/p>\n<p>Ne fillojm\u00eb p\u00ebrs\u00ebri me bazat - pajisjen play. N\u00ebse po notoni n\u00eb k\u00ebt\u00eb \u00e7\u00ebshtje, nuk mund ta p\u00ebrdorni play si nj\u00eb baz\u00eb p\u00ebr \u00e7do gj\u00eb tjet\u00ebr, dhe rezultati juaj do t\u00eb rezultoj\u00eb \"i paq\u00ebndruesh\u00ebm\".<\/p>\n<p><\/p>\n<p>Dispositivi play: direktiva hosts, konfigurimet e play vet\u00eb dhe seksionet pre_tasks, tasks, roles, post_tasks. Parametrat e tjer\u00eb p\u00ebr play nuk jan\u00eb t\u00eb r\u00ebnd\u00ebsishme p\u00ebr ne tani.<\/p>\n<p><\/p>\n<p>Rendi i seksioneve t\u00eb tyre me detyra dhe role: <code>pre_tasks<\/code>, <code>roles<\/code>, <code>tasks<\/code>, <code>post_tasks<\/code>. Duke qen\u00eb se rendi semantik i ekzekutimit midis <code>tasks<\/code> dhe <code>roles<\/code> nuk \u00ebsht\u00eb i qart\u00eb, best practices thot\u00eb se ne shtojm\u00eb seksionin <code>tasks<\/code>, vet\u00ebm n\u00ebse nuk ka <code>roles<\/code>. N\u00ebse ka <code>roles<\/code>, at\u00ebher\u00eb t\u00eb gjitha detyrat e bashk\u00ebngjitura vendosen n\u00eb seksionet <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Ka mbetur vet\u00ebm ajo q\u00eb \u00ebsht\u00eb semantikisht e qart\u00eb: s\u00eb pari <code>pre_tasks<\/code>, pastaj <code>roles<\/code>, pastaj <code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Por ne ende nuk kemi p\u00ebrgjigjur n\u00eb pyetjen: ku duhet t\u00eb shkruajm\u00eb thirrjen e modulit <code>foo<\/code> ? A duhet t\u00eb shkruajm\u00eb nj\u00eb rol t\u00eb t\u00ebr\u00eb p\u00ebr \u00e7do modul? Apo \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb kemi nj\u00eb rol t\u00eb gjer\u00eb p\u00ebr gjith\u00e7ka? Dhe n\u00ebse nuk \u00ebsht\u00eb rol, ku t\u00eb shkruajm\u00eb \u2013 n\u00eb pre ose n\u00eb post?<\/p>\n<p><\/p>\n<p>N\u00ebse p\u00ebr k\u00ebto pyetje nuk ka nj\u00eb p\u00ebrgjigje t\u00eb argumentuar, at\u00ebher\u00eb kjo \u00ebsht\u00eb nj\u00eb shenj\u00eb e munges\u00ebs s\u00eb intuicionit, pra ato \"bazat e paq\u00ebndrueshme\". Le t\u00eb heqim dor\u00eb nga ky problem. S\u00eb pari pyetja kontrolluese: N\u00ebse play ka <code>pre_tasks<\/code> dhe <code>post_tasks<\/code> dhe nuk ka as detyra, as role, a mund t\u00eb prishet di\u00e7ka n\u00ebse e zhvendos detyr\u00ebn e par\u00eb nga <code>post_tasks<\/code> n\u00eb fund <code>pre_tasks<\/code>?<\/p>\n<p><\/p>\n<p>?<\/p>\n<p><\/p>\n<p>\u2026 Handlerat. Leximi i bazave zbulon nj\u00eb fakt t\u00eb r\u00ebnd\u00ebsish\u00ebm: t\u00eb gjitha handlerat flush'ohen automatikisht pas \u00e7do seksioni. Dometh\u00ebn\u00eb, t\u00eb gjitha detyrat nga <code>pre_tasks<\/code>\u2026 Handler\u00ebt. Leximi i bazave hap nj\u00eb fakt t\u00eb r\u00ebnd\u00ebsish\u00ebm: t\u00eb gjith\u00eb handler\u00ebt flush\u2019ohen automatikisht pas \u00e7do seksioni. Pra, ekzekutohen t\u00eb gjitha detyrat nga <code>post_tasks<\/code> , pastaj t\u00eb gjith\u00eb handler\u00ebt q\u00eb ishin notify. Pastaj ekzekutohen t\u00eb gjitha rolet dhe t\u00eb gjith\u00eb handler\u00ebt q\u00eb ishin notify n\u00eb role. Pastaj<\/p>\n<p><\/p>\n<p>dhe handler\u00ebt e tyre. <code>post_tasks<\/code> n\u00eb <code>pre_tasks<\/code>, at\u00ebher\u00eb, potencialisht, do ta p\u00ebrfundoni at\u00eb para se t\u00eb p\u00ebrfundoni handler'in. P\u00ebr shembull, n\u00ebse n\u00eb <code>pre_tasks<\/code> , potencialisht, do ta ekzekutoni at\u00eb para se t\u00eb kryehet handler\u2019i. P\u00ebr shembull, n\u00ebse n\u00eb <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sq\/server\/\"   title=\"serverin web\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">serverin web<\/a>, nd\u00ebrsa n\u00eb <code>post_tasks<\/code> instalohet dhe konfigurohet <code>pre_tasks<\/code> do t\u00eb \u00e7oj\u00eb n\u00eb at\u00eb q\u00eb n\u00eb momentin e \"d\u00ebrgimit\" serveri nuk do t\u00eb jet\u00eb aktiv dhe gjith\u00e7ka do t\u00eb prish\u00ebt.<\/p>\n<p><\/p>\n<p>do t\u00eb \u00e7oj\u00eb n\u00eb at\u00eb q\u00eb n\u00eb momentin e \"d\u00ebrgimit\" serveri ende nuk do t\u00eb jet\u00eb ndjekur dhe gjith\u00e7ka do t\u00eb prishet. <code>pre_tasks<\/code> dhe <code>post_tasks<\/code>? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0443\u0436\u043d\u043e\u0435 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0445\u044d\u043d\u0434\u043b\u0435\u0440\u044b) \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438. \u0410 <code>post_tasks<\/code> do t\u00eb na lejoj\u00eb t\u00eb punojm\u00eb me rezultatet e ekzekutimit t\u00eb roleve (duke p\u00ebrfshir\u00eb handler\u00ebt).<\/p>\n<p><\/p>\n<p>Nj\u00eb njoh\u00ebs i holl\u00ebsish\u00ebm i Ansible do t\u00eb na thot\u00eb se ka <code>meta: flush_handlers<\/code>, por p\u00ebrse na nevojitet flush_handlers, n\u00ebse mund t\u00eb mb\u00ebshtetemi te rendi i ekzekutimit t\u00eb seksioneve n\u00eb play? M\u00eb shum\u00eb se kaq, p\u00ebrdorimi i meta: flush_handlers mund t\u00eb na sjell\u00eb befasi me handler\u00ebt q\u00eb p\u00ebrs\u00ebriten, t\u00eb na b\u00ebj\u00eb t\u00eb kemi paralajm\u00ebrime t\u00eb \u00e7uditshme n\u00eb rastin e p\u00ebrdorimit t\u00eb <code>when<\/code> i <code>block<\/code> etj. Sa m\u00eb mir\u00eb ta njihni ansible, aq m\u00eb shum\u00eb nuanca do t\u00eb jeni n\u00eb gjendje t\u00eb p\u00ebrmendni p\u00ebr nj\u00eb zgjidhje \"t\u00eb zgjuar\". Dhe nj\u00eb zgjidhje e thjesht\u00eb - p\u00ebrdorimi i ndarjes natyrore midis pre\/roles\/post - nuk shkakton nuanca.<\/p>\n<p><\/p>\n<p>Dhe, kthehemi te 'foo' yn\u00eb. Ku duhet ta vendosim? N\u00eb pre, post apo n\u00eb roles? \u00cbsht\u00eb e qart\u00eb, kjo varet nga n\u00ebse na nevojiten rezultatet e pun\u00ebs s\u00eb handlerit p\u00ebr foo. N\u00ebse jo, at\u00ebher\u00eb foo nuk ka nevoj\u00eb t\u00eb vendoset as n\u00eb pre, as n\u00eb post - k\u00ebto seksione kan\u00eb nj\u00eb kuptim t\u00eb ve\u00e7ant\u00eb - ekzekutimi i detyrave para dhe pas mas\u00ebs kryesore t\u00eb kodit.<\/p>\n<p><\/p>\n<p>Tani, p\u00ebrgjigjja p\u00ebr pyetjen \"rol apo detyr\u00eb\" p\u00ebrfshin at\u00eb q\u00eb tashm\u00eb ekziston n\u00eb play - n\u00ebse atje ka tasks, at\u00ebher\u00eb duhet ta shkruani n\u00eb tasks. N\u00ebse ka roles, duhet t\u00eb krijoni nj\u00eb rol (edhe n\u00ebse \u00ebsht\u00eb nga nj\u00eb detyr\u00eb). Ju kujtoj, tasks dhe roles nuk p\u00ebrdoren nj\u00ebkoh\u00ebsisht.<\/p>\n<p><\/p>\n<p>Kuptimi i bazave t\u00eb Ansible ofron p\u00ebrgjigje t\u00eb arsyeshme p\u00ebr, duksh\u00ebm, pyetje me shije.<\/p>\n<p><\/p>\n<h1>Detyrat dhe rolet (pjesa e dyt\u00eb)<\/h1>\n<p><\/p>\n<p>Tani, le t\u00eb diskutojm\u00eb situat\u00ebn kur vet\u00ebm filloni t\u00eb shkruani nj\u00eb playbook. Ju nevojitet t\u00eb b\u00ebni foo, bar dhe baz. A jan\u00eb k\u00ebto tri detyra, nj\u00eb rol apo tri role? P\u00ebr t\u00eb p\u00ebrmbledhur pyetjen: n\u00eb \u00e7far\u00eb momenti duhet t\u00eb filloni t\u00eb shkruani role? \u00c7far\u00eb ka kuptim t\u00eb shkruani role, kur mund t\u00eb shkruani detyra?\u2026 \u00c7far\u00eb \u00ebsht\u00eb nj\u00eb rol?<\/p>\n<p><\/p>\n<p>Nj\u00eb nga gabimet m\u00eb t\u00eb m\u00ebdha (k\u00ebt\u00eb kam p\u00ebrmendur tashm\u00eb) \u00ebsht\u00eb t\u00eb mendosh se roli \u00ebsht\u00eb si nj\u00eb funksion n\u00eb bibliotek\u00ebn e nj\u00eb programi. Si duket p\u00ebrshkrimi i p\u00ebrgjithsh\u00ebm i nj\u00eb funksioni? Ai merr argumente si input, nd\u00ebrvepron me side causes, b\u00ebn side effects, kthen nj\u00eb vler\u00eb.<\/p>\n<p><\/p>\n<p>Tani, duhet t'i kushtoni v\u00ebmendje. \u00c7far\u00eb nga kjo mund t\u00eb b\u00ebhet n\u00eb rol? T\u00eb therras\u00eb efekte an\u00ebsore - gjithmon\u00eb, kjo \u00ebsht\u00eb thelbi i gjitha Ansible - t\u00eb b\u00ebni efekte an\u00ebsore. T\u00eb keni shkaqe an\u00ebsore? Elementar. Por me \"t\u00eb kaloni nj\u00eb vler\u00eb dhe t'i ktheni at\u00eb\" - k\u00ebtu nuk \u00ebsht\u00eb k\u00ebshtu. S\u00eb pari, nuk mund t\u00eb kaloni nj\u00eb vler\u00eb n\u00eb rol. Mund t\u00eb vendosni nj\u00eb variab\u00ebl globale me nj\u00eb jet\u00ebgjat\u00ebsi t\u00eb barabart\u00eb me play n\u00eb seksionin vars p\u00ebr rolin. Mund t\u00eb vendosni nj\u00eb variab\u00ebl globale me nj\u00eb jet\u00ebgjat\u00ebsi n\u00eb play brenda rolit. Ose madje me nj\u00eb jet\u00ebgjat\u00ebsi t\u00eb playbook (<code>set_fact<\/code>\/<code>register<\/code>). Por nuk mund t\u00eb keni \"variab\u00ebl lokale\". Nuk mund t\u00eb \"pranoni nj\u00eb vler\u00eb\" dhe \"ta ktheni at\u00eb\".<\/p>\n<p><\/p>\n<p>Nga kjo p\u00ebrfundon se: nuk mund t\u00eb shkruash di\u00e7ka n\u00eb ansible dhe t\u00eb mos e th\u00ebrras\u00ebsh side effects. Ndryshimi i variablave globale \u00ebsht\u00eb gjithmon\u00eb nj\u00eb side effect p\u00ebr funksionin. N\u00eb Rust, p\u00ebr shembull, ndryshimi i nj\u00eb varianti global \u00ebsht\u00eb <code>unsafe<\/code>. N\u00eb Ansible, metoda e vetme p\u00ebr t\u00eb ndikuar n\u00eb vlerat p\u00ebr rolin \u00ebsht\u00eb. Vini re fjal\u00ebt e p\u00ebrdorura: jo \"t\u00eb kaloni vler\u00ebn n\u00eb rol\", por \"t\u00eb ndryshoni vlerat q\u00eb p\u00ebrdor roli\". Nuk ka izolim midis rolieve. Nuk ka izolim midis detyrave dhe rolieve.<\/p>\n<p><\/p>\n<p>Pra, n\u00eb p\u00ebrfundim: <strong>roli \u00ebsht\u00eb jo nj\u00eb funksion<\/strong>.<\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb e mir\u00eb n\u00eb rolin? S\u00eb pari, roli ka vlera t\u00eb paracaktuara (<code>\/default\/main.yaml<\/code>), s\u00eb dyti, roli ka katalog\u00eb shtes\u00eb p\u00ebr ruajtjen e skedave.<\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb e mir\u00eb n\u00eb vlerat e paracaktuara? Ato jan\u00eb, q\u00eb n\u00eb piramid\u00ebn e Maslow-it, nj\u00eb tabel\u00eb shum\u00eb t\u00eb \u00e7uditshme t\u00eb prioriteteve t\u00eb variablave n\u00eb Ansible, defaultet e rolit jan\u00eb m\u00eb pak t\u00eb prioritizuara (p\u00ebrve\u00e7 parametrave t\u00eb linj\u00ebs s\u00eb komand\u00ebs s\u00eb Ansible). Kjo do t\u00eb thot\u00eb se, n\u00ebse duhet t'i ofroni vlera t\u00eb paracaktuara dhe t\u00eb mos shqet\u00ebsoheni se ato do t\u00eb z\u00ebvend\u00ebsojn\u00eb vlerat nga inventari ose variablat grupor, at\u00ebher\u00eb defaultet e rolit jan\u00eb vendi i vet\u00ebm i duhur p\u00ebr ju. (Po, pak po g\u00ebnjej \u2014 ka edhe <code>|d(your_default_here)<\/code>, por n\u00ebse flasim p\u00ebr vendet statike \u2014 at\u00ebher\u00eb vet\u00ebm defaultet e rolit).<\/p>\n<p><\/p>\n<p>\u00c7far\u00eb tjet\u00ebr \u00ebsht\u00eb e mir\u00eb n\u00eb role? Ato kan\u00eb katalog\u00ebt e tyre. K\u00ebto jan\u00eb katalog\u00eb p\u00ebr variablat, si konstant\u00eb (pra, t\u00eb llogaritur p\u00ebr rolin), ashtu dhe p\u00ebr dinamik\u00eb (ka nj\u00eb model ose anti-model t\u00eb till\u00eb \u2014 <code>include_vars<\/code> m\u00eb bashk\u00eb me <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>.). K\u00ebto jan\u00eb katalog\u00eb p\u00ebr <code>files\/<\/code>, <code>templates\/<\/code>. Gjithashtu, ato lejojn\u00eb q\u00eb rolet t\u00eb ken\u00eb modulat dhe plug-in-at e tyre (<code>library\/<\/code>). Por, n\u00eb krahasim me detyrat n\u00eb playbook (e cila gjithashtu mund t\u00eb ket\u00eb t\u00eb gjitha k\u00ebto), p\u00ebrfitimi k\u00ebtu \u00ebsht\u00eb vet\u00ebm se skedar\u00ebt nuk jan\u00eb mbledhur n\u00eb nj\u00eb grumbull, por n\u00eb disa grumbuj t\u00eb ve\u00e7ant\u00eb.<\/p>\n<p><\/p>\n<p>Nj\u00eb detaj tjet\u00ebr: mund t\u00eb p\u00ebrpiqeni t\u00eb b\u00ebni role q\u00eb do t\u00eb jen\u00eb t\u00eb disponueshme p\u00ebr rip\u00ebrdorim (p\u00ebrmes galaxy). Pas shfaqjes s\u00eb koleksioneve, shp\u00ebrndarja e rol\u00ebve mund t\u00eb konsiderohet pothuajse e harxhuar.<\/p>\n<p><\/p>\n<p>K\u00ebshtu, rolet kan\u00eb dy ve\u00e7ori t\u00eb r\u00ebnd\u00ebsishme: ato kan\u00eb defaultet (nj\u00eb ve\u00e7ori unike) dhe lejojn\u00eb strukturimin e kodit.<\/p>\n<p><\/p>\n<p>Duke u kthyer n\u00eb pyetjen fillestare: kur t\u00eb b\u00ebni detyra dhe kur t\u00eb b\u00ebni role? Detyrat n\u00eb playbook zakonisht p\u00ebrdoren ose si \"ngjis\u00eb\" para\/pas rolieve, ose si nj\u00eb element ndihm\u00ebs (at\u00ebher\u00eb n\u00eb kod nuk duhet t\u00eb ket\u00eb rol). Nj\u00eb grumbull detyrash t\u00eb zakonshme t\u00eb p\u00ebrziera me role \u00ebsht\u00eb padyshim nj\u00eb papast\u00ebrti. Duhet t\u00eb ndiqni nj\u00eb stil t\u00eb caktuar \u2014 ose detyra, ose role. Role ofrojn\u00eb ndarje entitetesh dhe default, detyrat lejojn\u00eb leximin m\u00eb t\u00eb shpejt\u00eb t\u00eb kodit. Zakonisht, n\u00eb rol d\u00ebrgohen kod m\u00eb \"stacionar\" (t\u00eb r\u00ebnd\u00ebsish\u00ebm dhe t\u00eb nd\u00ebrlikuar), dhe n\u00eb stilin e detyrave shkruhen skenar\u00eb ndihm\u00ebs.<\/p>\n<p><\/p>\n<p>Ka ekziston mund\u00ebsia p\u00ebr t\u00eb b\u00ebr\u00eb import_role si detyr\u00eb, por n\u00ebse e shkruani k\u00ebt\u00eb, b\u00ebhuni gati p\u00ebr nj\u00eb shpjegim p\u00ebr ndjenj\u00ebn tuaj estetike, pse d\u00ebshironi ta b\u00ebni k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>Nj\u00eb lexues i bezdissh\u00ebm mund t\u00eb thot\u00eb se rolet mund t\u00eb importojn\u00eb role, dhe rolet mund t\u00eb ken\u00eb var\u00ebsi p\u00ebrmes galaxy.yml, dhe ka gjithashtu di\u00e7ka t\u00eb frikshme dhe t\u00eb tmerrshme <code>include_role<\/code> \u2014 ju kujtoj, ne po p\u00ebrmir\u00ebsojm\u00eb aft\u00ebsit\u00eb n\u00eb Ansible-n themelor, e jo n\u00eb gimnasitik\u00ebn ritmike.<\/p>\n<p><\/p>\n<h1>Handlerat dhe detyrat<\/h1>\n<p><\/p>\n<p>Le t\u00eb diskutojm\u00eb p\u00ebr nj\u00eb tjet\u00ebr gj\u00eb t\u00eb dukshme: handlerat. Aft\u00ebsia p\u00ebr t'i p\u00ebrdorur ato si\u00e7 duhet \u00ebsht\u00eb thuajse nj\u00eb art. Cila \u00ebsht\u00eb diferenca midis nj\u00eb handleri dhe nj\u00eb detyr\u00eb?<\/p>\n<p><\/p>\n<p>Ata q\u00eb po e kujtojm\u00eb themelin, ja nj\u00eb shembull:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  tasks:\n    - foo:\n      notify: handler1\n  handlers:\n     - name: handler1\n       bar:<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb rol, handler\u00ebt q\u00ebndrojn\u00eb n\u00eb rolename\/handlers\/main.yaml. Handler\u00ebt ndahen midis t\u00eb gjith\u00eb pjes\u00ebmarr\u00ebsve n\u00eb play: pre\/post_tasks mund t\u00eb th\u00ebrrasin handler\u00ebt e rolieve, dhe roli mund t\u00eb th\u00ebrras\u00eb handler\u00ebt nga play. Megjithat\u00eb, thirrjet \"me kalim nd\u00ebrmjet rolieve\" t\u00eb handler\u00ebve shkaktojn\u00eb nj\u00eb \"wtf\" shum\u00eb m\u00eb t\u00eb madh se sa p\u00ebrs\u00ebritja e nj\u00eb handleri trivial. (Nj\u00eb tjet\u00ebr element i praktikave m\u00eb t\u00eb mira \u00ebsht\u00eb t\u00eb p\u00ebrpiqeni t\u00eb mos b\u00ebni p\u00ebrs\u00ebritje t\u00eb emrave t\u00eb handler\u00ebve).<\/p>\n<p><\/p>\n<p>Dallimi kryesor \u00ebsht\u00eb se nj\u00eb detyr\u00eb ekzekutohet (ideompatentisht) gjithmon\u00eb (plus\/minus etiketat dhe <code>when<\/code>), kurse handleri ekzekutohet sipas ndryshimit t\u00eb gjendjes (notify vepron vet\u00ebm n\u00ebse ka pasur ndryshim). \u00c7far\u00eb do t'i sjell\u00eb kjo? P.sh., se n\u00eb nj\u00eb ekzekutim t\u00eb ri, n\u00ebse nuk ka qen\u00eb ndryshimi, at\u00ebher\u00eb nuk do t\u00eb ndodhi as handleri. Dhe pse mund t\u00eb ndodh\u00eb q\u00eb na nevojitet t\u00eb ekzekutojm\u00eb handlerin kur s\u2019ka pasur nj\u00eb ndryshim n\u00eb detyr\u00ebn ndihmuese? P.sh., sepse di\u00e7ka ka marr\u00eb fund t\u00ebjk dhe ka pasur ndryshim, por ekzekutimi nuk arriti n\u00eb handler. P.sh., sepse rrjeti ishte temporalisht i nd\u00ebrprer\u00eb. Konfigurimi u ndryshua, sh\u00ebrbimi nuk u rilansua. N\u00eb ekzekutimin e ardhsh\u00ebm, konfigurimi tashm\u00eb nuk ndryshon, dhe sh\u00ebrbimi mbetet me versionin e vjet\u00ebr t\u00eb konfigurimit.<\/p>\n<p><\/p>\n<p>Situata me konfigurimin nuk \u00ebsht\u00eb e zgjidhshme (m\u00eb sakt\u00eb, mund t\u00eb shpikni nj\u00eb protokoll t\u00eb ve\u00e7ant\u00eb p\u00ebr rinisje me bandera skedari etj., por kjo nuk \u00ebsht\u00eb m\u00eb 'ansible temel' n\u00eb asnj\u00eb form\u00eb). Megjithat\u00eb, ka nj\u00eb histori tjet\u00ebr t\u00eb zakonshme: ne kemi instaluar nj\u00eb aplikacion, e kemi regjistruar at\u00eb <code>.service<\/code>-sked\u00ebn, dhe tani duam ta <code>daemon_reload<\/code> dhe <code>state=started<\/code>. Dhe vendi natyror p\u00ebr k\u00ebt\u00eb duket si handler. Por n\u00ebse e b\u00ebni at\u00eb nj\u00eb detyr\u00eb n\u00eb fund t\u00eb list\u00ebs s\u00eb detyrave apo nj\u00eb rol, at\u00ebher\u00eb ai do t\u00eb ekzekutohet idempotentisht \u00e7do her\u00eb. Edhe n\u00ebse playbook-u d\u00ebshton n\u00eb mes. Kjo nuk zgjidh problemin e restarted (nuk mund t\u00eb b\u00ebni nj\u00eb detyr\u00eb me atributin restarted, pasi do t\u00eb humbas\u00eb idempotent\u00ebsin\u00eb), por me siguri duhet t\u00eb b\u00ebni state=started, stabiliteti i p\u00ebrgjithsh\u00ebm i playbook-\u00ebve rritet, pasi zvog\u00eblohet numri i lidhjeve dhe gjendjes dinamike.<\/p>\n<p><\/p>\n<p>Nj\u00eb tjet\u00ebr pron\u00eb pozitive e handlerit \u00ebsht\u00eb se ai nuk e mbush output-in. Nuk kishte ndryshime \u2014 nuk ka skip ose ok n\u00eb output \u2014 m\u00eb e leht\u00eb p\u00ebr t'u lexuar. Po ashtu, \u00ebsht\u00eb nj\u00eb pron\u00eb negative \u2014 n\u00ebse gjeni nj\u00eb gabim n\u00eb nj\u00eb task q\u00eb ekzekutohet linear n\u00eb kalimin e par\u00eb, handler\u00ebt do t\u00eb ekzekutohen vet\u00ebm kur ka ndryshime, pra n\u00eb disa kushte \u2014 shum\u00eb rrall\u00eb. P\u00ebr shembull, hera e par\u00eb n\u00eb jet\u00ebn time pas pes\u00eb vjet\u00ebsh. Dhe, sigurisht, atje do t\u00eb ket\u00eb nj\u00eb gabim n\u00eb em\u00ebr dhe gjith\u00e7ka do t\u00eb prishen. Dhe her\u00ebn e dyt\u00eb nuk mund t'i nisni \u2014 nuk ka ndryshime.<\/p>\n<p><\/p>\n<p>P\u00ebrve\u00e7 k\u00ebsaj, duhet t\u00eb flasim p\u00ebr arritshm\u00ebrin\u00eb e variablave. P\u00ebr shembull, n\u00ebse b\u00ebni notify p\u00ebr nj\u00eb detyr\u00eb me cik\u00ebl, \u00e7far\u00eb do t\u00eb ket\u00eb n\u00eb variabla? Mund t\u00eb arrini t\u00eb kuptoni n\u00eb m\u00ebnyr\u00eb analitike, por nuk \u00ebsht\u00eb gjithmon\u00eb triviale, sidomos n\u00ebse variablat vijn\u00eb nga vende t\u00eb ndryshme.<\/p>\n<p><\/p>\n<p>K\u00ebshtu q\u00eb handler-\u00ebt jan\u00eb shum\u00eb m\u00eb pak t\u00eb dobish\u00ebm dhe shum\u00eb m\u00eb problematik\u00eb se sa duket. N\u00ebse mund t\u00eb shkruhet di\u00e7ka bukur (pa truke) pa handler-a, \u00ebsht\u00eb m\u00eb mir\u00eb ta b\u00ebni pa ta. N\u00ebse nuk ia del dot bukur \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb keni me ta.<\/p>\n<p><\/p>\n<p>Lexuesi i k\u00ebndsh\u00ebm e v\u00ebren drejt se nuk e kemi diskutuar <code>listen<\/code>, q\u00eb handler mund t\u00eb th\u00ebrras\u00eb notify p\u00ebr nj\u00eb handler tjet\u00ebr, q\u00eb handler mund t\u00eb p\u00ebrmbaj\u00eb import_tasks (i cili mund t\u00eb b\u00ebj\u00eb include_role me with_items), q\u00eb sistemi i handler-\u00ebve n\u00eb Ansible \u00ebsht\u00eb Turing-p\u00ebrmbush\u00ebs, q\u00eb handler-\u00ebt nga include_role merren me kuriozitet me handler-\u00ebt nga play etj. \u2014 e gjith\u00eb kjo sigurisht nuk \u00ebsht\u00eb \"themelore\").<\/p>\n<p><\/p>\n<p>Megjithat\u00eb, ka nj\u00eb \u00e7\u00ebshtje t\u00eb caktuar WTF, q\u00eb n\u00eb fakt \u00ebsht\u00eb nj\u00eb ve\u00e7ori, dhe q\u00eb duhet mbajtur mend. N\u00ebse keni nj\u00eb detyr\u00eb q\u00eb ekzekutohet me <code>delegate_to<\/code> dhe ka notify, at\u00ebher\u00eb handler-i p\u00ebrkat\u00ebs ekzekutohet pa <code>delegate_to<\/code>, dometh\u00ebn\u00eb n\u00eb hostin ku \u00ebsht\u00eb caktuar play. (Megjith\u00ebse handler-i, natyrisht, mund t\u00eb ket\u00eb <code>delegate_to<\/code> po ashtu).<\/p>\n<p><\/p>\n<p>Ve\u00e7an\u00ebrisht, dua t\u00eb them disa fjal\u00eb p\u00ebr rolet e rip\u00ebrdorshme. Para se t\u00eb shfaqeshin koleksionet, kishte iden\u00eb se mund t\u00eb b\u00ebhen role universale q\u00eb mund t\u00eb <code>ansible-galaxy install<\/code> Dhe shkoi. Funksionon n\u00eb t\u00eb gjitha OS-t\u00eb p\u00ebr t\u00eb gjitha rastet n\u00eb \u00e7do situat\u00eb. K\u00ebshtu, mendimi im \u00ebsht\u00eb: kjo nuk funksionon. \u00c7do rol me mb\u00ebshtetje p\u00ebr 100500 raste \u00ebsht\u00eb e d\u00ebnuar t\u00eb p\u00ebrballet me thell\u00ebsit\u00eb e problemeve t\u00eb skenar\u00ebve t\u00eb raritetit. Ato mund t\u00eb mbyllen me testime masive, por si me \u00e7do testim, ose keni nj\u00eb produkt t\u00eb dekartuar t\u00eb vlerave hyr\u00ebse dhe nj\u00eb funksion total, ose keni \"mbuluar skenare t\u00eb ve\u00e7ant\u00eb\". Mendimi im \u00ebsht\u00eb se \u00ebsht\u00eb shum\u00eb m\u00eb mir\u00eb n\u00ebse roli \u00ebsht\u00eb linear (kompleksiteti ciklomatk 1). <code>include_vars<\/code>, mb\u00ebshtetja p\u00ebr 100500 rast\u00eb \u00ebsht\u00eb e destinuar p\u00ebr humnera bug-esh corner case. Mund t\u00eb mbyllen p\u00ebrmes testimeve masive, por si p\u00ebr \u00e7do testim, ose keni nj\u00eb produkt t\u00eb produktit dekartian t\u00eb vlerave hyr\u00ebse dhe nj\u00eb funksion total, ose keni \"mbuluar skenar\u00eb t\u00eb ve\u00e7ant\u00eb\". Mendimi im \u2014 \u00ebsht\u00eb m\u00eb mir\u00eb n\u00ebse roli \u00ebsht\u00eb linear (kompleksiteti ciklomatik 1).<\/p>\n<p><\/p>\n<p>Sa m\u00eb pak if-\u00eb (t\u00eb dukshme ose deklaruese \u2014 n\u00eb form\u00ebn <code>when<\/code> p\u00ebr grupin e variablave), aq m\u00eb mir\u00eb \u00ebsht\u00eb roli. Ndonj\u00ebher\u00eb duhet t\u00eb b\u00ebni ndarjen, por, do ta p\u00ebrs\u00ebris, sa m\u00eb pak t\u00eb jen\u00eb, aq m\u00eb mir\u00eb. Pra, duket se nj\u00eb rol i mir\u00eb me galaxy (funksionon!) me shum\u00eb <code>include_vars<\/code> mund t\u00eb jet\u00eb m\u00eb pak i preferuar se \"rolin tuaj\" me pes\u00eb detyra. Momenti kur roli me galaxy \u00ebsht\u00eb m\u00eb mir\u00eb - kur filloni t\u00eb shkruani di\u00e7ka. Momenti kur b\u00ebhet m\u00eb keq - kur di\u00e7ka prishet, dhe keni dyshimin se \u00ebsht\u00eb p\u00ebr shkak t\u00eb \"rolit me galaxy\". E hapni, dhe atje jan\u00eb pes\u00eb p\u00ebrfshirje, tet\u00eb lista detyrash dhe nj\u00eb grumbull <code>when<\/code> mund t\u00eb jet\u00eb m\u00eb pak e preferuar se nj\u00eb rol \"i vet\u00eb\" me pes\u00eb detyra. Momentin kur roli me galaxy \u00ebsht\u00eb m\u00eb i mir\u00eb \u2014 kur filloni t\u00eb shkruani di\u00e7ka. Momentin kur ai b\u00ebhet m\u00eb i keq \u2014 kur di\u00e7ka prishet, dhe keni dyshimin se \u00ebsht\u00eb p\u00ebr shkak t\u00eb \"rolit me galaxy\". E hapni at\u00eb, dhe atje ka pes\u00eb inkluziones, tet\u00eb lista detyrash dhe nj\u00eb grumbull <code>when<\/code>\u2018\u2026 Dhe duhet t\u00eb kuptohet. N\u00eb vend t\u00eb 5 detyrave n\u00eb nj\u00eb list\u00eb linear, ku nuk ka asgj\u00eb p\u00ebr t'u prishur.<\/p>\n<p><\/p>\n<h1>Pak p\u00ebr inventarin, variablat grupore, plugin-in host_group_vars, hostvars. Si t\u00eb lidhni spaghetti n\u00eb nj\u00eb nyje Gordiane. Shkala dhe prioriteti i variablave, modeli i memories Ansible. \"At\u00ebher\u00eb ku duhet t\u00eb ruhet emri i p\u00ebrdoruesit p\u00ebr baz\u00ebn e t\u00eb dh\u00ebnave?\".<\/h1>\n<p><\/p>\n<ul>\n<li>Pak p\u00ebr inventarin, variablat grupore, plugin host_group_vars, hostvars. Si t\u00eb lidhni spaghetti me nyj\u00ebn Gordiane. Scope dhe precedence e variablave, modeli i memories n\u00eb Ansible. \"Por ku duhet ta ruaj emrin e p\u00ebrdoruesit p\u00ebr baz\u00ebn e t\u00eb dh\u00ebnave?\".<\/li>\n<li><code>\u2014 nosql notype nosense plastelin\u00eb t\u00eb but\u00eb. \u00cbsht\u00eb kudo, madje aty ku nuk e prisni. Pak p\u00ebr<\/code> !!unsafe <code>dhe yaml t\u00eb shijsh\u00ebm.<\/code> Un\u00eb b\u00ebj shum\u00eb rishikime p\u00ebr kodin e t\u00eb tjer\u00ebve n\u00eb Ansible dhe shkruaj shum\u00eb vet\u00eb.<\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508762\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c. \u0412 \u0445\u043e\u0434\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0448\u0438\u0431\u043e\u043a (\u043a\u0430\u043a \u0447\u0443\u0436\u0438\u0445, \u0442\u0430\u043a \u0438 \u0441\u0432\u043e\u0438\u0445), \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u044f \u043f\u043e\u043d\u044f\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0410\u043d\u0441\u0438\u0431\u043b\u0430 \u2014 \u043e\u043d\u0438 \u043b\u0435\u0437\u0443\u0442 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0438\u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e. \u0414\u043b\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0410\u043d\u0441\u0438\u0431\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87084","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b Ansible, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0430\u0448\u0438 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u2014 \u043a\u043e\u043c\u043e\u043a \u0441\u043b\u0438\u043f\u0448\u0438\u0445\u0441\u044f \u043c\u0430\u043a\u0430\u0440\u043e\u043d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-03T11:42:34+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bazat e Ansible, pa t\u00eb cilat playbook-u juaj \u00ebsht\u00eb nj\u00eb ngjyr\u00eb e p\u00ebrzier g\u00ebrricjesh | ProHoster","description":"\ud83e\udd47Bazat e Ansible, pa t\u00eb cilat playbook-u juaj \u00ebsht\u00eb nj\u00eb ngjyr\u00eb e p\u00ebrzier g\u00ebrricjesh | ProHoster","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b Ansible, \u0431\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0430\u0448\u0438 \u043f\u043b\u0435\u0439\u0431\u0443\u043a\u0438 \u2014 \u043a\u043e\u043c\u043e\u043a \u0441\u043b\u0438\u043f\u0448\u0438\u0445\u0441\u044f \u043c\u0430\u043a\u0430\u0440\u043e\u043d | ProHoster","og:description":"\u042f \u0434\u0435\u043b\u0430\u044e \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u043b\u044f \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0410\u043d\u0441\u0438\u0431\u043b \u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u0448\u0443 \u0441\u0430\u043c.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-03T11:42:34+00:00","article:modified_time":"2020-07-03T11:42:34+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87084","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 13:58:53","updated":"2026-02-22 15:29:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/87084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=87084"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/87084\/revisions"}],"predecessor-version":[{"id":162161,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/87084\/revisions\/162161"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=87084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=87084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=87084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}