{"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\/sv\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","title":{"rendered":"Grunderna i Ansible som g\u00f6r att dina playbooks inte bara blir en klump av ihopklibbade makaroner","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jag g\u00f6r m\u00e5nga recensioner av andras kod p\u00e5 Ansible och skriver mycket sj\u00e4lv. Vid analysen av fel (b\u00e5de andras och mina egna), samt genom vissa intervjuer, f\u00f6rstod jag det huvudfel som Ansible-anv\u00e4ndare g\u00f6r \u2014 de ger sig in i det komplexa innan de bem\u00e4strar grunderna.<\/p>\n<p><\/p>\n<p>F\u00f6r att r\u00e4tta till denna universella or\u00e4ttvisa har jag beslutat att skriva en introduktion till Ansible f\u00f6r dem som redan k\u00e4nner till det. Jag varnar, det \u00e4r ingen sammanfattning av manualer, det \u00e4r en l\u00e5ng text med mycket text och inga bilder.<\/p>\n<p><\/p>\n<p>Den f\u00f6rv\u00e4ntade l\u00e4sarniv\u00e5n - har redan skrivit flera tusen rader YAML, har redan n\u00e5got i produktion, men \"p\u00e5 n\u00e5got s\u00e4tt \u00e4r allt snett\".<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Titlar<\/h1>\n<p><\/p>\n<p>Ansible-anv\u00e4ndarens st\u00f6rsta misstag \u00e4r att inte veta vad saker kallas. Om du inte vet namnen kan du inte f\u00f6rst\u00e5 det som st\u00e5r i dokumentationen. Ett levande exempel: p\u00e5 en intervju kunde en person, som p\u00e5stod sig ha skrivit mycket i Ansible, inte svara p\u00e5 fr\u00e5gan \"av vilka element best\u00e5r en playbook?\". Och n\u00e4r jag f\u00f6reslog att \"det f\u00f6rv\u00e4ntades svara att en playbook best\u00e5r av plays\", f\u00f6ljde en d\u00f6dlig kommentar \"vi anv\u00e4nder inte det\". M\u00e4nniskor skriver i Ansible f\u00f6r pengar och anv\u00e4nder inte plays. <em>De anv\u00e4nder det i sj\u00e4lva verket, men vet inte vad det \u00e4r.<\/em><\/p>\n<p><\/p>\n<p>S\u00e5 vi b\u00f6rjar med det enkla: hur saker heter. Kanske vet du detta, eller kanske inte, f\u00f6r att du inte har varit uppm\u00e4rksam n\u00e4r du l\u00e4ste dokumentationen.<\/p>\n<p><\/p>\n<p>ansible-playbook k\u00f6r playbooken. Playbook \u00e4r en fil med \u00e4ndelsen yml\/yaml, inuti finns n\u00e5got s\u00e5dant:<\/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>Vi har redan f\u00f6rst\u00e5tt att hela den h\u00e4r filen \u00e4r en playbook. Vi kan visa var roller (roles) och uppgifter (tasks) finns. Men var \u00e4r play? Och vad skiljer play fr\u00e5n role eller playbook?<\/p>\n<p><\/p>\n<p>Detta finns i dokumentationen. Och detta missas. Nyb\u00f6rjare - eftersom det \u00e4r f\u00f6r mycket och man kan inte komma ih\u00e5g allt p\u00e5 en g\u00e5ng. Erfarna - eftersom \"triviala saker\". Om du \u00e4r erfaren, l\u00e4s dessa sidor minst en g\u00e5ng var sj\u00e4tte m\u00e5nad, och din kod blir mycket b\u00e4ttre.<\/p>\n<p><\/p>\n<p>S\u00e5 kom ih\u00e5g: Playbook \u00e4r en lista som best\u00e5r av play och <code>import_playbook<\/code>.<br \/>\nDetta \u00e4r en play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  roles:\n    - role1<\/code><\/pre>\n<p><\/p>\n<p>och detta \u00e4r ocks\u00e5 en annan play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Vad \u00e4r d\u00e5 en play? Vad beh\u00f6vs den till?<\/p>\n<p><\/p>\n<p>Play \u00e4r en nyckelkomponent f\u00f6r playbook, eftersom en play och endast en play kopplar ihop en lista av roller och\/eller uppgifter med en lista av v\u00e4rdar d\u00e4r de ska utf\u00f6ras. I djupet av dokumentationen kan man hitta omn\u00e4mnandet om <code>delegate_to<\/code>, lokala lookup-plugins, n\u00e4tverks-cli-specifika inst\u00e4llningar, hopphostar osv. De till\u00e5ter en l\u00e4tt f\u00f6r\u00e4ndring av var uppgifter utf\u00f6rs. Men gl\u00f6m det. Varje en av dessa smarta alternativ har mycket specifika till\u00e4mpningar och de \u00e4r definitivt inte universella. Och vi pratar om grundl\u00e4ggande saker som alla b\u00f6r veta och anv\u00e4nda.<\/p>\n<p><\/p>\n<p>Om du vill utf\u00f6ra \"n\u00e5got\" \"n\u00e5gonstans\" - skriver du en play. Inte en roll. Inte en roll med moduler och delegeringar. Du tar och skriver en play. I vilken du i f\u00e4ltet hosts listar var du ska utf\u00f6ra den, och i roles\/tasks - vad som ska utf\u00f6ras.<\/p>\n<p><\/p>\n<p>Enkel, eller hur? Och hur skulle det kunna vara p\u00e5 n\u00e5got annat s\u00e4tt?<\/p>\n<p><\/p>\n<p>Ett av de typiska momenten n\u00e4r folk vill g\u00f6ra detta inte via play, \u00e4r \"rollen som konfigurerar allt\". Man vill ha en roll som konfigurerar och <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/dts-los-angeles\/\"   title=\"servern\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3633\">servern<\/a> den f\u00f6rsta typen och servrar av den andra typen.<\/p>\n<p><\/p>\n<p>Ett arketypiskt exempel \u00e4r \u00f6vervakning. Man vill ha en roll f\u00f6r \u00f6vervakning som konfigurerar \u00f6vervakningen. Rollen f\u00f6r \u00f6vervakning tilldelas \u00f6vervakningshosts (i motsvarande play). Men det visar sig att f\u00f6r att \u00f6vervaka m\u00e5ste vi installera paket p\u00e5 de hosts vi \u00f6vervakar. Varf\u00f6r inte anv\u00e4nda delegate? Och vi m\u00e5ste ocks\u00e5 konfigurera iptables. delegate? Och vi m\u00e5ste ocks\u00e5 skriva\/korrigera konfigurationen f\u00f6r databashanteraren s\u00e5 att \u00f6vervakningen till\u00e5ts. delegate! Och om kreativiteten fl\u00f6dar, kan man g\u00f6ra delegation <code>include_role<\/code> i en inre loop med en smart filtrering av grupplistan, och inuti <code>include_role<\/code> kan man \u00e4ven g\u00f6ra <code>delegate_to<\/code> igen. Och det \u00e4r i g\u00e5ng\u2026<\/p>\n<p><\/p>\n<p>Ett gott \u00f6nskem\u00e5l - att ha en enda roll f\u00f6r \u00f6vervakning som \"g\u00f6r allt\" - leder oss till ett helvete d\u00e4r den vanligaste utv\u00e4gen \u00e4r: skriva om allt fr\u00e5n grunden.<\/p>\n<p><\/p>\n<p>Var intr\u00e4ffade felet? I det \u00f6gonblick du uppt\u00e4ckte att f\u00f6r att utf\u00f6ra uppgiften \"x\" p\u00e5 v\u00e4rd X m\u00e5ste du g\u00e5 till v\u00e4rd Y och g\u00f6ra \"y\" d\u00e4r, borde du ha utf\u00f6rt en enkel \u00f6vning: g\u00e5 och skriva en play, som p\u00e5 v\u00e4rd Y g\u00f6r y. Inte l\u00e4gga till n\u00e5got i \"x\", utan skriva fr\u00e5n grunden. \u00c4ven om det inneb\u00e4r h\u00e5rdkodade variabler.<\/p>\n<p><\/p>\n<p>Det verkar som att allt ovanst\u00e5ende \u00e4r korrekt. Men det \u00e4r inte ditt fall! Eftersom du vill skriva \u00e5teranv\u00e4ndbar kod som \u00e4r DRY och liknar ett bibliotek, och du beh\u00f6ver hitta en metod f\u00f6r att g\u00f6ra det.<\/p>\n<p><\/p>\n<p>H\u00e4r finns en annan allvarlig bugg. En bugg som har f\u00f6rvandlat m\u00e5nga projekt fr\u00e5n att vara hyfsat skrivna (det kan bli b\u00e4ttre, men allt fungerar och \u00e4r l\u00e4tt att bygga p\u00e5) till en fullst\u00e4ndig mardr\u00f6m, d\u00e4r till och med f\u00f6rfattaren har sv\u00e5rt att f\u00f6rst\u00e5. Det fungerar, men Gud f\u00f6rbjude att f\u00f6r\u00e4ndra n\u00e5got.<\/p>\n<p><\/p>\n<p>Denna bugg l\u00e5ter s\u00e5 h\u00e4r: en roll \u00e4r en biblioteksfunktion. Denna analoga j\u00e4mf\u00f6relse har d\u00f6dat s\u00e5 m\u00e5nga bra initiativ att det \u00e4r sorgligt att se. En roll \u00e4r inte en biblioteksfunktion. Den kan inte g\u00f6ra ber\u00e4kningar och den kan inte fatta beslut p\u00e5 niv\u00e5 med play. P\u00e5minn mig, vilka beslut fattar play?<\/p>\n<p><\/p>\n<p>Tack, du har r\u00e4tt. Play fattar ett beslut (mer exakt, inneh\u00e5ller information) om vilka uppgifter och roller som ska utf\u00f6ras p\u00e5 vilka v\u00e4rdar.<\/p>\n<p><\/p>\n<p>Om du delegerar detta beslut till en roll, och dessutom med ber\u00e4kningar, f\u00f6rd\u00f6mer du dig sj\u00e4lv (och den som kommer att f\u00f6rs\u00f6ka f\u00f6rst\u00e5 din kod) till ett el\u00e4ndigt liv. En roll avg\u00f6r inte var den ska utf\u00f6ras. Det beslutet fattar play. En roll g\u00f6r det som den blivit tillsagd att g\u00f6ra, d\u00e4r den blivit tillsagd att g\u00f6ra det.<\/p>\n<p><\/p>\n<p>Varf\u00f6r det \u00e4r farligt att programmera i Ansible och varf\u00f6r COBOL \u00e4r b\u00e4ttre \u00e4n Ansible kommer vi att prata om i kapitlet om variabler och jinja. S\u00e5 l\u00e4nge kan vi s\u00e4ga en sak - varje ber\u00e4kning du g\u00f6r l\u00e4mnar ett of\u00f6r\u00e4nderligt sp\u00e5r av \u00e4ndringar av globala variabler, och du kan inte g\u00f6ra n\u00e5got \u00e5t det. S\u00e5 snart tv\u00e5 \"sp\u00e5r\" korsas - \u00e4r allt f\u00f6rlorat.<\/p>\n<p><\/p>\n<p>En notis f\u00f6r den petiga: en roll kan sj\u00e4lvfallet p\u00e5verka kontrollfl\u00f6det. Det finns <code>delegate_to<\/code> och det finns rimliga till\u00e4mpningar f\u00f6r det. Det finns <code>meta: end host\/play<\/code>. Men! Kom ih\u00e5g, vi l\u00e4r oss grunderna? Gl\u00f6mde du bort <code>delegate_to<\/code>. Vi pratar om den enklaste och vackraste koden i Ansible. Som \u00e4r l\u00e4tt att l\u00e4sa, skriva, fels\u00f6ka, testa och bygga p\u00e5. S\u00e5, \u00e4n en g\u00e5ng:<\/p>\n<p><\/p>\n<p><strong>play och endast play avg\u00f6r p\u00e5 vilka v\u00e4rdar saker k\u00f6rs.<\/strong><\/p>\n<p><\/p>\n<p>I detta avsnitt har vi granskat motst\u00e5ndet mellan play och roll. Nu ska vi prata om relationerna mellan tasks vs roll.<\/p>\n<p><\/p>\n<h1>Uppgifter och Roller<\/h1>\n<p><\/p>\n<p>L\u00e5t oss betrakta 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>L\u00e5t oss s\u00e4ga att du beh\u00f6ver g\u00f6ra foo. Och det ser ut som <code>foo: name=foobar state=present<\/code>. Vart ska detta skrivas? I pre? Post? Ska jag skapa en roll?<\/p>\n<p><\/p>\n<p>\u2026 Och vart tog uppgifterna v\u00e4gen?<\/p>\n<p><\/p>\n<p>Vi b\u00f6rjar \u00e5terigen med grunderna \u2013 play-enheten. Om du \u00e4r os\u00e4ker p\u00e5 detta kan du inte anv\u00e4nda play som grund f\u00f6r allt annat, och ditt resultat blir \"skakigt\".<\/p>\n<p><\/p>\n<p>Enheten play: direktiv hosts, inst\u00e4llningar f\u00f6r sj\u00e4lva play och sektionerna pre_tasks, tasks, roles, post_tasks. Andra parametrar f\u00f6r play \u00e4r f\u00f6r tillf\u00e4llet ointressanta.<\/p>\n<p><\/p>\n<p>Ordningen av deras sektioner med tasker och roller: <code>pre_tasks<\/code>, <code>roles<\/code>, <code>tasks<\/code>, <code>post_tasks<\/code>. Eftersom den semantiska ordningen f\u00f6r utf\u00f6randet \u00e4r <code>tasks<\/code> och <code>roles<\/code> oklar, s\u00e5 s\u00e4ger best practices att vi l\u00e4gger till en sektion <code>tasks<\/code>, endast om det inte finns n\u00e5gon <code>roles<\/code>. Om det finns <code>roles<\/code>, s\u00e5 placeras alla relaterade tasks i sektionerna <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Det kvarst\u00e5r bara det som \u00e4r semantiskt tydligt: f\u00f6rst <code>pre_tasks<\/code>, sedan <code>roles<\/code>, sedan <code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Men vi har fortfarande inte besvarat fr\u00e5gan: var ska vi skriva anropet till modulen <code>foo<\/code> ? M\u00e5ste vi skriva en hel roll f\u00f6r varje modul? Eller \u00e4r det b\u00e4ttre att ha en allomfattande roll f\u00f6r allt? Och om det inte \u00e4r en roll, var skriver vi d\u00e5 \u2014 i pre eller i post?<\/p>\n<p><\/p>\n<p>Om det inte finns \u00f6vertygande svar p\u00e5 dessa fr\u00e5gor \u00e4r det ett tecken p\u00e5 brist p\u00e5 intuition, allts\u00e5 de \"skakiga grunderna\". L\u00e5t oss reda ut det. F\u00f6rst en kontrollfr\u00e5ga: Om play har <code>pre_tasks<\/code> och <code>post_tasks<\/code> och det inte finns n\u00e5gra tasks eller roller, kan n\u00e5got g\u00e5 s\u00f6nder om jag flyttar f\u00f6rsta tasken fr\u00e5n <code>post_tasks<\/code> till slutet? <code>pre_tasks<\/code>?<\/p>\n<p><\/p>\n<p>Sj\u00e4lvklart antyder formuleringen av fr\u00e5gan att n\u00e5got kommer att g\u00e5 fel. Men vad exakt?<\/p>\n<p><\/p>\n<p>\u2026 handlare. Att l\u00e4sa grunderna avsl\u00f6jar en viktig detalj: alla handlare spolas automatiskt efter varje sektion. Det vill s\u00e4ga, alla uppgifter fr\u00e5n <code>pre_tasks<\/code>, k\u00f6rs, d\u00e4refter alla handlers som har notifierats. Sedan k\u00f6rs alla roller och alla handlers som har notifierats i rollerna. D\u00e4refter <code>post_tasks<\/code> och deras handlers.<\/p>\n<p><\/p>\n<p>S\u00e5ledes, om du flyttar en task fr\u00e5n <code>post_tasks<\/code> p\u00e5 <code>pre_tasks<\/code>kan potentiellt k\u00f6ras innan handlaren utf\u00f6rs. Till exempel, om i <code>pre_tasks<\/code> installationen och konfigurationen <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/sv\/server\/\"   title=\"webbserver\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">webbserver<\/a>, och i <code>post_tasks<\/code> n\u00e5gonting skickas, kommer flytten av den h\u00e4r tasken till sektionen <code>pre_tasks<\/code> det kan leda till att servern vid \"\u00f6vers\u00e4ndning\" \u00e4nnu inte \u00e4r ig\u00e5ng och allt g\u00e5r s\u00f6nder.<\/p>\n<p><\/p>\n<p>Och nu l\u00e5t oss t\u00e4nka en g\u00e5ng till, varf\u00f6r beh\u00f6ver vi <code>pre_tasks<\/code> och <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> som g\u00f6r att vi kan arbeta med resultaten fr\u00e5n rollernas (inklusive handlers) utf\u00f6rande.<\/p>\n<p><\/p>\n<p>En nitisk k\u00e4nnare av Ansible kommer att s\u00e4ga oss att det finns <code>meta: flush_handlers<\/code>, men varf\u00f6r beh\u00f6ver vi flush_handlers, om vi kan lita p\u00e5 sektionernas utf\u00f6rande ordning i play? Dessutom kan anv\u00e4ndningen av meta: flush_handlers ge oss ov\u00e4ntade resultat med upprepande handlers och ge oss konstiga varningar vid anv\u00e4ndning av <code>when<\/code> f\u00f6r <code>block<\/code> Och s\u00e5 vidare. Ju b\u00e4ttre du k\u00e4nner Ansible, desto fler nyanser kan du n\u00e4mna f\u00f6r en \"skicklig\" l\u00f6sning. Ett enkelt beslut \u00e4r att anv\u00e4nda den naturliga uppdelningen mellan pre\/roles\/post \u2013 det v\u00e4cker inga nyanser.<\/p>\n<p><\/p>\n<p>Och vi \u00e5terv\u00e4nder till v\u00e5rt 'foo'. Var ska den placeras? I pre, post eller i roles? Sj\u00e4lvklart beror det p\u00e5 om vi beh\u00f6ver resultaten fr\u00e5n handlarens arbete f\u00f6r foo. Om de inte beh\u00f6vs, s\u00e5 ska foo inte placeras varken i pre eller post \u2013 dessa sektioner har en speciell betydelse \u2013 att utf\u00f6ra uppgifter f\u00f6re och efter den huvudsakliga kodm\u00e4ngden.<\/p>\n<p><\/p>\n<p>Nu blir svaret p\u00e5 fr\u00e5gan \"roll eller uppgift\" baserat p\u00e5 vad som redan finns i play \u2013 om det finns uppgifter, b\u00f6r de l\u00e4ggas till i tasks. Om det finns roller \u2013 b\u00f6r en roll skapas (\u00e4ven om det bara \u00e4r en uppgift). Jag p\u00e5minner om att tasks och roles inte anv\u00e4nds samtidigt.<\/p>\n<p><\/p>\n<p>Att f\u00f6rst\u00e5 grunderna i Ansible ger v\u00e4lgrundade svar p\u00e5 fr\u00e5gor som verkar handla om smak.<\/p>\n<p><\/p>\n<h1>Uppgifter och roller (del tv\u00e5)<\/h1>\n<p><\/p>\n<p>L\u00e5t oss nu diskutera situationen n\u00e4r du just b\u00f6rjar skriva en playbook. Du beh\u00f6ver g\u00f6ra foo, bar och baz. \u00c4r det tre uppgifter, en roll eller tre roller? F\u00f6r att sammanfatta fr\u00e5gan: n\u00e4r b\u00f6r man b\u00f6rja skriva roller? Vad \u00e4r po\u00e4ngen med att skriva roller n\u00e4r man kan skriva uppgifter?\u2026 Och vad \u00e4r en roll?<\/p>\n<p><\/p>\n<p>Ett av de st\u00f6rsta misstagen (jag har redan pratat om detta) \u00e4r att tro att en roll \u00e4r som en funktion i ett programbibliotek. Hur ser en allm\u00e4n beskrivning av en funktion ut? Den tar in argument, interagerar med sidorelaterade orsaker, skapar bieffekter och returnerar ett v\u00e4rde.<\/p>\n<p><\/p>\n<p>Nu, uppm\u00e4rksamhet. Vad av detta kan g\u00f6ras i en roll? Att \u00e5kalla bieffekter \u2013 alltid v\u00e4lkommet, det \u00e4r sj\u00e4lva syftet med Ansible \u2013 att skapa bieffekter. Att ha side causes? Enkelt. Men n\u00e4r det g\u00e4ller att \"skicka ett v\u00e4rde och f\u00e5 tillbaka det\" \u2013 h\u00e4r \u00e4r det stopp. F\u00f6r det f\u00f6rsta kan du inte skicka ett v\u00e4rde till en roll. Du kan skapa en global variabel med livsl\u00e4ngd under play i vars-sektionen f\u00f6r rollen. Du kan skapa en global variabel med livsl\u00e4ngd under play inne i rollen. Eller till och med med livsl\u00e4ngd f\u00f6r spelboken (<code>set_fact<\/code>\/<code>register<\/code>). Men du kan inte ha \"lokala variabler\". Du kan inte \"ta emot ett v\u00e4rde\" och \"\u00e5terv\u00e4nda det\".<\/p>\n<p><\/p>\n<p>Detta leder till den viktigaste punkten: man kan inte skriva n\u00e5got i Ansible utan att skapa bieffekter. Att \u00e4ndra globala variabler \u00e4r alltid en bieffekt f\u00f6r funktionen. I Rust, till exempel, \u00e4r f\u00f6r\u00e4ndring av en global variabel - <code>unsafe<\/code>. I Ansible finns det ingen annan metod att p\u00e5verka v\u00e4rdena f\u00f6r en roll. Observera de anv\u00e4nda orden: inte \"skicka v\u00e4rde till rollen\", utan \"\u00e4ndra de v\u00e4rden som rollen anv\u00e4nder\". Det finns ingen isolering mellan roller. Det finns ingen isolering mellan uppgifter och roller.<\/p>\n<p><\/p>\n<p>Totalt: <strong>en roll \u00e4r inte en funktion<\/strong>.<\/p>\n<p><\/p>\n<p>Vad \u00e4r bra med en roll? F\u00f6r det f\u00f6rsta har en roll standardv\u00e4rden (<code>\/default\/main.yaml<\/code>), f\u00f6r det andra har en roll ytterligare kataloger f\u00f6r att lagra filer.<\/p>\n<p><\/p>\n<p>Vad \u00e4r bra med standardv\u00e4rden? De \u00e4r att i Maslows ganska snedvridna hierarki av variabler prioriterade hos Ansible, \u00e4r rollstandarder de minst prioriterade (f\u00f6rutom parameterarna fr\u00e5n Ansible kommandoraden). Det inneb\u00e4r att om du beh\u00f6ver tillhandah\u00e5lla standardv\u00e4rden och inte oroa dig f\u00f6r att de ska \u00f6verskrida v\u00e4rden fr\u00e5n inventariet eller gruppvariabler, s\u00e5 \u00e4r rollernas standarder det enda r\u00e4tta st\u00e4llet f\u00f6r dig. (Jag ljuger lite \u2014 det finns ocks\u00e5 <code>|d(your_default_here)<\/code>, men om vi pratar om station\u00e4ra platser \u2014 s\u00e5 \u00e4r det endast rollernas standarder).<\/p>\n<p><\/p>\n<p>Vad mer \u00e4r bra med roller? Det \u00e4r att de har sina egna kataloger. Dessa \u00e4r kataloger f\u00f6r variabler, b\u00e5de permanenta (dvs. de som ber\u00e4knas f\u00f6r rollen) och dynamiska (det finns ett slags antingen m\u00f6nster eller anti-m\u00f6nster \u2014 <code>include_vars<\/code> tillsammans med <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>.). Dessa \u00e4r kataloger f\u00f6r <code>files\/<\/code>, <code>templates\/<\/code>. Dessutom till\u00e5ter det roller att ha sina egna moduler och plugins (<code>library\/<\/code>). Men, j\u00e4mf\u00f6rt med uppgifter i en playbook (d\u00e4r ocks\u00e5 allt detta kan vara), \u00e4r f\u00f6rdelen h\u00e4r endast att filerna inte \u00e4r samlade i en enda h\u00f6g, utan flera separata h\u00f6gar.<\/p>\n<p><\/p>\n<p>En annan detalj: man kan f\u00f6rs\u00f6ka skapa roller som kommer att vara tillg\u00e4ngliga f\u00f6r \u00e5teranv\u00e4ndning (via galaxy). Efter att samlingar har lanserats kan spridningen av roller n\u00e4stan betraktas som gl\u00f6md.<\/p>\n<p><\/p>\n<p>S\u00e5ledes har roller tv\u00e5 viktiga egenskaper: de har standarder (en unik egenskap) och de till\u00e5ter att strukturera koden.<\/p>\n<p><\/p>\n<p>\u00c5ter till den ursprungliga fr\u00e5gan: n\u00e4r ska man anv\u00e4nda uppgifter och n\u00e4r roller? Uppgifter i playbook anv\u00e4nds oftast antingen som \"lim\" f\u00f6re\/efter roller eller som sj\u00e4lvst\u00e4ndiga byggstenar (d\u00e5 b\u00f6r det inte finnas n\u00e5gra roller i koden). En h\u00f6g med normala uppgifter blandat med roller \u00e4r utan tvekan slarvigt. Man b\u00f6r f\u00f6lja en specifik stil - antingen uppgifter eller roller. Roller ger separation av entiteter och standardv\u00e4rden, medan uppgifter g\u00f6r det m\u00f6jligt att l\u00e4sa koden snabbare. Vanligtvis flyttas mer \"station\u00e4r\" (viktig och komplex) kod till rollen, medan stil med uppgifter inneh\u00e5ller hj\u00e4lpskript.<\/p>\n<p><\/p>\n<p>Det finns m\u00f6jlighet att g\u00f6ra import_role som en uppgift, men om du skriver n\u00e5got s\u00e5dant, var beredd att f\u00f6rklara varf\u00f6r du vill g\u00f6ra detta f\u00f6r ditt eget estetiska sinne.<\/p>\n<p><\/p>\n<p>En p\u00e5tr\u00e4ngande l\u00e4sare kan s\u00e4ga att roller kan importera roller, att roller kan ha beroenden genom galaxy.yml, och att det finns n\u00e5got l\u00e4skigt och hemskt. <code>include_role<\/code> \u2014 jag p\u00e5minner om att vi f\u00f6rb\u00e4ttrar v\u00e5ra f\u00e4rdigheter i grundl\u00e4ggande Ansible, inte i rytmisk gymnastik.<\/p>\n<p><\/p>\n<h1>Handlers och uppgifter<\/h1>\n<p><\/p>\n<p>L\u00e5t oss diskutera en till uppenbar sak: handlers. Att anv\u00e4nda dem korrekt \u00e4r n\u00e4stan en konst. Vad \u00e4r skillnaden mellan en handler och en uppgift?<\/p>\n<p><\/p>\n<p>Eftersom vi g\u00e5r igenom grunderna, h\u00e4r \u00e4r ett exempel:<\/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>Rollens handlers ligger i rolename\/handlers\/main.yaml. Handlers delas mellan alla deltagare i play: pre\/post_tasks kan anropa rollen's handlers, och rollen kan anropa handlers fr\u00e5n play. Men, \"cross-role\" anrop av handlers orsakar betydligt st\u00f6rre f\u00f6rvirring \u00e4n upprepning av triviala handlers. (En annan del av b\u00e4sta praxis - f\u00f6rs\u00f6k att inte namnge handlers flera g\u00e5nger).<\/p>\n<p><\/p>\n<p>Huvudskillnaden \u00e4r att en uppgift alltid utf\u00f6rs (idempotent) (plus\/minus taggar och <code>when<\/code>), medan en handler utf\u00f6rs beroende p\u00e5 tillst\u00e5ndet (notify aktiveras endast om det har skett en f\u00f6r\u00e4ndring). Vad kan det leda till? Till exempel, vid en omk\u00f6rning, om det inte har skett n\u00e5gon f\u00f6r\u00e4ndring, kommer inget handler att k\u00f6ras. Men varf\u00f6r kan det vara s\u00e5 att vi beh\u00f6ver utf\u00f6ra en handler n\u00e4r det inte har skett n\u00e5gon f\u00f6r\u00e4ndring i den genererande uppgiften? Till exempel, f\u00f6r att n\u00e5got gick s\u00f6nder och det skedde en f\u00f6r\u00e4ndring, men exekveringen kom inte fram till handler. Till exempel, f\u00f6r att n\u00e4tverket var nere en kort stund. Konfigurationen \u00e4ndrades, tj\u00e4nsten startades inte om. Vid n\u00e4sta k\u00f6rning \u00e4ndras konfigurationen inte l\u00e4ngre, och tj\u00e4nsten f\u00f6rblir med den gamla versionen av konfigurationen.<\/p>\n<p><\/p>\n<p>Situationen med konfigurationen \u00e4r inte l\u00f6sbar (snarare kan man sj\u00e4lv uppfinna ett speciellt omstartsprotokoll med filflaggor osv., men det \u00e4r redan inte 'grundl\u00e4ggande ansible' i n\u00e5got fall). D\u00e4remot finns det en annan vanlig historia: vi har installerat en applikation, skrivit ner den <code>.service<\/code>-fil, och nu vill vi <code>daemon_reload<\/code> och <code>state=started<\/code>. Och den naturliga platsen f\u00f6r detta verkar vara en handler. Men om man g\u00f6r det till en task i slutet av tasklistan eller en roll, s\u00e5 kommer den att utf\u00f6ras idempotent varje g\u00e5ng. \u00c4ven om playbooken skulle g\u00e5 s\u00f6nder p\u00e5 mitten. Detta l\u00f6ser inte problemet med restarted (man kan inte g\u00f6ra en task med attributet restarted, eftersom idempotensen skulle g\u00e5 f\u00f6rlorad), men det \u00e4r absolut v\u00e4rt att s\u00e4tta state=started, den \u00f6vergripande stabiliteten i playbooks \u00f6kar, eftersom antalet kopplingar och dynamiskt tillst\u00e5nd minskar.<\/p>\n<p><\/p>\n<p>\u00c4nnu en positiv egenskap hos en handler \u00e4r att den inte skr\u00e4par ner utdata. Inga \u00e4ndringar - inga \u00f6verfl\u00f6diga skipped eller ok i utdata - l\u00e4ttare att l\u00e4sa. Det \u00e4r ocks\u00e5 en negativ egenskap - om du hittar ett skrivfel i en linj\u00e4rt utf\u00f6rd uppgift vid f\u00f6rsta k\u00f6rningen, kommer handlers endast k\u00f6ras vid f\u00f6r\u00e4ndringar, dvs vid vissa villkor - v\u00e4ldigt s\u00e4llan. Till exempel, f\u00f6rsta g\u00e5ngen i livet efter fem \u00e5r. Och, sj\u00e4lvklart, d\u00e4r kommer det att finnas ett skrivfel i namnet och allt kommer att g\u00e5 s\u00f6nder. Vid andra k\u00f6rningen kan de inte startas - det finns ju inga f\u00f6r\u00e4ndringar.<\/p>\n<p><\/p>\n<p>Man m\u00e5ste s\u00e4rskilt n\u00e4mna tillg\u00e5ngen till variabler. Till exempel, om du notifierar f\u00f6r en task med en loop, vad kommer att h\u00e4nda med variablerna? Man kan gissa analytiskt, men det \u00e4r inte alltid trivialt, s\u00e4rskilt om variablerna kommer fr\u00e5n olika k\u00e4llor.<\/p>\n<p><\/p>\n<p>S\u00e5 handler \u00e4r betydligt mindre anv\u00e4ndbara och mycket mer problematiska \u00e4n de verkar. Om du kan skriva n\u00e5got snyggt (utan n\u00e5gra konstigheter) utan handlers, \u00e4r det b\u00e4ttre att g\u00f6ra det utan dem. Om det inte blir snyggt \u2013 d\u00e5 \u00e4r det b\u00e4ttre att anv\u00e4nda dem.<\/p>\n<p><\/p>\n<p>Den insiktsfulle l\u00e4saren p\u00e5pekar med r\u00e4tta att vi inte har diskuterat <code>lyssna<\/code>, som handler kan anropa notify f\u00f6r en annan handler, att en handler kan inkludera import_tasks (som kan g\u00f6ra include_role med with_items), att systemet med handlers i Ansible \u00e4r Turing-komplett, att handlers fr\u00e5n include_role p\u00e5 intressant s\u00e4tt \u00f6verlappar med handlers fr\u00e5n play, och s\u00e5 vidare \u2013 allt detta \u00e4r uppenbarligen inte \"grundl\u00e4ggande\").<\/p>\n<p><\/p>\n<p>\u00c4ven om det finns ett visst WTF, som faktiskt \u00e4r en funktion, och som man m\u00e5ste komma ih\u00e5g. Om du har en task som k\u00f6rs med <code>delegate_to<\/code> och den har notify, s\u00e5 k\u00f6rs den motsvarande handlern utan <code>delegate_to<\/code>, det vill s\u00e4ga p\u00e5 den v\u00e4rd d\u00e4r play \u00e4r tilldelad. (\u00c4ven om handlern, naturligtvis, kan ha <code>delegate_to<\/code> ocks\u00e5).<\/p>\n<p><\/p>\n<p>Separat vill jag n\u00e4mna n\u00e5gra ord om \u00e5teranv\u00e4ndbara roller. Innan kollektionerna kom fanns det en id\u00e9 om att man skulle kunna skapa universella roller som kan <code>ansible-galaxy install<\/code> och s\u00e5 \u00e5kte jag. Fungerar p\u00e5 alla operativsystem i alla varianter i alla situationer. S\u00e5, min \u00e5sikt: det fungerar inte. Varje roll med st\u00f6d f\u00f6r 100500 fall \u00e4r d\u00f6md till avgrunder av corner case-buggar. <code>include_vars<\/code>, st\u00f6der 100500 fall \u00e4r d\u00f6mt att hamna i avgrunder av corner case-buggar. De kan t\u00e4ppas till med massiv testning, men som med all testning, antingen har du det kartesiska produkten av ing\u00e5ngsv\u00e4rden och en total funktion, eller s\u00e5 har du \"t\u00e4ckt enskilda scenarier\". Min \u00e5sikt \u00e4r att det \u00e4r mycket b\u00e4ttre om rollen \u00e4r linj\u00e4r (cyclomatic complexity 1).<\/p>\n<p><\/p>\n<p>Ju f\u00e4rre if-satser (uppenbara eller deklarativa \u2013 i form av <code>when<\/code> eller form <code>include_vars<\/code> baserat p\u00e5 upps\u00e4ttningen av variabler), desto b\u00e4ttre \u00e4r rollen. Ibland m\u00e5ste man g\u00f6ra f\u00f6rgreningar, men, jag upprepar, ju f\u00e4rre desto b\u00e4ttre. S\u00e5 en till synes bra roll med galaxy (den fungerar ju!) med en massa <code>when<\/code> kan vara mindre \u00f6nskv\u00e4rd \u00e4n en \"egen\" roll med fem uppgifter. Stunden n\u00e4r en roll med galaxy \u00e4r b\u00e4ttre \u2013 \u00e4r n\u00e4r du b\u00f6rjar skriva n\u00e5got. Stunden n\u00e4r den blir s\u00e4mre \u2013 \u00e4r n\u00e4r n\u00e5got g\u00e5r s\u00f6nder och du misst\u00e4nker att det beror p\u00e5 \"rollen med galaxy\". Du \u00f6ppnar den och d\u00e4r finns fem includes, \u00e5tta tasklistor och en h\u00f6g <code>when<\/code>\u2026 och d\u00e4r m\u00e5ste du reda ut det. Ist\u00e4llet f\u00f6r 5 uppgifter i en linj\u00e4r lista d\u00e4r det dessutom egentligen inte finns n\u00e5got att g\u00e5 s\u00f6nder.<\/p>\n<p><\/p>\n<h1>I de f\u00f6ljande delarna<\/h1>\n<p><\/p>\n<ul>\n<li>Lite om inventarier, grupperade variabler, host_group_vars plugin, hostvars. Hur man binder ihop spaghetti till en Gordisk knut. Scope och prioritetsordning f\u00f6r variabler, Ansible's minnesmodell. \"S\u00e5 var ska man egentligen lagra anv\u00e4ndarnamnet f\u00f6r databasen?\".<\/li>\n<li><code>jinja: {{ jinja }}<\/code> \u2014 nosql notype nonsens mjukt lera. Det finns \u00f6verallt, \u00e4ven d\u00e4r du minst anar det. Lite om <code>!!unsafe<\/code> och l\u00e4cker yaml.<\/li>\n<\/ul>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Grunderna i Ansible, utan vilka dina spelb\u00f6cker \u00e4r en klump av ihopklibbade makaroner | ProHoster","description":"Jag g\u00f6r mycket granskningar av andras kod p\u00e5 Ansible och skriver mycket sj\u00e4lv.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/87084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=87084"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/87084\/revisions"}],"predecessor-version":[{"id":162161,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/87084\/revisions\/162161"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=87084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=87084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=87084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}