{"id":271,"date":"2018-09-17T21:39:25","date_gmt":"2018-09-17T19:39:25","guid":{"rendered":"http:\/\/spireng.sk\/?p=271"},"modified":"2018-09-17T21:50:30","modified_gmt":"2018-09-17T19:50:30","slug":"spravujeme-infrastrukturu-so-saltstackom","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/spravujeme-infrastrukturu-so-saltstackom\/","title":{"rendered":"Spravujeme infra\u0161trukt\u00faru so SaltStackom"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-272 alignleft\" src=\"http:\/\/spireng.sk\/wp-content\/uploads\/2018\/09\/asdfklfasf-300x167.png\" alt=\"\" width=\"300\" height=\"167\" srcset=\"https:\/\/spireng.sk\/wp-content\/uploads\/2018\/09\/asdfklfasf-300x167.png 300w, https:\/\/spireng.sk\/wp-content\/uploads\/2018\/09\/asdfklfasf-768x427.png 768w, https:\/\/spireng.sk\/wp-content\/uploads\/2018\/09\/asdfklfasf.png 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>V\u00a0dne\u0161nej dobe je be\u017enou po\u017eiadavkou spr\u00e1va v\u00e4\u010d\u0161ieho mno\u017estva serverov. Spravovanie by samozrejme malo by\u0165 jednoduch\u00e9, automatizovan\u00e9 a\u00a0opakovate\u013en\u00e9. Inak povedan\u00e9, je dobr\u00e9 ma\u0165 na spr\u00e1vu nejak\u00fd softv\u00e9r, ktor\u00fd to u\u013eah\u010d\u00ed. Tak\u00e9to softv\u00e9ry na spr\u00e1vu s\u00fa tu s\u00a0nami u\u017e nejak\u00fa dobu. Napr\u00edklad Puppet, Chef alebo Ansible. Ale na tomto poli pribudol pred \u010dasom aj nov\u00fd hr\u00e1\u010d s\u00a0n\u00e1zvom SaltStack. Po\u010fme sa teraz na neho bli\u017e\u0161ie pozrie\u0165.<!--more--><\/p>\n<p>SaltStack je softv\u00e9r vytvoren\u00fd v\u00a0Pythone, ktor\u00fd je ur\u010den\u00fd na automatizovan\u00e9 spravovanie men\u0161ieho aj v\u00e4\u010d\u0161ieho mno\u017estva serverov. Tieto servery s\u00fa ozna\u010dovan\u00e9 ako <strong>miniony<\/strong>. Okrem nich by mal v\u00a0sieti (ale nie je \u00faplne nutn\u00e1 podmienka) existova\u0165 aj jeden (alebo viac) server <strong>master<\/strong>. Master je riadiaci server, ktor\u00fd minionom posiela pr\u00edkazy, a\u00a0z\u00a0ktor\u00e9ho je mo\u017en\u00e9 cel\u00fd syst\u00e9m ovl\u00e1da\u0165.<\/p>\n<p>Na masterovi aj minionovi be\u017eia softv\u00e9rov\u00e9 komponenty SaltStacku (aj ke\u010f u\u00a0miniona to nie je \u00faplne nutn\u00e1 podmienka, ale k\u00a0tomu nesk\u00f4r). Tieto syst\u00e9my komunikuj\u00fa pomocou ZeroMQ kni\u017enice. Na rozdiel od softv\u00e9rov, ktor\u00e9 na toto pou\u017e\u00edvaj\u00fa http, je to jedna z\u00a0v\u00fdhod Saltu, preto\u017ee v\u010faka tomu vie obsluhova\u0165 aj relat\u00edvne ve\u013ek\u00e9 mno\u017estvo serverov bez zna\u010dn\u00e9ho performance n\u00e1rastu.<\/p>\n<p>Komunik\u00e1cia medzi masterom a\u00a0minionom je kryptovan\u00e1. Preto ak sa prid\u00e1va nov\u00fd minion do siete, tak posiela masterovi svoj k\u013e\u00fa\u010d a\u00a0ten k\u013e\u00fa\u010d je nutn\u00e9 pr\u00edkazom masterovi akceptova\u0165. N\u00e1sledne m\u00f4\u017ee za\u010da\u0165 posielanie pr\u00edkazov. A\u00a0ako posielanie vyzer\u00e1? Tu je uk\u00e1\u017eka jedn\u00e9ho tak\u00e9ho pr\u00edkazu:<\/p>\n<pre>  salt '*' disk.usage<\/pre>\n<p>Po\u010fme to rozobra\u0165 postupne:<\/p>\n<p style=\"padding-left: 30px;\"><strong>salt<\/strong> \u2013 t\u00fdmto samozrejme za\u010d\u00ednaj\u00fa v\u0161etky pr\u00edkazy, ke\u010f\u017ee ide o\u00a0volanie samotn\u00e9ho programu<br \/>\n<strong>&#8218;*&#8216;<\/strong> \u2013 prv\u00fd parameter hovor\u00ed o\u00a0tom, pre ktor\u00fdch minionov chceme pr\u00edkaz spusti\u0165. Mo\u017enosti ako ich zacieli\u0165 je ve\u013ea, o\u00a0chv\u00ed\u013eu sa na nich pozrieme<br \/>\n<strong>disk.usage<\/strong> \u2013 to pred bodkou je modul, to za \u0148ou je funkcia. T\u00fdmto vlastne hovor\u00edm, \u010do maj\u00fa vybran\u00ed minioni spravi\u0165.<\/p>\n<p>Za modulom a\u00a0funkciou e\u0161te m\u00f4\u017eu nasledova\u0165 \u010fal\u0161ie parametre, ktor\u00e9 predstavuj\u00fa vstupn\u00e9 d\u00e1ta do funkcie. Tak\u017ee takto viem posiela\u0165 minionom pr\u00edkazy. Ale ako vyberiem, ktor\u00fdm minionom chcem pr\u00edkaz posla\u0165? Na to je nieko\u013eko mo\u017enost\u00ed:<\/p>\n<ol>\n<li>vymenujem minionov za sebou: &#8218;dev1, dev2, int1&#8216;<\/li>\n<li>pou\u017eijem <strong>glob matching<\/strong> podobn\u00e9 linuxov\u00e9mu shellu: &#8218;dev[1-2]&#8216; alebo &#8218;int*&#8216;<\/li>\n<li>podobne ako glob matching viem pou\u017ei\u0165 aj <strong>regul\u00e1rne v\u00fdrazy<\/strong>: &#8218;dev-(local|remote)&#8216;<\/li>\n<li>minionov zacielim pomocou <strong>grains<\/strong>: &#8218;os:CentOS&#8216;<\/li>\n<\/ol>\n<p>Asi sa po poslednom bode p\u00fdtate, \u010do je to grains. To je sada dvoj\u00edc k\u013e\u00fa\u010d-hodnota, ktor\u00fa maj\u00fa priraden\u00fa v\u0161etci minioni. V\u00a0tej sade viete n\u00e1js\u0165 naozaj r\u00f4zne veci. Od opera\u010dn\u00e9ho syst\u00e9mu miniona, cez jeho typ procesora, a\u017e po nejak\u00e9 \u013eubovo\u013en\u00e9 \u00fadaje, ktor\u00e9 tomu minionu viete priradi\u0165. S\u00fa to vlastnosti miniona, ktor\u00e9 viete n\u00e1sledne pou\u017e\u00edva\u0165 v\u00a0r\u00f4znych situ\u00e1ci\u00e1ch, ako v\u00a0pr\u00edklade vy\u0161\u0161ie, ke\u010f chcete vybra\u0165 nejak\u00fa podmno\u017einu minionov.<\/p>\n<p>Uk\u00e1zali sme si teda aplik\u00e1ciu \u013eubovo\u013en\u00e9ho pr\u00edkazu. Ale toto je naozaj operat\u00edva. Niekto (spr\u00e1vca) sed\u00ed za po\u010d\u00edta\u010dom a\u00a0vyd\u00e1va pr\u00edkazy. Alebo to rob\u00ed cron, alebo nie\u010do podobn\u00e9. Ten, \u010do to ale vykon\u00e1va, mus\u00ed vedie\u0165, \u010do sa deje a\u00a0pod\u013ea toho posiela\u0165 pr\u00edkazy. Nebolo by lep\u0161ie prikazova\u0165 a\u00a0nestara\u0165 sa o\u00a0to, \u010di ten pr\u00edkaz m\u00f4\u017eem alebo nem\u00f4\u017eem spusti\u0165? Jednoducho vy\u017eiada\u0165 od Saltu, aby dostal miniona do nejak\u00e9ho stavu (nain\u0161talovan\u00fd softv\u00e9r, vy\u010disten\u00e9 logy, spusten\u00e1 slu\u017eba) a\u00a0samotn\u00fd Salt sa u\u017e postar\u00e1 o\u00a0to, aby sa udiali len potrebn\u00e9 kroky. Nie nadarmo sa t\u00e1to funkcionalita vol\u00e1 <strong>states<\/strong>.<\/p>\n<p>Salt stavy funguj\u00fa jednoducho. Namiesto imperat\u00edvneho prikazovania Saltu, \u010do m\u00e1 spravi\u0165, mu len deklarat\u00edvne poviete, v\u00a0akom stave chcete, aby sa minion ocitol. Napr\u00edklad:<\/p>\n<pre>salt 'xyz.lan' state.apply install-vim.sls<\/pre>\n<p>Z\u00a0predch\u00e1dzaj\u00faceho vysvetlenia je ver\u00edm jasn\u00e9, \u017ee sp\u00fa\u0161\u0165am Salt, cielim na minion xyz.lan.sk a\u00a0sp\u00fa\u0161\u0165am funkciu apply v\u00a0module state (to je\u00a0funkcia, ktor\u00e1 sl\u00fa\u017ei pr\u00e1ve na aplikovanie stavov). Ten posledn\u00fd parameter je n\u00e1zov s\u00faboru, v\u00a0ktorom m\u00e1m ulo\u017een\u00fa defin\u00edciu cie\u013eov\u00e9ho stavu. Chcem, aby na minionovi bol nain\u0161talovan\u00fd vim. Install-vim.sls vyzer\u00e1 takto:<\/p>\n<pre>install_vim:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;- jedine\u010dn\u00fd identifik\u00e1tor stavu\r\n\u00a0 pkg:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;- n\u00e1zov stavu\r\n\u00a0\u00a0\u00a0 - installed:\u00a0\u00a0 &lt;- n\u00e1zov funkcie stavu\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 - name: vim  &lt;- na\u00e1zov bal\u00edka, ktor\u00fd chcem in\u0161talova\u0165<\/pre>\n<p>Syntax Salt stavov je naozaj svojsk\u00e1, ale aj mnohorak\u00e1 a\u00a0mocn\u00e1. My len \u0161krtneme povrch toho, \u010do umo\u017e\u0148uje.<\/p>\n<p>Z\u00e1kladom je jazyk <strong>Yaml<\/strong> (Yet Another Markup Language). To je v\u00fdchodz\u00ed jazyk pre v\u0161etky Salt konfigura\u010dn\u00e9 s\u00fabory, aj ke\u010f je mo\u017en\u00e9 ho zmieni\u0165 napr\u00edklad za JSON alebo in\u00e9. Prv\u00fd riadok je nejak\u00fd jedine\u010dn\u00fd identifik\u00e1tor, ktor\u00fd stavu prirad\u00edme (jeho meno). Druh\u00fd hovor\u00ed o\u00a0tom, ktor\u00fd stav chceme pou\u017ei\u0165 (stav je ak\u00e1si logick\u00e1 mno\u017eina funkci\u00ed). Tret\u00edm parametrom je funkcia zo stavu, ktor\u00fa chcem pou\u017ei\u0165 a\u00a0posledn\u00fdm je n\u00e1zov bal\u00edka.<\/p>\n<p>A\u00a0to je vlastne v\u0161etko. Sta\u010d\u00ed to spusti\u0165 a\u00a0Salt zist\u00ed, \u010di na minionovi tak\u00fd bal\u00edk existuje a\u00a0ak nie, tak ho nain\u0161taluje. Ak tam tak\u00fd bal\u00edk je, tak nevykon\u00e1 ni\u010d (v\u0161imnite si, \u017ee n\u00e1zov funkcie je \u201ein\u0161talovan\u00fd\u201c, nie \u201ein\u0161taluj\u201c \u2013 ja Saltu hovor\u00edm, do ak\u00e9ho stavu sa m\u00e1 dosta\u0165, nie \u010do m\u00e1 spravi\u0165). Toto bola uk\u00e1\u017eka ve\u013emi jednoduch\u00e9ho Salt stavov\u00e9ho s\u00faboru. V\u00a0skuto\u010dnosti v\u0161ak vedia by\u0165 omnoho komplikovanej\u0161ie.<\/p>\n<p>Jednou zo z\u00e1kladn\u00fdch po\u017eiadaviek je, aby sme vedeli ten ist\u00fd stav aplikova\u0165 na r\u00f4znych minionov. Ale \u010do je, ke\u010f je napr\u00edklad s\u00fa\u010das\u0165ou stavu vytvorenie \u00fa\u010dtu pou\u017e\u00edvate\u013ea, ktor\u00fd ma by\u0165 ale na ka\u017edom minionovi in\u00fd? V\u00a0tomto pr\u00edpade n\u00e1m pom\u00f4\u017ee <strong>Jinja<\/strong> a\u00a0<strong>pillary<\/strong>.<\/p>\n<p>Pillary s\u00fa s\u00fabory \u0161trukt\u00farovan\u00fdch \u00fadajov (op\u00e4\u0165 zap\u00edsan\u00e9 v\u00a0Yaml), ktor\u00e9 sa daj\u00fa priradi\u0165 jedn\u00e9mu alebo viacer\u00fdm minionom. Je to podobn\u00e9 ako grains, ale zatia\u013e \u010do grains je len k\u013e\u00fa\u010d-hodnota, pillary s\u00fa \u013eubovo\u013en\u00e1 d\u00e1tov\u00e1 \u0161trukt\u00fara. Zoznam alebo slovn\u00edk k\u013e\u00fa\u010d \u2013 hodnota, kde hodnota m\u00f4\u017ee by\u0165 zoznam alebo op\u00e4\u0165 slovn\u00edk.<\/p>\n<p>Jinja (presnej\u0161ie Jinja2) je jazyk na generovanie \u0161abl\u00f3n. Umo\u017e\u0148uje v\u00e1m nap\u00edsa\u0165 do \u0161abl\u00f3ny riadiace znaky a\u00a0potom pomocou nich vygenerova\u0165 kone\u010dn\u00fa \u0161abl\u00f3nu. Okrem dynamick\u00e9ho vkladania hodn\u00f4t do \u0161abl\u00f3ny podporuje napr\u00edklad vetvenie (IF) alebo generovanie \u010dast\u00ed \u0161abl\u00f3ny v\u00a0cykle (FOR).<\/p>\n<p>Spojen\u00edm toho v\u0161etk\u00e9ho dostanete s\u00fabor Salt stavu, ktor\u00fd vytvor\u00ed na minionovi \u00fa\u010det s\u00a0loginom definovan\u00fdm v\u00a0pillare:<\/p>\n<pre>create_user:\r\n\u00a0 user.present:\r\n\u00a0\u00a0\u00a0 - name: {{ salt['pillar.get']('user:login') }}\r\n\u00a0\u00a0\u00a0 - fullname: {{ salt['pillar.get']('user:fullname') }}\r\n\u00a0\u00a0\u00a0 - shell: \/bin\/zsh\r\n\u00a0\u00a0\u00a0 - home: \/home\/{{ salt['pillar.get']('user:login') }}\r\n\u00a0\u00a0\u00a0 - uid: 4000\r\n\u00a0\u00a0\u00a0 - gid: 4000<\/pre>\n<p>Text {{ salt[&#8218;pillar.get&#8216;](&#8218;user:login&#8216;) }} je Jinja v\u00fdraz, ktor\u00fd zavol\u00e1 pr\u00edkaz Saltu na z\u00edskanie pillaru user:login (teda objekt user a\u00a0jeho vlastnos\u0165 login) a\u00a0vlo\u017e\u00ed ho na dan\u00e9 miesto do \u0161abl\u00f3ny. V\u00fdsledok je, \u017ee ak minionom prirad\u00edm spr\u00e1vne pillary a\u00a0n\u00e1sledne pust\u00edm tento stav, tak na ka\u017edom vznikne in\u00fd pou\u017e\u00edvate\u013e s\u00a0in\u00fdm loginom a\u00a0menom.<\/p>\n<p>Tento \u010dl\u00e1nok bol kr\u00e1tkym \u00favodom do toho, \u010do to SaltStack je a\u00a0na \u010do je dobr\u00fd. Ani z\u010faleka sme nevy\u010derpali v\u0161etky t\u00e9my, ktor\u00e9 sa Saltu t\u00fdkaj\u00fa. I\u0161lo sk\u00f4r len uk\u00e1za\u0165 z\u00e1klad Saltu, ktor\u00fdm s\u00fa pr\u00edkazy a\u00a0stavy a\u00a0tie\u017e to, \u017ee je to pomerne flexibiln\u00fd n\u00e1stroj, ktor\u00fd vie pokry\u0165 r\u00f4zne scen\u00e1re. Ke\u010f\u017ee automatiz\u00e1cia spravovania je tu s\u00a0nami u\u017e nejak\u00fa dobu, konkurencia na tom poli je ve\u013ek\u00e1. Ale SaltStack ur\u010dite stoj\u00ed za pokus.<\/p>","protected":false},"excerpt":{"rendered":"<p>V\u00a0dne\u0161nej dobe je be\u017enou po\u017eiadavkou spr\u00e1va v\u00e4\u010d\u0161ieho mno\u017estva serverov. Spravovanie by samozrejme malo by\u0165 jednoduch\u00e9, automatizovan\u00e9 a\u00a0opakovate\u013en\u00e9. Inak povedan\u00e9, je dobr\u00e9 ma\u0165 na spr\u00e1vu nejak\u00fd softv\u00e9r, ktor\u00fd to u\u013eah\u010d\u00ed. Tak\u00e9to softv\u00e9ry na spr\u00e1vu s\u00fa tu s\u00a0nami u\u017e nejak\u00fa dobu. Napr\u00edklad Puppet, Chef alebo Ansible. Ale na tomto poli pribudol pred \u010dasom aj nov\u00fd hr\u00e1\u010d s\u00a0n\u00e1zvom [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[140],"class_list":["post-271","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru","tag-automatizacia"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=271"}],"version-history":[{"count":5,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/271\/revisions"}],"predecessor-version":[{"id":277,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/271\/revisions\/277"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}