{"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\/et\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","title":{"rendered":"Ansible'i p\u00f5hialused, mille puudumisel on teie playbookid \u2014 \u00fches t\u00fckis kokku kleepunud makaronid","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ma teen palju \u00fclevaateid teiste Ansible'i koodide kohta ja kirjutan palju ise. Vigade anal\u00fc\u00fcsi k\u00e4igus (nii oma kui ka teiste) ning mitmete intervjuude t\u00f5ttu aru sain, et peamine viga, mida Ansible'i kasutajad teevad, on see, et nad sukeldusid keerulistesse asjadesse, ilma et oleks esmalt alustanud p\u00f5hialustest.<\/p>\n<p><\/p>\n<p>Selle universaalse eba\u00f5igluse parandamiseks otsustasin kirjutada Ansible'i sissejuhatuse neile, kes seda juba tunnevad. Hoian teid kursis, see ei ole lihtsalt manuaali \u00fcmberjutustamine, vaid pika formaadi kirjutamine, kus on palju teksti ja ei ole pilte.<\/p>\n<p><\/p>\n<p>Oodatav lugeja tase \u2014 on kirjutatud juba mitu tuhat rida YAML-i, midagi on juba tootmises, kuid \"kuidagi on k\u00f5ik konarlik\".<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Nimed<\/h1>\n<p><\/p>\n<p>Peamine Ansible'i kasutaja viga on see, et ei teata, kuidas asjad nimetatakse. Kui te ei tea nimesid, siis te ei saa aru, mida dokumentatsioonis kirjutatakse. Elav n\u00e4ide: vestlusel, inimene, kes nii-\u00f6elda v\u00e4itis, et ta on Ansible'iga palju t\u00f6\u00f6tanud, ei suutnud vastata k\u00fcsimusele, \"millistest elementidest playbook koosneb?\". Ja kui ma vihjasin, et \"oodati vastust, et playbook koosneb play'dest\", j\u00e4rgnes tappev kommentaar \"me ei kasuta seda\". Inimesed kirjutavad Ansible\u2019is raha eest ja ei kasuta plaani. <em>Tegelikult nad kasutavad, kuid ei tea, mis see on.<\/em><\/p>\n<p><\/p>\n<p>Alustame seega lihtsast: kuidas asju nimetatakse. V\u00f5ib-olla teate seda, aga v\u00f5ib-olla ei tea, sest ei p\u00f6\u00f6ranud t\u00e4helepanu, kui lugesite dokumentatsiooni.<\/p>\n<p><\/p>\n<p>ansible-playbook t\u00e4idab playbook'i. Playbook on fail, millel on laiendus yml\/yaml, mille sees on midagi sellist:<\/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>Me oleme juba aru saanud, et kogu see fail on playbook. Saame n\u00e4idata, kus on rollid (roles) ja kus on \u00fclesanded (tasks). Kuid kus on siin play? Ja kuidas erineb play rollist v\u00f5i playbook'ist?<\/p>\n<p><\/p>\n<p>Dokumentatsioonis on see k\u00f5ik olemas. Ja seda \u00fcletakse. Algajad \u2014 sest seal on liiga palju ja k\u00f5ik korraga ei j\u00e4\u00e4 meelde. Kogemustega \u2014 sest \"triviaalsed asjad\". Kui olete kogenud \u2014 lugege neid lehti v\u00e4hemalt kord poolaasta jooksul uuesti, ja teie kood muutub klassist paremaks.<\/p>\n<p><\/p>\n<p>Nii et pidage meeles: Playbook on nimekiri, mis koosneb play'st ja <code>import_playbook<\/code>.<br \/>\nSee on \u00fcks play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  roles:\n    - role1<\/code><\/pre>\n<p><\/p>\n<p>Ja see on veel \u00fcks play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Mis on siis play? Miks see on vajalik?<\/p>\n<p><\/p>\n<p>Play on playbook'i p\u00f5hielement, sest play ja ainult play sidub nimekirja rollidest ja\/v\u00f5i \u00fclesannetest nimekirjaga hostidest, kus neid t\u00e4ita tuleb. Dokumentatsiooni s\u00fcgavas osas v\u00f5ib leida viite <code>delegate_to<\/code>, kohalikud lookup-pluginid, network-cli-spetsiifilised seaded, jump-hostid jne. Need v\u00f5imaldavad veidi muuta \u00fclesannete t\u00e4itmise kohta. Aga unustage see. Igal neist kavalatest valikutest on v\u00e4ga spetsiifilised rakendused ja nad ei ole kindlasti universaalsed. Ja r\u00e4\u00e4gime p\u00f5hilistest asjadest, mida k\u00f5ik peaksid teadma ja kasutama.<\/p>\n<p><\/p>\n<p>Kui soovite \"midagi\" teostada \"kusagil\" \u2014 kirjutate play. Mitte rolli. Mitte rolli koos moodulite ja delegeeritud \u00fclesannetega. Te peate lihtsalt kirjutama play. Milles, v\u00e4ljas hosts, loetlete, kus teostada, ja roles\/tasks \u2014 mida teostada.<\/p>\n<p><\/p>\n<p>Lihtne, eks? Kuidas muidu oleks?<\/p>\n<p><\/p>\n<p>\u00dcks iseloomulik hetk, mil inimestel tekib soov teha seda mitte l\u00e4bi play, on \"roll, mis k\u00f5ik seadistab\". Tahaksin omada rolli, mis seadistab ja <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/dts-los-angeles\/\"   title=\"serverilt\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3633\">serverilt<\/a> esmase t\u00fc\u00fcbi ja teise t\u00fc\u00fcbi serverid.<\/p>\n<p><\/p>\n<p>Arhet\u00fc\u00fcpiline n\u00e4ide on j\u00e4lgimine. Sooviks olla roll monitoring, mis seadistab j\u00e4lgimise. Roll monitoring m\u00e4\u00e4ratakse j\u00e4lgimishostidele (vastavas play-s). Kuid selgub, et j\u00e4lgimiseks peame paigaldama paketid hostidesse, mida me j\u00e4lgime. Miks mitte kasutada delegate'i? Ja veel tuleb seadistada iptables. delegate? Ja veel tuleb kirjutada\/korrigeerida andmebaasi seadistust, et j\u00e4lgimine oleks lubatud. delegate! Ja kui loominguline inspiratsioon tuleb, siis saab teha delegeerimise <code>include_role<\/code> ka sisemise ts\u00fckli keerulise filtri kaudu gruppide nimekirja, ja sees <code>include_role<\/code> saab veel teha <code>delegate_to<\/code> uuesti. Ja l\u00e4ks lahti\u2026<\/p>\n<p><\/p>\n<p>Hea soov \u2014 omada \u00fchte ainukest rolli monitoring, mis \"k\u00f5ike teeb\" \u2014 viib meid p\u00f5rgu, millest enamasti on vaid \u00fcks v\u00e4ljap\u00e4\u00e4s: k\u00f5ik kirjutada nullist.<\/p>\n<p><\/p>\n<p>Kus siin viga juhtus? Hetkel, kui avastasite, et \u00fclesande \"x\" t\u00e4itmiseks(hostis X) peate minema hosti Y ja seal tegema \"y\", oleksite pidanud tegema lihtsa harjutuse: minna ja kirjutada play, mis hostis Y teeb y. Mitte lisada midagi \"x\"-isse, vaid kirjutada see algusest peale. Olgu see isegi k\u00f5vasti kodeeritud muutujatega.<\/p>\n<p><\/p>\n<p>Tundub, et \u00fclaltoodud l\u00f5ikudes on k\u00f5ik \u00f5ige. Aga see ei ole teie juhtum! Sest te soovite kirjutada taaskasutatavat koodi, mis on DRY ja sarnaneb raamatukoguga, ja tuleb otsida viis, kuidas seda teha.<\/p>\n<p><\/p>\n<p>Siin peitub veel \u00fcks t\u00f5sine viga. Viga, mis muutis hulga projekte talutavast (saab paremini, aga k\u00f5ik t\u00f6\u00f6tab ja on lihtne t\u00e4iendada) t\u00e4ielikuks \u00f5uduseks, milles isegi autor ei saa aru. See t\u00f6\u00f6tab, aga jumal hoidku, kui midagi muuta.<\/p>\n<p><\/p>\n<p>See viga k\u00f5lab nii: roll on raamatukogu funktsioon. See analoogia on h\u00e4vitanud nii palju h\u00e4id algatusi, et on lihtsalt kurb vaadata. Roll ei ole raamatukogu funktsioon. Ta ei saa teha arvutusi ja ta ei saa langetada otsuseid tasemel play. Tuletage mulle meelde, milliseid otsuseid teeb play?<\/p>\n<p><\/p>\n<p>Ait\u00e4h, sa oled \u00f5igus. Play teeb otsuseid (t\u00e4psemalt, sisaldab teavet) selle kohta, milliseid \u00fclesandeid ja rolle, millistel hostidel t\u00e4ita.<\/p>\n<p><\/p>\n<p>Kui te delegeerite selle otsuse rollile, veelgi enam arvutustega, olete teinud endale (ja sellele, kes teie koodi p\u00fc\u00fcab lahti harutada) \u00f5nnetu eksistentsi. Roll ei otsusta, kus ta t\u00e4idetakse. Selle otsuse teeb play. Roll teeb seda, mida talle \u00f6eldi, seal, kus talle \u00f6eldi.<\/p>\n<p><\/p>\n<p>Miks Ansible\u2019iga programmeerimine on ohtlik ja miks COBOL on parem kui Ansible, arutame peat\u00fckis muutujatest ja jinja'st. Seni \u00fctleme vaid \u00fche \u2014 iga teie arvutus j\u00e4tab endast maha kustutamatu j\u00e4lje globaalses muutujates, ja te ei saa sellega mitte midagi teha. Niikaua kui kaks \"j\u00e4lge\" ristuvad \u2014 on k\u00f5ik kadunud.<\/p>\n<p><\/p>\n<p>T\u00e4helepanek neile, kes peavad k\u00f5ike t\u00e4pselt: roll v\u00f5ib kindlasti m\u00f5jutada juhtimisvoogu. On olemas <code>delegate_to<\/code> ja sellel on m\u00f5istlikud rakendused. On <code>meta: end host\/play<\/code>. Aga! Pea meeles, et me \u00f5petame aluseid? Unustasite <code>delegate_to<\/code>. R\u00e4\u00e4gime k\u00f5ige lihtsamatest ja ilusamatest koodidest Ansible\u2019is. Mis on kergesti loetavad, kergesti kirjutatavad, kergesti silutavad, kergesti testitavad ja kergesti t\u00e4iendatavad. Nii et, veel kord:<\/p>\n<p><\/p>\n<p><strong>play ja ainult play otsustab, millistel hostidel mida teostatakse.<\/strong><\/p>\n<p><\/p>\n<p>Selles osas oleme arutanud play ja rolle. N\u00fc\u00fcd r\u00e4\u00e4gime \u00fclesannetest vs rollist.<\/p>\n<p><\/p>\n<h1>\u00dclesanded ja Rollid<\/h1>\n<p><\/p>\n<p>Vaadakem playd:<\/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>Oletame, et peate tegema foo. Ja see n\u00e4eb v\u00e4lja nagu <code>foo: name=foobar state=present<\/code>. Kuhu see kirjutada? pre? post? Luua roll?<\/p>\n<p><\/p>\n<p>\u2026 Ja kuhu kadusid \u00fclesanded?<\/p>\n<p><\/p>\n<p>Alustame taas algusest \u2013 play seadistamisest. Kui te ei m\u00f5ista seda teemat, ei saa te play'it kasutada k\u00f5igi muu aluseks, ja teie tulemus j\u00e4\u00e4b \"ebastabiilseks\".<\/p>\n<p><\/p>\n<p>Play-seade: hosts-diktriiv, play-i seadistused ning pre_tasks, tasks, roles, post_tasks jaotused. Teised parameetrid play jaoks ei ole praegu olulised.<\/p>\n<p><\/p>\n<p>Nende sektsioonide j\u00e4rjekord \u00fclesannete ja rollide jaoks: <code>pre_tasks<\/code>, <code>roles<\/code>, <code>tasks<\/code>, <code>post_tasks<\/code>. Kuna semantiliselt ei ole t\u00e4itmise j\u00e4rjekord selge, siis parimad praktikad \u00fctlevad, et lisame sektsiooni <code>tasks<\/code> ja <code>roles<\/code> , ainult juhul, kui pole <code>tasks<\/code>. Kui on olemas <code>roles<\/code>, siis k\u00f5ik vastavad \u00fclesanded paigutatakse sektsioonidesse. <code>roles<\/code>J\u00e4\u00e4b ainult see, mis semantiliselt on selge: k\u00f5igepealt <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Kuid me ei ole ikka veel vastanud k\u00fcsimusele: kuhu kirjutada moduli <code>pre_tasks<\/code>, siis <code>roles<\/code>, siis <code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>kutsumine? Kas peame iga mooduli jaoks kirjutama kogu rolli? V\u00f5i on parem omada paksu rolli k\u00f5ike jaoks? Ja kui ei ole rolli, siis kuhu kirjutada \u2014 pre-sse v\u00f5i post-sse? <code>foo<\/code> Kui nendele k\u00fcsimustele ei ole p\u00f5hjendatud vastust, siis see on m\u00e4rk intuitsiooni puudumisest, ehk need \"ebakindlad alused\". Alustame kontrollk\u00fcsimusega: Kui play-l on<\/p>\n<p><\/p>\n<p>Kui nendele k\u00fcsimustele ei ole p\u00f5hjendatud vastuseid, siis on see m\u00e4rk intuitsiooni puudumisest, st need samad \"ebastabiilsed alused\". Vaadakem l\u00e4hemalt. Esiteks kontrollk\u00fcsimus: Kui play'l on <code>pre_tasks<\/code> ja <code>post_tasks<\/code> viin l\u00f5pupoole? <code>post_tasks<\/code> Muidugi, k\u00fcsimuse s\u00f5nastus viitab, et midagi l\u00e4heb katki. Aga mis t\u00e4pselt? <code>pre_tasks<\/code>?<\/p>\n<p><\/p>\n<p>\u2026 K\u00e4itlejad. P\u00f5hjaliku lugemise avab olulise fakti: k\u00f5ik k\u00e4itlejad t\u00fchjenevad automaatselt p\u00e4rast iga sektsiooni. See t\u00e4hendab, et k\u00f5igepealt t\u00e4idetakse k\u00f5ik \u00fclesanded<\/p>\n<p><\/p>\n<p>\u2026 K\u00e4itlejad. P\u00f5him\u00f5tete lugemine toob esile olulise fakti: k\u00f5ik k\u00e4itlejad tehakse automaatselt p\u00e4rast iga sektsiooni. St. k\u00f5ik \u00fclesanded viiakse ellu <code>pre_tasks<\/code>ja nende k\u00e4itlejad. <code>post_tasks<\/code> Seega, kui te t\u00f5state \u00fclesande<\/p>\n<p><\/p>\n<p>\u00fcles, siis potentsiaalselt t\u00e4idate selle enne k\u00e4itleja t\u00e4itmist. N\u00e4iteks, kui <code>post_tasks<\/code> ja <code>pre_tasks<\/code>, siis v\u00f5ite potentsiaalselt t\u00e4ita selle k\u00e4itleja enne selle t\u00e4itmist. N\u00e4iteks kui <code>pre_tasks<\/code> , ning doole midagi saadetakse, siis selle \u00fclesande viimine sektsiooni <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/et\/server\/\"   title=\"veebiserveriks\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">veebiserveriks<\/a>toob kaasa selle, et \"saadetamise\" hetkel server ei ole veel k\u00e4ivitatud ja k\u00f5ik l\u00e4heb katki. <code>post_tasks<\/code> Ja n\u00fc\u00fcd m\u00f5elgem veel kord, miks on meil <code>pre_tasks<\/code> toob kaasa selle, et \"saatmise\" hetkel pole server veel k\u00e4ivitatud ja k\u00f5ik maha kukub.<\/p>\n<p><\/p>\n<p>Peen Ansible'i ekspert \u00fctleb meile, et on olemas <code>pre_tasks<\/code> ja <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> meta: flush_handlers<\/p>\n<p><\/p>\n<p>, aga miks on meil flush_handlers, kui saame toetuda sektsioonide t\u00e4itmise j\u00e4rjekorrale play-s? Veelgi enam, meta: flush_handlers'i kasutamine v\u00f5ib tuua meile ootamatuid korduvaid k\u00e4itlejaid, teha meile kummalisi hoiatuse juhtudel, kui kasutame <code>when<\/code>block <code>jne. Mida rohkem te Ansible'i tunnete, seda rohkem n\u00fcansse saate \u00f6elda \"kavalate\" lahenduste kohta. Ja lihtne lahendus \u2014 loomulik jaotus pre\/roles\/post vahel \u2014 ei tekita n\u00fcansse.<\/code> on <code>plokk<\/code> jne. Mida paremini te Ansible'it tunnete, seda rohkem n\u00fcansse te suudate nimetada \"nutika\" lahenduse jaoks. Lihtne lahendus \u2013 loomulik eristamine pre\/roles\/post \u2013 ei tekita n\u00fcansse.<\/p>\n<p><\/p>\n<p>Ja naaseme meie 'foo' juurde. Kuhu selle asetame? Pre, post v\u00f5i roles? Ilmselgelt s\u00f5ltub see sellest, kas me vajame k\u00e4itleja t\u00f6\u00f6st tulenevaid tulemusi foosse. Kui neid pole, ei ole foo vaja panna ei pre-sse ega post-i \u2013 need sektsioonid on eriliste t\u00e4hendustega \u2013 \u00fclesannete t\u00e4itmine enne ja p\u00e4rast peamist koodimassi.<\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd on k\u00fcsimuse \"roll v\u00f5i \u00fclesanne\" vastus seotud sellega, mis juba on play's \u2013 kui seal on \u00fclesandeid, tuleb need kirjutada \u00fclesannete alla. Kui on rolle \u2013 tuleb teha roll (isegi kui see koosneb \u00fchest \u00fclesandest). Meenutan, et \u00fclesanded ja rollid ei kasutata samaaegselt.<\/p>\n<p><\/p>\n<p>Ansible\u2019i p\u00f5hialuste m\u00f5istmine annab p\u00f5hjendatud vastused, n\u00e4iliselt maitselikeks k\u00fcsimusteks.<\/p>\n<p><\/p>\n<h1>\u00dclesanded ja rollid (teine osa)<\/h1>\n<p><\/p>\n<p>N\u00fc\u00fcd arutame olukorda, kus hakkate alles m\u00e4ngu looma. Te peate tegema foo, bar ja baz. Need on kolm \u00fclesannet, \u00fcks roll v\u00f5i kolm rolli? \u00dcldistades k\u00fcsimust: millal peaks hakata rolle kirjutama? Mis m\u00f5te on rollide kirjutamisel, kui saab kirjutada \u00fclesandeid?\u2026 Ja mis on roll?<\/p>\n<p><\/p>\n<p>\u00dcks suurimaid vigu (mille kohta ma juba r\u00e4\u00e4kisin) \u2014 arvata, et roll on nagu funktsioon programmi raamatukogus. Kuidas n\u00e4eb v\u00e4lja funktsiooni \u00fcldine kirjeldus? See v\u00f5tab argumente sisendina, suhtleb k\u00f5rvalm\u00f5judega, tekitab k\u00f5rvalm\u00f5jusid ja tagastab v\u00e4\u00e4rtuse.<\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd, t\u00e4helepanu. Mis neist saab teha rollis? Teha k\u00f5rvalm\u00f5jusid \u2013 alati, see on Ansible'i olemus \u2013 tekitada k\u00f5rvalm\u00f5jusid. Omada k\u00f5rvalp\u00f5hjuseid? Elementaarne. Aga \"edastada v\u00e4\u00e4rtust ja tagasi tuua\" \u2013 siin see puudub. Esiteks, te ei saa rolli v\u00e4\u00e4rtust edastada. Saate seada globaalset muutuja elueaga play sektsioonis vars rolli jaoks. Saate seada globaalset muutuja elueaga play rolli sees. V\u00f5i isegi playbooke jaoks (<code>set_fact<\/code>\/<code>register<\/code>). Kuid te ei saa omada \"kohalikke muutujaid\". Te ei saa \"vastu v\u00f5tta v\u00e4\u00e4rtust\" ja \"tagasi tuua\".<\/p>\n<p><\/p>\n<p>Sellest tuleneb peamine asi: Ansible\u2019is ei saa kirjutada midagi, mis ei tekitaks k\u00f5rvalm\u00f5jusid. Globaalsete muutujate muutmine on alati k\u00f5rvalm\u00f5ju funktsioonile. N\u00e4iteks Rustis on globaalse muutuja muutmine <code>ohtlik<\/code>. An Ansible on ainus meetod, mis m\u00f5jutab v\u00e4\u00e4rtusi rolli jaoks. P\u00f6\u00f6rake t\u00e4helepanu kasutatud s\u00f5nadele: mitte \"edastada v\u00e4\u00e4rtust rolli\", vaid \"muuta v\u00e4\u00e4rtused, mida roll kasutab\". Rollide vahel ei ole isolatsiooni. T\u00f6\u00f6de ja rollide vahel ei ole isolatsiooni.<\/p>\n<p><\/p>\n<p>Kokkuv\u00f5tteks: <strong>roll on see ei ole funktsioon<\/strong>.<\/p>\n<p><\/p>\n<p>Mis head on rollis? Esiteks on rollil default values (<code>\/default\/main.yaml<\/code>), teiseks on rollil t\u00e4iendavad kataloogid failide s\u00e4ilitamiseks.<\/p>\n<p><\/p>\n<p>Miks on default values head? Sest Maslow p\u00fcramiidis on Ansible'i muutuja prioriteetide tabelis rolli defaults \u2013 k\u00f5ige v\u00e4hem prioriteetsed (v\u00e4lja arvatud Ansible'i k\u00e4surea parameetrid). See t\u00e4hendab, et kui peate esitama vaikev\u00e4\u00e4rtused ja mitte muretsema, et need \u00fcletavad inventaarist v\u00f5i grupimuutujatest tulenevad v\u00e4\u00e4rtused, siis rollide vaikeseaded \u2013 on see ainus \u00f5ige koht. (Ma natuke vale r\u00e4\u00e4gin \u2013 on veel <code>|d(your_default_here)<\/code>, aga kui r\u00e4\u00e4kida staatilistest kohtadest \u2013 siis ainult rollide default values).<\/p>\n<p><\/p>\n<p>Mis veel on rollides head? Sellega, et neil on oma kataloogid. Need on kataloogid muutujatele, nii p\u00fcsivatele (st. arvutatud rolli jaoks) kui ka d\u00fcnaamilistele (on selline mustern\u00e4ide v\u00f5i -anti-muster \u2013 <code>include_vars<\/code> koos <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>.). Need on kataloogid <code>files\/<\/code>, <code>templates\/<\/code>. Veelgi enam, see v\u00f5imaldab rollidel omada oma mooduleid ja pluginaid (<code>library\/<\/code>). Kuid v\u00f5rreldes t\u00f6\u00f6st playbook'is (kus see k\u00f5ik v\u00f5ib ka olemas olla) on kasu ainult see, et failid on kokku kogutud mitte \u00fchte kuhja, vaid mitmesse eraldi kuhja.<\/p>\n<p><\/p>\n<p>Veel \u00fcks detail: saab proovida teha rolle, mis oleksid taaskasutatavad (galaxy kaudu). P\u00e4rast kogude ilmumist v\u00f5ib rollide levikut peaaegu unustatud pidada.<\/p>\n<p><\/p>\n<p>Seega on rollidel kaks olulist omadust: neil on defaultid (ainulaadne omadus) ja nad v\u00f5imaldavad kode struktuuri.<\/p>\n<p><\/p>\n<p>Tagasi algse k\u00fcsimuse juurde: millal teha t\u00f6id ja millal rolle? T\u00f6\u00f6de puhul playbook'is kasutatakse neid k\u00f5ige sagedamini kas \"liimina\" enne v\u00f5i p\u00e4rast rolle v\u00f5i iseseisva ehituse elemendina (siis ei tohiks koodis rolle olla). Hunnik normaalseid t\u00f6id koos rollidega on selgelt lohakas. Tuleb j\u00e4rgida konkreetset stiili - kas t\u00f6\u00f6d v\u00f5i rollid. Rollid annavad entiteetide eraldamise ja vaikev\u00e4\u00e4rtused, t\u00f6\u00f6d v\u00f5imaldavad lugeda koodi kiiremini. Tavaliselt kantakse rollidesse rohkem \"statsionaarne\" (oluline ja keeruline) kood, t\u00f6\u00f6st kirjutatakse abiskeeme.<\/p>\n<p><\/p>\n<p>On olemas v\u00f5imalus import_role'i teha \u00fclesandena, kuid kui te seda kirjutate, olge valmis selgitama, miks te seda teha soovite.<\/p>\n<p><\/p>\n<p>T\u00fc\u00fctud lugejad v\u00f5ivad \u00f6elda, et rollid saavad importida rolle, rollidel v\u00f5ib olla s\u00f5ltuvus galaxy.yml-st, ja lisaks on veel hirmus ja kohutav <code>include_role<\/code> \u2014 meenutan, et me arendame oskusi p\u00f5hilises Ansible'is, mitte iluuisutamises.<\/p>\n<p><\/p>\n<h1>H\u00fc\u00fcdurid ja \u00fclesanded<\/h1>\n<p><\/p>\n<p>R\u00e4\u00e4gime veel \u00fchest iseenesestm\u00f5istetavast asjast: h\u00fc\u00fcdurid. Nende \u00f5igesti kasutamine on pea nagu kunst. Mis vahe on h\u00fc\u00fcduri ja \u00fclesande vahel?<\/p>\n<p><\/p>\n<p>Kuna meenutame p\u00f5hialuseid, siis siin on n\u00e4ide:<\/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>Rolli k\u00e4itlejad asuvad rolename\/handlers\/main.yaml. K\u00e4itlejad jagavad k\u00f5igi m\u00e4ngijate vahel: pre\/post_tasks v\u00f5ivad kutsuda rolli k\u00e4itlejaid, ja roll v\u00f5ib kutsuda m\u00e4ngu k\u00e4itlejaid. Siiski p\u00f5hjustavad \"ristrollide\" k\u00e4itlejate kutsumise vastu palju suuremat wtf-d kui triviaalsete k\u00e4itlejate kordamine. (Veel \u00fcks parimate praktikate element - p\u00fc\u00fcda mitte dubleerida k\u00e4itlejate nimesid).<\/p>\n<p><\/p>\n<p>P\u00f5hiline erinevus on see, et \u00fclesanne tehakse (idempotentselt) alati (pluss\/muus oktoober ja <code>jne. Mida rohkem te Ansible'i tunnete, seda rohkem n\u00fcansse saate \u00f6elda \"kavalate\" lahenduste kohta. Ja lihtne lahendus \u2014 loomulik jaotus pre\/roles\/post vahel \u2014 ei tekita n\u00fcansse.<\/code>), h\u00fc\u00fcdur aga muutub olekuks (notify t\u00f6\u00f6tab ainult siis, kui on toimunud muutus). Mida see endaga kaasa toob? N\u00e4iteks seda, et kui k\u00e4ivitamine toimub uuesti ja muutusi pole olnud, ei toimu ka h\u00fc\u00fcdurit. Kuid miks v\u00f5ib olla nii, et meil on vaja h\u00fc\u00fcdurit k\u00e4ivitada, kui algses \u00fclesandes muutusi pole olnud? N\u00e4iteks seet\u00f5ttu, et midagi on katki ja muutus oli olemas, aga enne h\u00fc\u00fcduri t\u00e4itmist ei j\u00f5utud. N\u00e4iteks seet\u00f5ttu, et v\u00f5rk oli ajutiselt maas. Konfiguratsioon muutus, teenust ei taask\u00e4ivitatud. J\u00e4rgmise k\u00e4ivitamise korral konfiguratsioon enam ei muutu ja teenus j\u00e4\u00e4b vana konfiguratsiooni versiooniga.<\/p>\n<p><\/p>\n<p>Konfigureerimise olukord on lahendamatult (t\u00e4psemalt, v\u00f5ite ise v\u00e4lja m\u00f5elda erilise k\u00e4ivitamise protokolli failiviputuste ja jne, kuid see pole enam 'basic ansible' mitte mingil kujul). Siiski on olemas teine sage lugu: me paigaldasime rakenduse, salvestasime selle <code>.service<\/code>-faili ja n\u00fc\u00fcd soovime, et see <code>daemon_reload<\/code> ja <code>state=started<\/code>. Ja loomulik koht selle jaoks n\u00e4ib olevat k\u00e4sitleja. Kuid kui muuta see mitte k\u00e4sitlejaks, vaid \u00fclesandeks l\u00f5pus \u00fclesannete loendis v\u00f5i rolliks, siis see tehakse idempotentselt igal korral. Isegi kui m\u00e4nguraamat purunes keset. See ei lahenda probleemi, kui taask\u00e4ivitamine (\u00fclesannet ei saa teha taask\u00e4itusatribuudiga, kuna idempotentsus kaob), kuid kindlasti tasub teha state=started, kuna \u00fcldine m\u00e4nguraamatute stabiilsus suureneb, v\u00e4hendades seoseid ja d\u00fcnaamilist seisundit.<\/p>\n<p><\/p>\n<p>Teine positiivne omadus k\u00e4itleja on see, et see ei ummistu v\u00e4ljundit. Muudatusi ei olnud - ei ole liigseid skipped v\u00f5i ok v\u00e4ljundis - lihtsam lugeda. See on ka negatiivne omadus - kui te leiate tr\u00fckivea lineaarset t\u00f6\u00f6d esimesel l\u00e4bimisel, siis k\u00e4itlejad t\u00e4idetakse ainult siis, kui on muutunud, st teatud tingimustel - v\u00e4ga harva. N\u00e4iteks esmakordselt elus viis aastat hiljem. Ja loomulikult on seal nime tr\u00fckiviga ja k\u00f5ik puruneb. Teisel korral ei saa neid k\u00e4ivitada - muudatusi pole ju.<\/p>\n<p><\/p>\n<p>Eraldi tuleb r\u00e4\u00e4kida muutujate k\u00e4ttesaadavusest. N\u00e4iteks, kui te teavitada \u00fclesande jaoks, millel on ts\u00fckkel, siis mis juhtub muutujatega? Saate seda anal\u00fc\u00fctiliselt v\u00e4lja m\u00f5elda, kuid see ei ole alati triviaalne, eriti kui muutujad tulevad erinevatest kohtadest.<\/p>\n<p><\/p>\n<p>Seega on handler'id palju v\u00e4hem kasulikud ja palju probleemsemad, kui tunduda v\u00f5iks. Kui midagi saab ilusasti (ilma trikkideta) kirjutada ilma handler'iteta, siis on parem seda teha. Kui ilusasti ei \u00f5nnestu \u2014 on paremad nende kasutamine.<\/p>\n<p><\/p>\n<p>Peenekoeline lugeja \u00f5igustatult m\u00e4rgib, et me ei arutanud <code>kuulamine<\/code>, et handler v\u00f5ib kutsuda notify teise handler'i, et handler v\u00f5ib sisaldada import_tasks (mis v\u00f5ib teha include_role koos with_items), et Ansible'i s\u00fcsteem on Turingu t\u00e4isv\u00f5imekas, et include_role'ist p\u00e4rinevad handler'id \u00fcllataval kombel kattuvad m\u00e4ngu handler'itega jne \u2014 k\u00f5ik see ei ole kindlasti \"alused\").<\/p>\n<p><\/p>\n<p>Kuigi on \u00fcks kindel WTF, mis tegelikult on funktsioon ja mida tuleb meeles pidada. Kui teil on \u00fclesanne, mis t\u00e4idetakse <code>delegate_to<\/code> ja sellel on teavitamine, siis vastav k\u00e4sitleja t\u00e4idetakse ilma <code>delegate_to<\/code>, st masinas, kus m\u00e4ng on m\u00e4\u00e4ratud. (Kuigi k\u00e4sitlejal v\u00f5ib muidugi olla <code>delegate_to<\/code> samuti).<\/p>\n<p><\/p>\n<p>Eraldi tahan \u00f6elda paar s\u00f5na korduvkasutatavatest rollidest. Enne kollektsioonide ilmumist oli idee, et v\u00f5iks luua universaalseid rolle, mida saab <code>ansible-galaxy install<\/code> ja l\u00e4ks. T\u00f6\u00f6tab k\u00f5ikidel OS-idel, k\u00f5ikides variatsioonides k\u00f5igis olukordades. Nii et minu arvamus: see ei t\u00f6\u00f6ta. Iga roll massilise <code>include_vars<\/code>, mis toetab 100500 juhtumit, on condemnatsioon kohutavate corner case vigade poole. Need saab sulgeda massiivse testimisega, aga nagu igasuguse testimisega, kas teil on dekartaalne tootekogum ja totaalfunktsioon, v\u00f5i teil on \"katetud eraldi stsenaariumid\". Minu arvates on palju parem, kui roll on lineaarne (ts\u00fckliline keerukus 1).<\/p>\n<p><\/p>\n<p>Mida v\u00e4hem on if'ide (ilmseid v\u00f5i deklaratiivseid \u2014 kujul <code>jne. Mida rohkem te Ansible'i tunnete, seda rohkem n\u00fcansse saate \u00f6elda \"kavalate\" lahenduste kohta. Ja lihtne lahendus \u2014 loomulik jaotus pre\/roles\/post vahel \u2014 ei tekita n\u00fcansse.<\/code> v\u00f5i vormis <code>include_vars<\/code> sisendite komplektis), seda parem on roll. M\u00f5nikord tuleb teha hargnemisi, kuid, kordame, mida v\u00e4hem neid, seda parem. Nii et kuigi tundub, et hea roll galaktika (see t\u00f6\u00f6tab ju!) koos hulga <code>jne. Mida rohkem te Ansible'i tunnete, seda rohkem n\u00fcansse saate \u00f6elda \"kavalate\" lahenduste kohta. Ja lihtne lahendus \u2014 loomulik jaotus pre\/roles\/post vahel \u2014 ei tekita n\u00fcansse.<\/code> , v\u00f5ib olla v\u00e4hem eelistatud kui \"oma\" roll viiest \u00fclesandest. Moment, kus galaxy roll on parem \u2014 kui hakkate midagi kirjutama. Moment, kus see muutub halvemaks \u2014 kui midagi l\u00e4heb katki ja teil on kahtlus, et see on \"galaxy rollist\" tingitud. Avate selle, ja seal on viis kaasat, kaheksa \u00fclesande loendit ja hunnik <code>jne. Mida rohkem te Ansible'i tunnete, seda rohkem n\u00fcansse saate \u00f6elda \"kavalate\" lahenduste kohta. Ja lihtne lahendus \u2014 loomulik jaotus pre\/roles\/post vahel \u2014 ei tekita n\u00fcansse.<\/code>\u2018e\u2026 Ja milles tuleb aru saada. Selle asemel on 5 \u00fclesannet lineaarse nimekirjana, kus ei ole isegi millegi katkemiseks.<\/p>\n<p><\/p>\n<h1>J\u00e4rgmistes osades<\/h1>\n<p><\/p>\n<ul>\n<li>Natuke inventarist, grupimuutujatest, host_group_vars pluginist, hostvars. Kuidas spagetist siduda Gordioni s\u00f5lm. Muutujate ulatus ja eelisj\u00e4rjekord, Ansible'i m\u00e4lu mudel. \"Kus siis ikkagi hoida andmebaasi kasutajanime?\".<\/li>\n<li><code>jinja: {{ jinja }}<\/code> \u2014 nosql notype nosense pehme plastiliin. See on igal pool, isegi seal, kus te seda ei oota. Veidi <code>!!unsafe<\/code> ja maitsev yaml.<\/li>\n<\/ul>\n<p>Allikas: <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.1.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\/et\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Ansible'i alused, ilma milleta teie playbookid on kokku kukkunud pastakeerased | ProHoster","description":"Teen palju \u00fclevaateid teiste Ansible'i koodi kohta ja kirjutan palju ise.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/87084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=87084"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/87084\/revisions"}],"predecessor-version":[{"id":162161,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/87084\/revisions\/162161"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=87084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=87084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=87084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}