{"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\/cs\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","title":{"rendered":"Z\u00e1klady Ansible, bez kter\u00fdch jsou va\u0161e playbooky kusem slepen\u00fdch t\u011bstovin","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>D\u011bl\u00e1m mnoho recenz\u00ed pro ciz\u00ed k\u00f3d v Ansible a tak\u00e9 hodn\u011b p\u00ed\u0161u s\u00e1m. B\u011bhem anal\u00fdzy chyb (jak ciz\u00edch, tak sv\u00fdch) a n\u011bkter\u00fdch pohovor\u016f jsem pochopil hlavn\u00ed chybu, kter\u00e9 se u\u017eivatel\u00e9 Ansible dopou\u0161t\u011bj\u00ed \u2014 sna\u017e\u00ed se pustit do slo\u017eit\u00fdch v\u011bc\u00ed, ani\u017e by ovl\u00e1dli z\u00e1klady.<\/p>\n<p><\/p>\n<p>Abych opravil tuto celosv\u011btovou nespravedlnost, rozhodl jsem se napsat \u00favod do Ansible pro ty, kte\u0159\u00ed ho u\u017e znaj\u00ed. Varuji, nen\u00ed to shrnut\u00ed manu\u00e1l\u016f, ale dlouh\u00fd text, ve kter\u00e9m je mnoho p\u00edsmen a \u017e\u00e1dn\u00e9 obr\u00e1zky.<\/p>\n<p><\/p>\n<p>O\u010dek\u00e1van\u00e1 \u00farove\u0148 \u010dten\u00e1\u0159e \u2013 u\u017e napsal n\u011bkolik tis\u00edc \u0159\u00e1dk\u016f YAML, u\u017e n\u011bco v produkci, ale &quot;n\u011bjak je to cel\u00e9 pok\u0159iven\u00e9&quot;.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>N\u00e1zvy<\/h1>\n<p><\/p>\n<p>Hlavn\u00ed chybou u\u017eivatele Ansible je neznalost n\u00e1zv\u016f. Pokud nezn\u00e1te n\u00e1zvy, nem\u016f\u017eete ch\u00e1pat, co je naps\u00e1no v dokumentaci. P\u0159\u00edkladem je pohovor, kde \u010dlov\u011bk, kter\u00fd tvrdil, \u017ee hodn\u011b psal v Ansible, nedok\u00e1zal odpov\u011bd\u011bt na ot\u00e1zku &quot;z jak\u00fdch prvk\u016f se skl\u00e1d\u00e1 playbook?&quot;. Kdy\u017e jsem nazna\u010dil, \u017ee &quot;o\u010dek\u00e1van\u00e1 odpov\u011b\u010f je, \u017ee playbook se skl\u00e1d\u00e1 z play&quot;, n\u00e1sledoval zabij\u00e1ck\u00fd koment\u00e1\u0159 &quot;to my nepou\u017e\u00edv\u00e1me&quot;. Lid\u00e9 p\u00ed\u0161\u00ed v Ansible za pen\u00edze a nevyu\u017e\u00edvaj\u00ed play. <em>Ve skute\u010dnosti se pou\u017e\u00edv\u00e1, ale nev\u011bd\u00ed, co to je.<\/em><\/p>\n<p><\/p>\n<p>Tak\u017ee za\u010dneme s jednoduch\u00fdm: jak se co naz\u00fdv\u00e1. Mo\u017en\u00e1 to v\u00edte, a mo\u017en\u00e1 ne, proto\u017ee jste si toho nev\u0161imli, kdy\u017e jste \u010detli dokumentaci.<\/p>\n<p><\/p>\n<p>ansible-playbook prov\u00e1d\u00ed playbook. Playbook \u2014 je to soubor s p\u0159\u00edponou yml\/yaml, uvnit\u0159 kter\u00e9ho je n\u011bco takov\u00e9ho:<\/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>U\u017e jsme pochopili, \u017ee cel\u00fd tenhle soubor \u2014 je playbook. M\u016f\u017eeme uk\u00e1zat, kde jsou role (roles), kde jsou \u00fakoly (tasks). Ale kde je tady play? A \u010d\u00edm se play li\u0161\u00ed od role nebo playbooku?<\/p>\n<p><\/p>\n<p>V dokumentaci je to v\u0161e. A to p\u0159ehl\u00ed\u017eej\u00ed. Za\u010d\u00e1te\u010dn\u00edci \u2013 proto\u017ee tam je toho p\u0159\u00edli\u0161 mnoho a v\u0161echno si najednou nezapamatujete. Zku\u0161en\u00ed \u2013 proto\u017ee &quot;trivi\u00e1ln\u00ed v\u011bci&quot;. Pokud jste zku\u0161en\u00ed \u2013 p\u0159e\u010dt\u011bte si tyto str\u00e1nky alespo\u0148 jednou za p\u016fl roku a v\u00e1\u0161 k\u00f3d se stane o t\u0159\u00eddu lep\u0161\u00edm.<\/p>\n<p><\/p>\n<p>Tak si zapamatujte: Playbook \u2014 je seznam, kter\u00fd se skl\u00e1d\u00e1 z play a <code>import_playbook<\/code>.<br \/>\nTohle \u2014 je jeden play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group1\n  roles:\n    - role1<\/code><\/pre>\n<p><\/p>\n<p>a tohle je tak\u00e9 je\u0161t\u011b jeden play:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: group2,group3\n  tasks:\n    - debug:<\/code><\/pre>\n<p><\/p>\n<p>Co tedy play je? K \u010demu je?<\/p>\n<p><\/p>\n<p>Play \u2014 je kl\u00ed\u010dov\u00fd prvek pro playbook, proto\u017ee play a pouze play spojuje seznam rol\u00ed a\/nebo \u00fakol\u016f se seznamem hostitel\u016f, na kter\u00fdch je t\u0159eba je vykonat. V hlubin\u00e1ch dokumentace je zm\u00ednka o <code>delegate_to<\/code>, lok\u00e1ln\u00ed lookup pluginy, specifick\u00e9 nastaven\u00ed pro network-cli, jump hosty atd. Umo\u017e\u0148uj\u00ed m\u00edrn\u011b zm\u011bnit m\u00edsto vykon\u00e1v\u00e1n\u00ed \u00faloh. Ale na to zapome\u0148te. Ka\u017ed\u00e1 z t\u011bchto chytr\u00fdch mo\u017enost\u00ed m\u00e1 velmi speci\u00e1ln\u00ed pou\u017eit\u00ed a rozhodn\u011b nejsou univerz\u00e1ln\u00ed. A my se bav\u00edme o z\u00e1kladn\u00edch v\u011bcech, kter\u00e9 by m\u011bli zn\u00e1t a pou\u017e\u00edvat v\u0161ichni.<\/p>\n<p><\/p>\n<p>Pokud chcete &quot;n\u011bco&quot; vykonat &quot;n\u011bkde&quot; \u2013 p\u00ed\u0161ete play. Ne roli. Ne roli s moduly a delegacemi. Vezmete a nap\u00ed\u0161ete play. Ve kter\u00e9, v poli hosts uv\u00e1d\u00edte, kde m\u00e1 b\u00fdt vykon\u00e1no, a v roles\/tasks \u2013 co m\u00e1 b\u00fdt vykon\u00e1no.<\/p>\n<p><\/p>\n<p>Snadn\u00e9, \u017ee? A jak by to mohlo b\u00fdt jinak?<\/p>\n<p><\/p>\n<p>Jedn\u00edm z charakteristick\u00fdch moment\u016f, kdy maj\u00ed lid\u00e9 tendenci to neud\u011blat p\u0159es play, je &quot;role, kter\u00e1 v\u0161echno nastavuje&quot;. Chcete m\u00edt roli, kter\u00e1 nastavuje a <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/server\/dts-los-angeles\/\"   title=\"serveru\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3633\">serveru<\/a> prvn\u00edho typu, tak servery druh\u00e9ho typu.<\/p>\n<p><\/p>\n<p>Archetyp\u00e1ln\u00edm p\u0159\u00edkladem je monitorov\u00e1n\u00ed. Cht\u011blo by to m\u00edt roli monitoring, kter\u00e1 nastav\u00ed monitorov\u00e1n\u00ed. Role monitoring je p\u0159i\u0159azena k host\u016fm monitorov\u00e1n\u00ed (ve vhodn\u00e9m play). Ale zjist\u00ed se, \u017ee pro monitorov\u00e1n\u00ed mus\u00edme nainstalovat bal\u00ed\u010dky na hostech, kter\u00e9 monitorujeme. Pro\u010d nevyu\u017e\u00edt delegaci? A tak\u00e9 je t\u0159eba nastavit iptables. Deleg\u00e1t? A tak\u00e9 je pot\u0159eba napsat\/upravit konfiguraci pro DBMS, aby monitoring povolil. Deleg\u00e1t! A pokud n\u00e1pad fr\u010d\u00ed, m\u016f\u017ee se ud\u011blat delegace <code>include_role<\/code> ve vno\u0159en\u00e9m cyklu podle chytr\u00e9ho filtru na seznam skupin, a uvnit\u0159 <code>include_role<\/code> m\u016f\u017eeme znovu prov\u00e1d\u011bt <code>delegate_to<\/code> znovu. A jde se...<\/p>\n<p><\/p>\n<p>Spr\u00e1vn\u00e9 p\u0159\u00e1n\u00ed \u2013 m\u00edt jedinou roli monitoring, kter\u00e1 &quot;v\u0161e d\u011bl\u00e1&quot; \u2013 n\u00e1s vede do pekla, z n\u011bj\u017e v\u011bt\u0161inou existuje jedin\u00fd v\u00fdstup: v\u0161e p\u0159epsat od nuly.<\/p>\n<p><\/p>\n<p>Kde do\u0161lo k chyb\u011b? V okam\u017eiku, kdy jste zjistili, \u017ee k vykon\u00e1n\u00ed \u00fakolu &quot;x&quot; na hostu X mus\u00edte j\u00edt na host Y a ud\u011blat tam &quot;y&quot;, m\u011bli jste prov\u00e9st jednoduch\u00e9 cvi\u010den\u00ed: j\u00edt a napsat play, kter\u00e1 na hostu Y d\u011bl\u00e1 y. Nep\u0159id\u00e1vat n\u011bco do &quot;x&quot;, ale napsat od nuly. I kdy\u017e s hardkodovan\u00fdmi prom\u011bnn\u00fdmi.<\/p>\n<p><\/p>\n<p>Vypad\u00e1 to, \u017ee v p\u0159edchoz\u00edch odstavc\u00edch je v\u0161echno \u0159e\u010deno spr\u00e1vn\u011b. Ale to p\u0159ece nen\u00ed v\u00e1\u0161 p\u0159\u00edpad! Proto\u017ee chcete napsat op\u011btovn\u011b pou\u017eiteln\u00fd k\u00f3d, kter\u00fd je DRY a podobn\u00fd knihovn\u011b, a je t\u0159eba hledat metodu, jak to ud\u011blat.<\/p>\n<p><\/p>\n<p>Tady se skr\u00fdv\u00e1 je\u0161t\u011b jedna z\u00e1sadn\u00ed chyba. Chyba, kter\u00e1 p\u0159em\u011bnila spoustu projekt\u016f z v\u00edcem\u00e9n\u011b poda\u0159en\u00fdch (dalo by se to ud\u011blat l\u00e9pe, ale v\u0161e funguje a d\u00e1 se snadno doplnit) v naprost\u00fd chaos, ve kter\u00e9m ani autor nem\u016f\u017ee naj\u00edt sm\u011br. Funguje to, ale b\u016fh chra\u0148 n\u011bco zm\u011bnit.<\/p>\n<p><\/p>\n<p>Tato chyba zn\u00ed takto: role je knihovn\u00ed funkce. Tato analogie zabila tolik dobr\u00fdch za\u010d\u00e1tk\u016f, \u017ee je z toho smutno. Role nen\u00ed knihovn\u00ed funkce. Nem\u016f\u017ee prov\u00e1d\u011bt v\u00fdpo\u010dty a nem\u016f\u017ee p\u0159ij\u00edmat rozhodnut\u00ed na \u00farovni play. P\u0159ipome\u0148te mi, jak\u00e1 rozhodnut\u00ed play p\u0159ij\u00edm\u00e1?<\/p>\n<p><\/p>\n<p>D\u011bkuji, m\u00e1te pravdu. Play p\u0159ij\u00edm\u00e1 rozhodnut\u00ed (p\u0159esn\u011bji \u0159e\u010deno, obsahuje informace) o tom, kter\u00e9 \u00fakoly a role maj\u00ed b\u00fdt vykon\u00e1ny na jak\u00fdch hostitel\u00edch.<\/p>\n<p><\/p>\n<p>Pokud sv\u011b\u0159ujete toto rozhodnut\u00ed roli, a je\u0161t\u011b k tomu s v\u00fdpo\u010dty, odsuzujete sebe (a toho, kdo se pokus\u00ed v\u00e1\u0161 k\u00f3d rozlu\u0161tit) k \u017eebr\u00e1ck\u00e9mu existenci. Role nerozhoduje, kde m\u00e1 b\u00fdt vykon\u00e1v\u00e1na. Toto rozhodnut\u00ed p\u0159ij\u00edm\u00e1 play. Role d\u011bl\u00e1 to, co j\u00ed bylo \u0159e\u010deno, tam, kde j\u00ed bylo \u0159e\u010deno.<\/p>\n<p><\/p>\n<p>Pro\u010d je programov\u00e1n\u00ed v Ansible nebezpe\u010dn\u00e9 a \u010d\u00edm je COBOL lep\u0161\u00ed ne\u017e Ansible, to si pov\u00edme v kapitole o prom\u011bnn\u00fdch a jinja. Zat\u00edm \u0159ekn\u011bme jedno \u2013 ka\u017ed\u00fd v\u00e1\u0161 v\u00fdpo\u010det zanech\u00e1v\u00e1 nenapravitelnou stopu zm\u011bn glob\u00e1ln\u00edch prom\u011bnn\u00fdch, a s t\u00edm nem\u016f\u017eete nic ud\u011blat. Jakmile se dv\u011b &quot;stopy&quot; protly \u2013 je v\u0161echno ztraceno.<\/p>\n<p><\/p>\n<p>Pozn\u00e1mka pro pe\u010dliv\u00e9: role m\u016f\u017ee samoz\u0159ejm\u011b ovliv\u0148ovat \u0159\u00edzen\u00ed toku. Existuje <code>delegate_to<\/code> a m\u00e1 rozumn\u00e9 aplikace. Existuje <code>meta: end host\/play<\/code>. Ale! Pamatujte, u\u010d\u00edme se z\u00e1klady? Zapomn\u011bli jste na <code>delegate_to<\/code>. Mluv\u00edme o nejjednodu\u0161\u0161\u00edm a nej\u010dist\u0161\u00edm k\u00f3du v Ansible. Kter\u00fd je snadno \u010diteln\u00fd, snadno psan\u00fd, snadno laditeln\u00fd, snadno testovateln\u00fd a snadno doplniteln\u00fd. Tak\u017ee, je\u0161t\u011b jednou:<\/p>\n<p><\/p>\n<p><strong>play a jen play rozhoduje, na kter\u00fdch hostitel\u00edch se co vykon\u00e1v\u00e1.<\/strong><\/p>\n<p><\/p>\n<p>V t\u00e9to \u010d\u00e1sti jsme se zab\u00fdvali konfliktem mezi play a role. Te\u010f si promluvme o vztaz\u00edch tasks vs role.<\/p>\n<p><\/p>\n<h1>\u00dakoly a role<\/h1>\n<p><\/p>\n<p>Pod\u00edvejme se na 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>P\u0159edstavte si, \u017ee pot\u0159ebujete ud\u011blat foo. A vypad\u00e1 to jako <code>foo: name=foobar state=present<\/code>. Kam to napsat? do pre? post? Vytvo\u0159it roli?<\/p>\n<p><\/p>\n<p>\u2026 A kam zmizely \u00fakoly?<\/p>\n<p><\/p>\n<p>Op\u011bt za\u010d\u00edn\u00e1me od z\u00e1klad\u016f \u2014 za\u0159\u00edzen\u00ed play. Pokud se v t\u00e9to ot\u00e1zce neorientujete, nem\u016f\u017eete pou\u017e\u00edt play jako z\u00e1klad pro v\u0161echno ostatn\u00ed a v\u00e1\u0161 v\u00fdsledek bude \"nestabiln\u00ed\".<\/p>\n<p><\/p>\n<p>Hra play: direktiva hosts, nastaven\u00ed samotn\u00e9 hry a sekc\u00ed pre_tasks, tasks, roles, post_tasks. Ostatn\u00ed parametry pro hru nejsou nyn\u00ed d\u016fle\u017eit\u00e9.<\/p>\n<p><\/p>\n<p>Po\u0159ad\u00ed jejich sekc\u00ed s \u00falohami a rolemi: <code>pre_tasks<\/code>, <code>role<\/code>, <code>tasks<\/code>, <code>post_tasks<\/code>. Proto\u017ee mezi <code>tasks<\/code> a <code>role<\/code> nen\u00ed jasn\u00fd po\u0159\u00e1dek vykon\u00e1v\u00e1n\u00ed, doporu\u010duje nejlep\u0161\u00ed praxe p\u0159idat sekci <code>tasks<\/code>, pouze pokud neexistuje <code>role<\/code>. Pokud je <code>role<\/code>, pak se v\u0161echny p\u0159ipojen\u00e9 \u00fakoly um\u00edst\u00ed do sekc\u00ed <code>pre_tasks<\/code>\/<code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Z\u016fst\u00e1v\u00e1 jen to, co je semanticky jasn\u00e9: nejprve <code>pre_tasks<\/code>, pak <code>role<\/code>, pak <code>post_tasks<\/code>.<\/p>\n<p><\/p>\n<p>Ale st\u00e1le jsme neodpov\u011bd\u011bli na ot\u00e1zku: kam napsat vol\u00e1n\u00ed modulu <code>foo<\/code> ? Mus\u00edme pro ka\u017ed\u00fd modul ps\u00e1t celou roli? Nebo je lep\u0161\u00ed m\u00edt tlustou roli pro v\u0161e? A pokud ne roli, kam ps\u00e1t \u2013 do pre nebo do post?<\/p>\n<p><\/p>\n<p>Pokud na tyto ot\u00e1zky neexistuje argumentovan\u00e1 odpov\u011b\u010f, je to zn\u00e1mka nedostatku intuice, tedy t\u011bch \"nestabiln\u00edch z\u00e1klad\u016f\". Poj\u010fme se na to pod\u00edvat. Nejd\u0159\u00edve kontroln\u00ed ot\u00e1zka: Pokud m\u00e1 play <code>pre_tasks<\/code> a <code>post_tasks<\/code> (a nejsou ani \u00fakoly, ani role), m\u016f\u017ee se n\u011bco pokazit, kdy\u017e prvn\u00ed \u00fakol z <code>post_tasks<\/code> p\u0159esunu na konec <code>pre_tasks<\/code>?<\/p>\n<p><\/p>\n<p>Samoz\u0159ejm\u011b, formulace ot\u00e1zky nazna\u010duje, \u017ee n\u011bco se pokaz\u00ed. Ale co p\u0159esn\u011b?<\/p>\n<p><\/p>\n<p>\u2026 Handlery. \u010cten\u00ed z\u00e1klad\u016f odhaluje d\u016fle\u017eit\u00fd fakt: v\u0161echny handlery se automaticky flushuj\u00ed po ka\u017ed\u00e9 sekci. Tedy se prov\u00e1d\u011bj\u00ed v\u0161echny \u00fakoly z <code>pre_tasks<\/code>, pak v\u0161echny handlery, kter\u00e9 byly notify. Pot\u00e9 se provedou v\u0161echny role a v\u0161echny handlery, kter\u00e9 byly notify v rol\u00edch. A pak <code>post_tasks<\/code> a jejich handlery.<\/p>\n<p><\/p>\n<p>Tak\u017ee pokud \u00fakol p\u0159esunete z <code>post_tasks<\/code> v <code>pre_tasks<\/code>, potenci\u00e1ln\u011b ji provedete p\u0159ed proveden\u00edm handleru. Nap\u0159\u00edklad, pokud v <code>pre_tasks<\/code> se instaluje a konfiguruje <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/server\/\"   title=\"webov\u00fd server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1155\">webov\u00fd server<\/a>, a v <code>post_tasks<\/code> do n\u011bj n\u011bco pos\u00edl\u00e1, pak p\u0159esunut\u00ed tohoto \u00fakolu do sekce <code>pre_tasks<\/code> to povede k tomu, \u017ee v okam\u017eiku \"odes\u00edl\u00e1n\u00ed\" server je\u0161t\u011b nebude spu\u0161t\u011bn a v\u0161e se pokaz\u00ed.<\/p>\n<p><\/p>\n<p>A te\u010f se poj\u010fme znovu zamyslet, pro\u010d n\u00e1m <code>pre_tasks<\/code> a <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> umo\u017en\u00ed pracovat s v\u00fdsledky vykon\u00e1n\u00ed rol\u00ed (v\u010detn\u011b handler\u016f).<\/p>\n<p><\/p>\n<p>D\u016fvtipn\u00fd znalec Ansible n\u00e1m \u0159ekne, \u017ee existuje <code>meta: flush_handlers<\/code>, ale pro\u010d pot\u0159ebujeme flush_handlers, kdy\u017e se m\u016f\u017eeme spolehnout na po\u0159ad\u00ed vykon\u00e1v\u00e1n\u00ed sekc\u00ed v play? Nav\u00edc pou\u017eit\u00ed meta: flush_handlers n\u00e1m m\u016f\u017ee p\u0159in\u00e9st ne\u010dekan\u00e9 probl\u00e9my s opakuj\u00edc\u00edmi se handlery a zp\u016fsobit divn\u00e9 varov\u00e1n\u00ed v p\u0159\u00edpad\u011b pou\u017eit\u00ed <code>when<\/code> u <code>block<\/code> atd. \u010c\u00edm l\u00e9pe zn\u00e1te Ansible, t\u00edm v\u00edce nuanc\u00ed budete schopni nazvat pro \"chytr\u00e9\" \u0159e\u0161en\u00ed. A jednoduch\u00e9 \u0159e\u0161en\u00ed \u2014 pou\u017eit\u00ed p\u0159irozen\u00e9ho rozd\u011blen\u00ed mezi pre\/roles\/post \u2014 nevyvol\u00e1v\u00e1 \u017e\u00e1dn\u00e9 nuance.<\/p>\n<p><\/p>\n<p>A vrac\u00edme se k na\u0161emu 'foo'. Kam ho um\u00edstit? Do pre, post nebo do roles? Je z\u0159ejm\u00e9, \u017ee to z\u00e1vis\u00ed na tom, zda pot\u0159ebujeme v\u00fdsledky pr\u00e1ce handleru pro foo. Pokud ne, pak foo nen\u00ed t\u0159eba um\u00edstit ani do pre, ani do post \u2014 tyto sekce maj\u00ed speci\u00e1ln\u00ed v\u00fdznam \u2014 prov\u00e1d\u011bn\u00ed \u00fakol\u016f p\u0159ed a po hlavn\u00ed \u010d\u00e1sti k\u00f3du.<\/p>\n<p><\/p>\n<p>Nyn\u00ed se odpov\u011b\u010f na ot\u00e1zku \"role nebo task\" omezuje na to, co ji\u017e je v play \u2014 pokud tam jsou tasks, je t\u0159eba je p\u0159idat do tasks. Pokud jsou tam roles \u2014 je t\u0159eba vytvo\u0159it roli (i kdyby jen z jednoho \u00fakolu). P\u0159ipom\u00edn\u00e1m, tasks a roles se z\u00e1rove\u0148 nepou\u017e\u00edvaj\u00ed.<\/p>\n<p><\/p>\n<p>Pochopen\u00ed z\u00e1klad\u016f Ansible d\u00e1v\u00e1 opodstatn\u011bn\u00e9 odpov\u011bdi na, zd\u00e1nliv\u011b, ot\u00e1zky vkusu.<\/p>\n<p><\/p>\n<h1>\u00dalohy a role (druh\u00e1 \u010d\u00e1st)<\/h1>\n<p><\/p>\n<p>Te\u010f probereme situaci, kdy\u017e pr\u00e1v\u011b za\u010d\u00edn\u00e1te ps\u00e1t playbook. Mus\u00edte ud\u011blat foo, bar a baz. Jsou to t\u0159i \u00falohy, jedna role nebo t\u0159i role? Obecn\u011b: kdy za\u010d\u00edt ps\u00e1t role? Jak\u00fd je smysl ps\u00e1t role, kdy\u017e je mo\u017en\u00e9 ps\u00e1t \u00falohy?\u2026 A co to vlastn\u011b role je?<\/p>\n<p><\/p>\n<p>Jedna z nejv\u011bt\u0161\u00edch chyb (o tom jsem u\u017e mluvil) \u2014 myslet si, \u017ee role je jako funkce v knihovn\u011b programu. Jak vypad\u00e1 obecn\u00fd popis funkce? P\u0159ij\u00edm\u00e1 argumenty na vstupu, interaguje s vedlej\u0161\u00edmi p\u0159\u00ed\u010dinami, d\u011bl\u00e1 vedlej\u0161\u00ed \u00fa\u010dinky a vrac\u00ed hodnotu.<\/p>\n<p><\/p>\n<p>Nyn\u00ed, pozornost. Co z toho lze ud\u011blat v roli? Vyvolat vedlej\u0161\u00ed efekty \u2014 v\u017edy pros\u00edm, to je podstatou cel\u00e9ho Ansible \u2014 d\u011blat vedlej\u0161\u00ed efekty. M\u00edt vedlej\u0161\u00ed p\u0159\u00ed\u010diny? Element\u00e1rn\u00ed. Ale co s \"p\u0159edat hodnotu a vr\u00e1tit ji\" \u2014 tam u\u017e to nen\u00ed mo\u017en\u00e9. Za prv\u00e9, nem\u016f\u017eete p\u0159edat hodnotu do role. M\u016f\u017eete nastavit glob\u00e1ln\u00ed prom\u011bnnou se \u017eivotnost\u00ed odpov\u00eddaj\u00edc\u00ed play v sekci vars pro roli. M\u016f\u017eete nastavit glob\u00e1ln\u00ed prom\u011bnnou se \u017eivotnost\u00ed v play uvnit\u0159 role. Nebo dokonce se \u017eivotnost\u00ed playbooku (<code>set_fact<\/code>\/<code>register<\/code>). Ale nem\u016f\u017eete m\u00edt \"lok\u00e1ln\u00ed prom\u011bnn\u00e9\". Nem\u016f\u017eete \"p\u0159ijmout hodnotu\" a \"vr\u00e1tit ji\".<\/p>\n<p><\/p>\n<p>Z toho vypl\u00fdv\u00e1 hlavn\u00ed: nelze napsat v ansible n\u011bco a nevyvolat vedlej\u0161\u00ed \u00fa\u010dinky. Zm\u011bna glob\u00e1ln\u00edch prom\u011bnn\u00fdch \u2014 to je v\u017edy vedlej\u0161\u00ed \u00fa\u010dinek pro funkci. V Rustu, nap\u0159\u00edklad, zm\u011bna glob\u00e1ln\u00ed prom\u011bnn\u00e9 \u2014 to je <code>unsafe<\/code>. V Ansible je jedin\u00fd zp\u016fsob, jak ovlivnit hodnoty pro roli. V\u0161imn\u011bte si pou\u017e\u00edvan\u00fdch slov: ne &quot;p\u0159edat hodnotu do role&quot;, ale &quot;zm\u011bnit hodnoty, kter\u00e9 role pou\u017e\u00edv\u00e1&quot;. Mezi rolemi nen\u00ed izolace. Mezi \u00fakoly a rolemi nen\u00ed izolace.<\/p>\n<p><\/p>\n<p>Celkem: <strong>role \u2014 to nen\u00ed funkce<\/strong>.<\/p>\n<p><\/p>\n<p>Jak\u00e9 v\u00fdhody m\u00e1 role? Za prv\u00e9, role m\u00e1 v\u00fdchoz\u00ed hodnoty (<code>\/default\/main.yaml<\/code>), a za druh\u00e9, role m\u00e1 dal\u0161\u00ed adres\u00e1\u0159e pro ukl\u00e1d\u00e1n\u00ed soubor\u016f.<\/p>\n<p><\/p>\n<p>Jak\u00e9 jsou tedy v\u00fdhody v\u00fdchoz\u00edch hodnot? To, \u017ee v Maslowov\u011b pyramid\u011b je v pom\u011brn\u011b pok\u0159iven\u00e9 tabulce priorit prom\u011bnn\u00fdch v Ansible, v\u00fdchoz\u00ed hodnoty rol\u00ed jsou nejm\u00e9n\u011b prioritn\u00ed (s v\u00fdjimkou parametr\u016f p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku Ansible). To znamen\u00e1, \u017ee pokud pot\u0159ebujete poskytnout v\u00fdchoz\u00ed hodnoty a nechcete se b\u00e1t, \u017ee p\u0159ep\u00ed\u0161ou hodnoty z invent\u00e1\u0159e nebo skupinov\u00fdch prom\u011bnn\u00fdch, pak v\u00fdchoz\u00ed hodnoty role jsou jedin\u00e9 spr\u00e1vn\u00e9 m\u00edsto pro v\u00e1s. (Trochu l\u017eu \u2014 existuje je\u0161t\u011b <code>|d(your_default_here)<\/code>, ale pokud mluv\u00edme o stacion\u00e1rn\u00edch m\u00edstech \u2014 tak jen v\u00fdchoz\u00ed hodnoty rol\u00ed).<\/p>\n<p><\/p>\n<p>Jak\u00e9 dal\u0161\u00ed v\u00fdhody maj\u00ed role? To, \u017ee maj\u00ed sv\u00e9 vlastn\u00ed adres\u00e1\u0159e. Jsou to adres\u00e1\u0159e pro prom\u011bnn\u00e9, jak trval\u00e9 (tj. vyhodnocovan\u00e9 pro roli), tak pro dynamick\u00e9 (existuje takov\u00fd vzor nebo anti-vzor \u2014 <code>include_vars<\/code> spolu s <code>{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml<\/code>.). Jsou to adres\u00e1\u0159e pro <code>files\/<\/code>, <code>templates\/. Je\u0161t\u011b umo\u017e\u0148uje m\u00edt role vlastn\u00ed moduly a pluginy (<\/code>library\/<code>). Ale ve srovn\u00e1n\u00ed s \u00fakoly v playbooku (kter\u00e9 to tak\u00e9 mohou m\u00edt), v\u00fdhoda zde spo\u010d\u00edv\u00e1 pouze v tom, \u017ee soubory nejsou hromadn\u011b sm\u00edch\u00e1ny, ale jsou rozd\u00e1ny do n\u011bkolika odd\u011blen\u00fdch hrom\u00e1dek.<\/code>). Ale ve srovn\u00e1n\u00ed s \u00fakoly v playbooku (kde m\u016f\u017ee b\u00fdt tak\u00e9 tohle v\u0161echno) je u\u017eitek pouze v tom, \u017ee soubory nejsou nahromad\u011bny na jedno m\u00edsto, ale do n\u011bkolika odd\u011blen\u00fdch skupin.<\/p>\n<p><\/p>\n<p>T\u00edmto zp\u016fsobem maj\u00ed role dv\u011b d\u016fle\u017eit\u00e9 rysy: maj\u00ed v\u00fdchoz\u00ed hodnoty (unik\u00e1tn\u00ed vlastnost) a umo\u017e\u0148uj\u00ed strukturovat k\u00f3d.<\/p>\n<p><\/p>\n<p>Vr\u00e1t\u00edme se k p\u016fvodn\u00ed ot\u00e1zce: kdy d\u011blat \u00fakoly a kdy role? \u00dakoly v playbooku se nej\u010dast\u011bji pou\u017e\u00edvaj\u00ed bu\u010f jako \"lepidlo\" p\u0159ed\/s b\u011bhem rol\u00ed, nebo jako samostatn\u00e1 stavebn\u00ed jednotka (pak by v k\u00f3du nem\u011bly b\u00fdt role). Hromada norm\u00e1ln\u00edch \u00fakol\u016f mixovan\u00fdch s rolemi \u2014 to je jednozna\u010dn\u011b neuspo\u0159\u00e1dan\u00e9. M\u011bli byste se dr\u017eet konkr\u00e9tn\u00edho stylu \u2014 bu\u010f \u00fakoly, nebo role. Role p\u0159in\u00e1\u0161ej\u00ed rozd\u011blen\u00ed entit a v\u00fdchoz\u00ed hodnoty, \u00fakoly umo\u017e\u0148uj\u00ed rychleji \u010d\u00edst k\u00f3d. Obvykle se do rol\u00ed um\u00eds\u0165uje v\u00edce \"stacion\u00e1rn\u00ed\" (d\u016fle\u017eit\u00fd a slo\u017eit\u00fd) k\u00f3d, zat\u00edmco ve stylu \u00fakol\u016f se p\u00ed\u0161\u00ed pomocn\u00e9 skripty.<\/p>\n<p><\/p>\n<p>Vr\u00e1t\u00edme se k p\u016fvodn\u00ed ot\u00e1zce: kdy d\u011blat \u00fakoly a kdy role? \u00dakoly v playbooku se nej\u010dast\u011bji pou\u017e\u00edvaj\u00ed bu\u010f jako &quot;lepidlo&quot; p\u0159ed\/pot\u00e9 role, nebo jako samostatn\u00fd stavebn\u00ed prvek (pak v k\u00f3du nesm\u00ed b\u00fdt role). Hromada norm\u00e1ln\u00ed \u00fakol\u016f sm\u00edchan\u00e1 s rolemi - to je jednozna\u010dn\u00e1 nepo\u0159\u00e1dnost. M\u011bli bychom se dr\u017eet konkr\u00e9tn\u00edho stylu - bu\u010f \u00fakoly, nebo role. Role poskytuj\u00ed odd\u011blen\u00ed entit a v\u00fdchoz\u00ed hodnoty, \u00fakoly umo\u017e\u0148uj\u00ed rychlej\u0161\u00ed \u010dten\u00ed k\u00f3du. Obvykle se v rol\u00edch nach\u00e1z\u00ed v\u00edce &quot;stacion\u00e1rn\u00ed&quot; (d\u016fle\u017eit\u00fd a slo\u017eit\u00fd) k\u00f3d, zat\u00edmco ve stylu \u00fakol\u016f se p\u00ed\u0161\u00ed pomocn\u00e9 skripty.<\/p>\n<p><\/p>\n<p>Existuje mo\u017enost d\u011blat import_role jako \u00fakol, ale pokud to d\u011bl\u00e1te, bu\u010fte p\u0159ipraveni na vysv\u011btlen\u00ed pro sv\u00e9 vlastn\u00ed estetick\u00e9 c\u00edt\u011bn\u00ed, pro\u010d to chcete d\u011blat.<\/p>\n<p><\/p>\n<p>Zv\u011bdav\u00fd \u010dten\u00e1\u0159 m\u016f\u017ee \u0159\u00edct, \u017ee role mohou importovat role, role mohou m\u00edt z\u00e1vislost p\u0159es galaxy.yml, a je\u0161t\u011b je zde d\u011bsiv\u00fd a hrozn\u00fd. <code>include_role<\/code> \u2014 p\u0159ipom\u00edn\u00e1m, \u017ee zvy\u0161ujeme dovednosti v z\u00e1kladn\u00edm Ansible, a ne v gymnastice.<\/p>\n<p><\/p>\n<h1>Handlery a \u00fakoly<\/h1>\n<p><\/p>\n<p>Poj\u010fme probrat je\u0161t\u011b jednu o\u010dividnou v\u011bc: handlery. Schopnost je spr\u00e1vn\u011b pou\u017e\u00edvat je t\u00e9m\u011b\u0159 um\u011bn\u00ed. Jak\u00fd je rozd\u00edl mezi handlerem a \u00fakolem?<\/p>\n<p><\/p>\n<p>Proto\u017ee si p\u0159ipom\u00edn\u00e1me z\u00e1klady, zde je p\u0159\u00edklad:<\/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>U rol\u00ed se handlery nach\u00e1zej\u00ed v rolename\/handlers\/main.yaml. Handlery se sd\u00edlej\u00ed mezi v\u0161emi \u00fa\u010dastn\u00edky hry: pre\/post_tasks mohou volat handlery role, a role m\u016f\u017ee volat handlery z play. Nicm\u00e9n\u011b, &quot;k\u0159\u00ed\u017eov\u00e9&quot; vol\u00e1n\u00ed handler\u016f zp\u016fsobuje mnohem v\u011bt\u0161\u00ed wtf ne\u017e opakov\u00e1n\u00ed trivi\u00e1ln\u00edho handleru. (Dal\u0161\u00ed prvek nejlep\u0161\u00edch praktik - sna\u017eit se neopakovat n\u00e1zvy handler\u016f).<\/p>\n<p><\/p>\n<p>Hlavn\u00ed rozd\u00edl spo\u010d\u00edv\u00e1 v tom, \u017ee \u00fakol se vykon\u00e1v\u00e1 (idempotentn\u011b) v\u017edy (plus\/m\u00ednus tagy a <code>when<\/code>), zat\u00edmco handler \u2014 na zm\u011bnu stavu (notify se aktivuje pouze pokud do\u0161lo ke zm\u011bn\u011b). Co to m\u016f\u017ee zp\u016fsobit? Nap\u0159\u00edklad to, \u017ee p\u0159i opakovan\u00e9m spu\u0161t\u011bn\u00ed, pokud nebylo changed, tak nebude ani handler. A pro\u010d m\u016f\u017ee b\u00fdt tak, \u017ee pot\u0159ebujeme vykonat handler, kdy\u017e u tvo\u0159\u00edc\u00edho \u00fakolu nebylo changed? Nap\u0159\u00edklad proto, \u017ee n\u011bco p\u0159estalo fungovat a do\u0161lo ke zm\u011bn\u011b, ale k handleru se prov\u00e1d\u011bn\u00ed nedostalo. Nap\u0159\u00edklad proto, \u017ee bylo do\u010dasn\u011b p\u0159eru\u0161eno spojen\u00ed. Konfigurace se zm\u011bnila, ale slu\u017eba nebyla restartov\u00e1na. P\u0159i dal\u0161\u00edm spu\u0161t\u011bn\u00ed se konfigurace u\u017e nem\u011bn\u00ed a slu\u017eba z\u016fst\u00e1v\u00e1 se starou verz\u00ed konfigurace.<\/p>\n<p><\/p>\n<p>Situace s konfigurac\u00ed nen\u00ed \u0159e\u0161iteln\u00e1 (p\u0159esn\u011bji, m\u016f\u017eeme si sami vymyslet speci\u00e1ln\u00ed protokol restartu s souborov\u00fdmi vlajkami atd., ale to u\u017e nen\u00ed &#8216;z\u00e1kladn\u00ed ansible&#8217; v \u017e\u00e1dn\u00e9 podob\u011b). Na\u0161t\u011bst\u00ed existuje jin\u00fd \u010dast\u00fd p\u0159\u00edb\u011bh: nainstalovali jsme aplikaci, zapsali jsme ji <code>.service<\/code>-souboru a nyn\u00ed ji chceme <code>daemon_reload<\/code> a <code>state=started<\/code>. A p\u0159irozen\u00e9 m\u00edsto pro to se zd\u00e1 b\u00fdt handler. Ale pokud to ud\u011bl\u00e1te ne jako handler, ale jako \u00fakol na konci seznamu \u00fakol\u016f nebo rol\u00ed, bude to idempotentn\u011b prov\u00e1d\u011bno poka\u017ed\u00e9. I kdy\u017e se playbook rozpadl v pr\u016fb\u011bhu. To samoz\u0159ejm\u011b ne\u0159e\u0161\u00ed probl\u00e9m restarted (nelze ud\u011blat \u00fakol s atributem restarted, proto\u017ee se ztr\u00e1c\u00ed idempotentnost), ale rozhodn\u011b stoj\u00ed za to m\u00edt state=started, celkov\u00e1 stabilita playbook\u016f se zvy\u0161uje, proto\u017ee se sni\u017euje po\u010det spojen\u00ed a dynamick\u00e9ho stavu.<\/p>\n<p><\/p>\n<p>Dal\u0161\u00ed pozitivn\u00ed vlastnost handleru spo\u010d\u00edv\u00e1 v tom, \u017ee nezapln\u00ed v\u00fdstup. Nebyly provedeny \u017e\u00e1dn\u00e9 zm\u011bny \u2013 nen\u00ed \u017e\u00e1dn\u00e9 zbyte\u010dn\u00e9 skipped nebo ok v v\u00fdstupu \u2013 snadn\u011bji se \u010dte. To je tak\u00e9 negativn\u00ed vlastnost - pokud chybu v line\u00e1rn\u011b vykon\u00e1van\u00e9m \u00fakolu objev\u00edte p\u0159i prvn\u00edm b\u011bhu, handlery budou vykon\u00e1ny pouze p\u0159i changed, t.j. za ur\u010dit\u00fdch podm\u00ednek \u2013 velmi z\u0159\u00eddka. Nap\u0159\u00edklad poprv\u00e9 po p\u011bti letech. A samoz\u0159ejm\u011b, tam bude typografick\u00e1 chyba v n\u00e1zvu a v\u0161echno se rozbije. Podruh\u00e9 je nelze spustit \u2013 changed nen\u00ed.<\/p>\n<p><\/p>\n<p>Samostatn\u011b mus\u00edme hovo\u0159it o dostupnosti prom\u011bnn\u00fdch. Nap\u0159\u00edklad, pokud m\u00e1te notifikaci pro \u00fakol s cyklem, co bude v prom\u011bnn\u00fdch? M\u016f\u017eete to analyticky zjistit, ale nen\u00ed to v\u017edy trivi\u00e1ln\u00ed, zvl\u00e1\u0161t\u011b kdy\u017e prom\u011bnn\u00e9 p\u0159ich\u00e1zej\u00ed z r\u016fzn\u00fdch m\u00edst.<\/p>\n<p><\/p>\n<p>Handler jsou mnohem m\u00e9n\u011b u\u017eite\u010dn\u00e9 a mnohem problemati\u010dt\u011bj\u0161\u00ed, ne\u017e se zd\u00e1. Pokud je mo\u017en\u00e9 n\u011bco napsat kr\u00e1sn\u011b (bez komplikac\u00ed) bez handler\u016f, je lep\u0161\u00ed je nepou\u017e\u00edvat. Pokud to kr\u00e1sn\u011b nejde, je lep\u0161\u00ed je m\u00edt.<\/p>\n<p><\/p>\n<p>Pozorn\u00fd \u010dten\u00e1\u0159 spr\u00e1vn\u011b poznamen\u00e1v\u00e1, \u017ee jsme neprobrali <code>listen<\/code>, \u017ee handler m\u016f\u017ee vyvolat notify pro jin\u00fd handler, \u017ee handler m\u016f\u017ee zahrnovat import_tasks (kter\u00fd m\u016f\u017ee prov\u00e9st include_role s with_items), \u017ee syst\u00e9m handler\u016f v Ansible je Turingovsky \u00fapln\u00fd, \u017ee handlery z include_role zaj\u00edmav\u011b zasahuj\u00ed do handler\u016f z play atd. \u2014 to v\u0161e nen\u00ed z\u0159ejm\u011b \"z\u00e1kladn\u00ed\".<\/p>\n<p><\/p>\n<p>I kdy\u017e je tu jedno specifick\u00e9 WTF, kter\u00e9 je ve skute\u010dnosti funkc\u00ed, a na kter\u00e9 je t\u0159eba pamatovat. Pokud m\u00e1te \u00fakol, kter\u00fd se vykon\u00e1v\u00e1 s <code>delegate_to<\/code> a m\u00e1 notifikaci, p\u0159\u00edslu\u0161n\u00fd handler se vykon\u00e1v\u00e1 bez <code>delegate_to<\/code>, tzn. na hostiteli, na kter\u00e9m je p\u0159i\u0159azen play. (I kdy\u017e handler m\u016f\u017ee m\u00edt samoz\u0159ejm\u011b <code>delegate_to<\/code> tak\u00e9).<\/p>\n<p><\/p>\n<p>Samostatn\u011b bych cht\u011bl \u0159\u00edci p\u00e1r slov o reusable roles. P\u0159ed vznikem kolekc\u00ed byl n\u00e1pad, \u017ee m\u016f\u017eete vytvo\u0159it univerz\u00e1ln\u00ed role, kter\u00e9 lze <code>ansible-galaxy install<\/code> a jelo. Funguje na v\u0161ech opera\u010dn\u00edch syst\u00e9mech ve v\u0161ech situac\u00edch. Tak\u017ee, m\u016fj n\u00e1zor je: to nefunguje. Jak\u00e1koli role s masivn\u00ed <code>include_vars<\/code>, podpora 100500 p\u0159\u00edpad\u016f je odsouzena k propastem corner case chyb. Mohou b\u00fdt eliminov\u00e1ny masivn\u00edm testov\u00e1n\u00edm, ale jako u ka\u017ed\u00e9ho testov\u00e1n\u00ed, bu\u010f m\u00e1te dekartsk\u00fd produkt vstupn\u00edch hodnot a tot\u00e1ln\u00ed funkci, nebo pokryt\u00e9 jednotliv\u00e9 sc\u00e9n\u00e1\u0159e. M\u016fj n\u00e1zor \u2014 je mnohem lep\u0161\u00ed, pokud je role line\u00e1rn\u00ed (cyklomatick\u00e1 slo\u017eitost 1).<\/p>\n<p><\/p>\n<p>\u010c\u00edm m\u00e9n\u011b if\u016f (v\u00fdslovn\u00fdch nebo deklarativn\u00edch \u2014 ve form\u011b <code>when<\/code> nebo form\u011b <code>include_vars<\/code> na z\u00e1klad\u011b prom\u011bnn\u00fdch), t\u00edm lep\u0161\u00ed je role. N\u011bkdy mus\u00ed doch\u00e1zet k v\u011btven\u00ed, ale znovu opakuji, \u010d\u00edm jich je m\u00e9n\u011b, t\u00edm l\u00e9pe. Tak\u017ee vypad\u00e1 to, \u017ee dobr\u00e1 role s galaxy (v\u0161ak funguje!) s mno\u017estv\u00edm <code>when<\/code> m\u016f\u017ee b\u00fdt m\u00e9n\u011b preferovan\u00e1 ne\u017e \"v\u011bt\u0161\u00ed\" role z p\u011bti \u00faloh. Moment, kdy je role s galaxy lep\u0161\u00ed \u2014 kdy\u017e za\u010d\u00edn\u00e1te n\u011bco ps\u00e1t. Moment, kdy se st\u00e1v\u00e1 hor\u0161\u00ed \u2014 kdy\u017e n\u011bco sel\u017ee a m\u00e1te podez\u0159en\u00ed, \u017ee je to kv\u016fli \"roli s galaxy\". Otev\u0159ete ji a tam je p\u011bt inkluz\u00ed, osm task list\u016f a hromada <code>when<\/code>\u2018\u016f\u2026 A v tom se mus\u00edte zorientovat. M\u00edsto 5 \u00faloh v line\u00e1rn\u00edm seznamu, ve kter\u00e9m nen\u00ed ani co se rozb\u00edt.<\/p>\n<p><\/p>\n<h1>V n\u00e1sleduj\u00edc\u00edch \u010d\u00e1stech<\/h1>\n<p><\/p>\n<ul>\n<li>Trochu o invent\u00e1\u0159i, skupinov\u00fdch prom\u011bnn\u00fdch, host_group_vars pluginu, hostvars. Jak z t\u011bstovin sv\u00e1zat Gordick\u00fd uzel. Rozsah a precedence prom\u011bnn\u00fdch, pam\u011b\u0165ov\u00fd model Ansible. \"Tak kde vlastn\u011b ukl\u00e1dat jm\u00e9no u\u017eivatele pro datab\u00e1zi?\".<\/li>\n<li><code>jinja: {{ jinja }}<\/code> \u2014 nosql notype nosense m\u011bkk\u00fd plastel\u00edn. Je v\u0161ude, i tam, kde ho neo\u010dek\u00e1v\u00e1te. Trochu o <code>!!unsafe<\/code> a chutn\u00e9m yaml.<\/li>\n<\/ul>\n<p>Zdroj: <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.3 - 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\/cs\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Z\u00e1klady Ansible, bez kter\u00fdch jsou va\u0161e playbooky skrum\u00e1\u017e slepen\u00fdch t\u011bstovin | ProHoster","description":"D\u011bl\u00e1m hodn\u011b recenz\u00ed ciz\u00edho k\u00f3du na Ansible a hodn\u011b s\u00e1m p\u00ed\u0161u.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/osnovy-ansible-bez-kotoryh-vashi-plejbuki-komok-slipshihsya-makaron","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/87084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=87084"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87084\/revisions"}],"predecessor-version":[{"id":162161,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/87084\/revisions\/162161"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=87084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=87084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=87084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}