{"id":80305,"date":"2020-05-05T01:42:50","date_gmt":"2020-05-04T23:42:50","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek"},"modified":"2020-05-05T01:42:50","modified_gmt":"2020-05-04T23:42:50","slug":"kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek","title":{"rendered":"How to start testing Ansible, refactor a project in a year, and not lose your mind.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/b8981189e3a2d7f8429757cd521b7583.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on t\u00f5lgendus <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=GdrJv5oypfg\">esinemisest<\/a><\/noindex> j\u00e4rgnevaga <noindex><a rel=\"nofollow\" href=\"https:\/\/www.meetup.com\/DevOps-40\/events\/269140089\/\">DevOps-40 2020-03-18<\/a><\/noindex>:<\/p>\n<p><\/p>\n<p>Alates teisest commit'ist muutub iga kood legacy'ks, kuna algsed ideed hakkavad lahknema karmist reaalsusest. See ei ole hea ega halb, see on fakt, millega on raske vaielda ja millega on vaja koos eksisteerida. Osana sellest protsessist on refaktooring. Refaktooring infrastruktuuri kui koodi. Alustame lugu, kuidas refaktoerida Ansible aasta jooksul ja mitte vaimselt alla j\u00e4\u00e4da.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"zarozhdenie-legacy\">Legacy tekkimine<\/h2>\n<p><\/p>\n<h3 id=\"den--1-nulevoy-pacient\">P\u00e4ev \u2116 1: Null patsient<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/086414710864293a91a37785854bc096.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Olid \u00fcks projekt. Sellel oli Dev arendusmeeskond ja Ops insenerid. Nad lahendasid sama \u00fclesande: kuidas servereid \u00fcles seada ja rakendust k\u00e4ivitada. Probleem oli selles, et iga meeskond lahendas seda \u00fclesannet omamoodi. Projektil otsustati kasutada Ansible'i teadmiste s\u00fcnkroniseerimiseks Dev ja Ops meeskondade vahel.<\/p>\n<p><\/p>\n<h3 id=\"den--89-zarozhdenie-legacy\">P\u00e4ev \u2116 89: Legacy tekkimine<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/329bc3f190ca4d6519be6ac94026bc6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ilma et me seda m\u00e4rkaksime, soovisime teha nii h\u00e4sti kui v\u00f5imalik, kuid tulemuseks oli legacy. Kuidas see nii juhtub?<\/p>\n<p><\/p>\n<ul>\n<li>Meil on siin kiire \u00fclesanne, teeme r\u00e4paste nipiga \u2014 hiljem parandame.<\/li>\n<li>Dokumentatsiooni ei pea kirjutama, ja nii on k\u00f5ik selge, mis siin toimub.<\/li>\n<li>Ma tean Ansible'it \/ Pythonit \/ Bashi \/ Terraformi! Vaata, kuidas ma suudan ennast kokku v\u00f5tta!<\/li>\n<li>Ma Full Stack Overflow arendaja kopeerisin selle stackoverflow'ist, ei tea, kuidas see t\u00f6\u00f6tab, aga see n\u00e4eb \u00e4ge v\u00e4lja ja lahendab \u00fclesande.<\/li>\n<\/ul>\n<p><\/p>\n<p>L\u00f5puks v\u00f5ib saada arusaamatut koodi, mille kohta ei ole dokumentatsiooni, ei ole selge, mida see teeb, kas see on vajalik, kuid probleem on see, et peate seda arendama, t\u00e4iendama, lisama tugistruktuure, halvendades olukorda veel rohkem.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: localhost\n  tasks:\n    - shell: echo -n Z &gt;&gt; a.txt &amp;&amp; cat a.txt\n      register: output\n      delay: 1\n      retries: 5\n      until: not output.stdout.find(&quot;ZZZ&quot;)<\/code><\/pre>\n<p><\/p>\n<h3 id=\"den--109-osoznanie-problemy\">P\u00e4ev \u2116 109: Probleemi teadvustamine<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/b7da9f6aecc5bebab6072ba6e5dfa824.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alguses kavandatud ja ellu viidud IaC mudel l\u00f5petab vastamast kasutajate \/ \u00e4ri \/ teiste meeskondade n\u00f5udmistele, aeg, mis kulub infrastruktuuri muutmiseks, ei ole enam vastuv\u00f5etav. Sellel hetkel saab selgeks, et on aeg samme astuda.<\/p>\n<p><\/p>\n<h2 id=\"refaktoring-iac\">IaC refaktoreerimine<\/h2>\n<p><\/p>\n<h3 id=\"den--139-a-vam-tochno-nuzhen-refaktoring\">P\u00e4ev \u2116 139: Kas teil on t\u00f5esti vaja refaktoreerimist?<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/881455f096870d51bc2b9b8f87f171b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Enne refaktoreerimisse h\u00fcppamist peate vastama mitmele olulisele k\u00fcsimusele:<\/p>\n<p><\/p>\n<ol>\n<li>Miks te seda k\u00f5ike vajate?<\/li>\n<li>Kas teil on aega?<\/li>\n<li>Kas teadmised on piisavad?<\/li>\n<\/ol>\n<p><\/p>\n<p>Kui te ei oska k\u00fcsimustele vastata, siis l\u00f5ppeb refaktoreerimine algamata v\u00f5i v\u00f5ib see ainult hullemaks minna. Kuna kokemused on olnud. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/467171\/\">Mida ma \u00f5ppisin, testides 200 000 rida infrastruktuuri koodi<\/a><\/noindex>), siis tuli projektilt abi k\u00fcsimine rollide korrigeerimiseks ja nende katmiseks testidega.<\/p>\n<p><\/p>\n<h3 id=\"den--149-podgotovka-refaktoringa\">P\u00e4ev nr 149: Refaktoreerimise ettevalmistamine<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/3e2d66a81cd162dcb4181f3914fc132d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u043e\u0447\u0435\u0440e\u0434\u043d\u043e\u0435 \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u0449\u0430\u0435\u043c\u0441\u044f, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u0438\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u0438 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u044b \u043a\u0430\u043a-\u0442\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0430\u0442\u044c\u044f \u0432 confluence, \u0447\u0442\u043e \u0431\u044b \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 &quot;\u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435?&quot; \u0438\u043b\u0438 &quot;\u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435?&quot; \u043c\u044b \u043d\u0435 \u0441\u0431\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u0443\u0440\u0441\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0434\u0435\u0438 <em>jaga ja valitse<\/em>: jagame infrastruktuuri v\u00e4ikesteks t\u00fckkideks \/ tellisteks. Selline l\u00e4henemine v\u00f5imaldab v\u00f5tta isoleeritud infrastruktuuri osa, m\u00f5ista, mida see teeb, katab selle testidega ja muuta seda kartmata, et midagi katki l\u00e4heb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/a0ea12ae6568d5c7e97469eaf404d608.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Seega muutub infrastruktuuri testimine sillaks, ja siin tasub mainida infrastruktuuri testimise p\u00fcramiidi. Just sama idee nagu arenduses, kuid infrastruktuuri jaoks: liigume odavatelt kiirtestidest, mis kontrollivad lihtsaid asju, n\u00e4iteks vahemaid, kallimatele t\u00e4istekstidele, mis juurutavad terviklikku infrastruktuuri.<\/p>\n<p><\/p>\n<h4 id=\"popytki-testirovaniya-ansible\">Ansible'i testimise katsed<\/h4>\n<p><\/p>\n<p>Enne kui hakkame kirjeldama, kuidas katsetasime Ansible'it projektis, r\u00e4\u00e4gin katsetustest ja l\u00e4henemistest, mida varem kasutasin, et m\u00f5ista otsuste konteksti.<\/p>\n<p><\/p>\n<h5 id=\"den---997-sds-provision\">P\u00e4ev \u2116 -997: SDS provision<\/h5>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/3d93865fb03c7d7baa055b99e21d9ae9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esimest korda tuli Ansible'it testida SDS (Software Defined Storage) arendusprojektis. Sellel teemal on eraldi artikkel.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/342216\/\">Kuidas katsetada oma distributsiooni saamata samal ajal jalgrataste purunemist<\/a><\/noindex>, kuid l\u00fchidalt \u00f6eldes saime p\u00f6\u00f6rdepaadi testimise, milleks kulutasime \u00fche rolli testimisele 60-90 minutit, mis on liiga kaua. Aluseks olid e2e testid, st seadistasime t\u00e4ieliku paigalduse ja seej\u00e4rel testisime seda. Lisaks raskendas meie enda lahenduse v\u00e4ljam\u00f5tlemine. Kuid tuleb tunnistada, et see lahendus t\u00f6\u00f6tas ja v\u00f5imaldas stabiilselt v\u00e4lja anda.<\/p>\n<p><\/p>\n<h5 id=\"den---701-ansible-i-test-kitchen\">P\u00e4ev \u2116 -701: Ansible ja test kitchen<\/h5>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/1b87eca5b01cace01b48edaf28a4ab7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ansible'i testimise idee edasiarenduseks sai valmis t\u00f6\u00f6riistade kasutamine, nimelt test kitchen \/ kitchen-ci ja inspec. Valik p\u00f5hines Ruby teadmisel (t\u00e4iendavalt artiklis habras): <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/437004\/\">Kas YML programmeerijad unistavad Ansible'i testimisest?<\/a><\/noindex>) t\u00f6\u00f6tas kiiremini umbes 40 minutit 10 rolli jaoks. Loodime hunniku virtuaalmasinaid ja jooksutasime testid sees.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/345fe1c82dde1e6a94978781c90f8a85.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kokkuv\u00f5ttes lahendus t\u00f6\u00f6tas, kuid j\u00e4i ebamugav tunne segaduse t\u00f5ttu. Kui suurendasime testitavate hulka 13 p\u00f5hiteemale ja 2 meta-rolli, mis kombineerisid v\u00e4iksemaid rolle, hakkasid testid j\u00e4rsku t\u00f6\u00f6tama 70 minutit, mis on peaaegu kaks korda kauem. XP (Extreme Programming) praktikate osas oli keeruline r\u00e4\u00e4kida, kuna keegi ei taha 70 minutit oodata. See muutus l\u00e4henemise muutmise p\u00f5hjuseks.<\/p>\n<p><\/p>\n<h5 id=\"den---601-ansible-i-molecule\">P\u00e4ev \u2116 -601: Ansible ja molecule<\/h5>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/37e144725fff4adda585781d057782ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kontseptuaalselt sarnaneb see testkitcheniga, ainult et me viisime rollide testimise dockerisse ja vahetasime st\u00e4kki. Tulemusena v\u00e4henes aeg stabiilseteks 20-25 minutiks 7 rolli jaoks.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/640075d7087c1bc2337cb82ad412c6b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Suurendades testitavate rollide arvu 17-ni ja lintimise 45 rollile, jooksutasime selle 28 minutiga 2 jenkins slave'i peal.<\/p>\n<p><\/p>\n<h3 id=\"den--167-dobavlyaem-na-proekt-testy-ansible\">P\u00e4ev \u2116 167: Lisame projekti Ansible testid<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/e62261eb4000f2bc4df4cea398d38276.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00e4igult \u00fclesande refaktoreerimist t\u00f5en\u00e4oliselt ei \u00f5nnestu teha. \u00dclesanne peab olema m\u00f5\u00f5detav, et saaksite selle t\u00fckkideks jagada ja elevanti teelusikaga t\u00fckkideks s\u00fc\u00fca. Peab olema arusaam, kas liikute \u00f5iges suunas ja kui kaua on veel minna.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/daf1f9ba63e7122d5d39311b35de19a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00dcldiselt pole oluline, kuidas see tehtud saab, v\u00f5id kirjutada paberile, kleepida post-it m\u00e4rkmeid kapile, luua \u00fclesandeid Jira's, v\u00f5i alustada Google Docs'i ja sinna kirjutada praegune staatus. Probleem on selles, et protsess ei ole hetkeline, see tuleb pikk ja vaevarikas. V\u00e4he t\u00f5en\u00e4oline, et keegi tahab, et refaktoreerimise ajal kaotaksid sa oma ideed, v\u00e4siksid ja loobuksid.<\/p>\n<p><\/p>\n<p>Refaktoreerimine on lihtne:<\/p>\n<p><\/p>\n<ul>\n<li>S\u00f6\u00f6.<\/li>\n<li>Uni.<\/li>\n<li>Koodi.<\/li>\n<li>IaC test.<\/li>\n<li>Korrata.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ja nii me kordame, kuni saavutame seatud eesm\u00e4rgid.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/222fe586d3e4e0bc23051fff1eb7bff4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00f5ike korraga testida ei pruugi \u00f5nnestuda, seet\u00f5ttu oli meie esimeseks \u00fclesandeks alustada lintimise ja s\u00fcntaksi kontrollimisega. <\/p>\n<p><\/p>\n<h3 id=\"den--181-green-build-master\">P\u00e4ev \u2116 181: Roheline Build Master<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/86cf52ede5fd61411e2b87a132c7f386.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lintimine on v\u00e4ike esimene samm Roheline Build Master'ini. See ei riku suurt midagi, kuid v\u00f5imaldab protsesse viia paika ja saavutada rohelisi ehitusi Jenkinsis. Idee on arendada meeskonnas harjumusi:<\/p>\n<p><\/p>\n<ul>\n<li>Punased testid on halvad.<\/li>\n<li>Kui tuled midagi parandama, tee kood natuke paremaks, kui see oli enne sind.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"den--193-ot-lintovki-k-unit-testam\">P\u00e4ev \u2116 193: Lintimisest unit testideni<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/2f79eb411cf64976459c7fc53f22b2fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Koodi viimisprotsessi seadistamisega saab alustada j\u00e4rk-j\u00e4rgult parandamist \u2013 asendada lintimise rollide k\u00e4ivitamisega, isegi ilma idempotentsuseta. Oluline on m\u00f5ista, kuidas rolle rakendada ja kuidas need t\u00f6\u00f6tavad.<\/p>\n<p><\/p>\n<h3 id=\"den--211-ot-unit-k-integration-testam\">P\u00e4ev \u2116 211: \u00dcksuse testidest integreerimistestide juurde<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/9cfeb70b7b637eed4d0c93eb87d9d254.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui enamik rolle on kaetud \u00fcksustestidega ja k\u00f5ik on lintitud, saab alustada integreerimistestide lisamisega. See t\u00e4hendab mitte ainult \u00fcksikute komponentide testimist infrastruktuuris, vaid nende kombinatsioonide testimist, n\u00e4iteks terve instantsi konfiguratsiooni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/c9cdcde1260df9837b2053b2cc811c84.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jenkinsis genereerisime palju etappe, mis paralleelselt lintisid rolle \/ m\u00e4ngubaase, seej\u00e4rel \u00fcksustestid konteinerites ja l\u00f5puks integreerimistestid.<\/p>\n<p><\/p>\n<h4 id=\"jenkins--docker--ansible--tests\">Jenkins + Docker + Ansible = Testid<\/h4>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/218b1d768d2b284d18cfcba2370e080a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ol>\n<li>Koormuse kontrollimine ja ehitusetappide genereerimine.<\/li>\n<li>K\u00e4ivitage lintimise m\u00e4ngubaasi etapid paralleelselt.<\/li>\n<li>K\u00e4ivitage lintimise rollide etapid paralleelselt.<\/li>\n<li>K\u00e4ivitage s\u00fcnteesi kontrollimise rollide etapid paralleelselt.<\/li>\n<li>K\u00e4ivitage testimise rollide etapid paralleelselt.\n<ol>\n<li>Lintige roll.<\/li>\n<li>Kontrollige s\u00f5ltuvust muudest rollidest.<\/li>\n<li>Kontrollige s\u00fcnteesi.<\/li>\n<li>Looge docker instants.<\/li>\n<li>K\u00e4ivitage molecule\/default\/playbook.yml.<\/li>\n<li>Kontrollige idempotentsust.<\/li>\n<\/ol>\n<\/li>\n<li>K\u00e4ivitage integreerimistestid<\/li>\n<li>L\u00f5peta<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"den--271-bus-factor\">P\u00e4ev \u2116 271: Bussifaktor<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/eb1da11eb32f3f64d573e0414f0e05ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alguses tegeles refaktoreerimisega v\u00e4ike inimeste grupp, paar-kolm inimest. Nad tegid koodi \u00fclevaateid masteris. Aja jooksul kujunes meeskonnas v\u00e4lja teadmine, kuidas kirjutada koodi, ning koodide \u00fclevaatus aitas levitada teadmisi infrastruktuuri ja selle toimimise kohta. Erakordne oli see, et \u00fclevaatajad valiti vaheldumisi, graafiku alusel, see t\u00e4hendab, et teatud t\u00f5en\u00e4osusega j\u00f5udsid sa uude infrastruktuuri ossa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/5ca2cf914f32f69f8a84d6c5bd4e5114.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Siin peab olema mugav. Mugav teha \u00fclevaateid, n\u00e4ha, millise \u00fclesande raames need on tehtud, arutelude ajalugu. Integreerisime jenkins + bitbucket + jira.<\/p>\n<p><\/p>\n<p>Kuid koodide \u00fclevaatus iseenesest ei ole imerohi. N\u00e4iteks tuli meil masterisse kood, mis tekitas meile kohati ebausaldusv\u00e4\u00e4rseid teste:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- get_url:\n    url: &quot;{{ actk_certs }}\/{{ item.1 }}&quot;\n    dest: &quot;{{ actk_src_tmp }}\/&quot;\n    username: &quot;{{ actk_mvn_user }}&quot;\n    password: &quot;{{ actk_mvn_pass }}&quot;\n  with_subelements:\n    - &quot;{{ actk_cert_list }}&quot;\n    - &quot;{{ actk_certs }}&quot;\n  delegate_to: localhost\n\n- copy:\n    src: &quot;{{ actk_src_tmp }}\/{{ item.1 }}&quot;\n    dest: &quot;{{ actk_dst_tmp }}&quot;\n  with_subelements:\n    - &quot;{{ actk_cert_list }}&quot;\n    - &quot;{{ actk_certs }}&quot;<\/code><\/pre>\n<p><\/p>\n<p>Kuid see sai hiljem parandatud, kuid mulje j\u00e4i.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">get_url:\n    url: &quot;{{ actk_certs }}\/{{ actk_item }}&quot;\n    dest: &quot;{{ actk_src_tmp }}\/{{ actk_item }}&quot;\n    username: &quot;{{ actk_mvn_user }}&quot;\n    password: &quot;{{ actk_mvn_pass }}&quot;\n  loop_control:\n    loop_var: actk_item\n  with_items: &quot;{{ actk_cert_list }}&quot;\n  delegate_to: localhost\n\n- copy:\n    src: &quot;{{ actk_src_tmp }}\/{{ actk_item }}&quot;\n    dest: &quot;{{ actk_dst_tmp }}&quot;\n  loop_control:\n    loop_var: actk_item\n  with_items: &quot;{{ actk_cert_list }}&quot;<\/code><\/pre>\n<p><\/p>\n<h3 id=\"den--311-uskoryaem-testy\">P\u00e4ev nr 311: Kiirendame teste<\/h3>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/ac7c16be6ea3e140916adc5b060286b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0421\u043e \u0432\u0440\u0435\u043d\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0431\u0438\u043b\u0434\u044b \u0431\u0435\u0436\u0430\u043b\u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0434\u043e \u0447\u0430\u0441\u0430 \u0432 \u043f\u043b\u043e\u0445\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0440\u0435\u0442\u0440\u043e \u0431\u044b\u043b\u0430 \u0444\u0440\u0430\u0437\u0430 \u043f\u043e \u0442\u0438\u043f\u0443 &quot;\u0445\u043e\u0440\u043e\u0448\u043e \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043d\u043e \u043e\u043d\u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435&quot;. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434 docker, \u0434\u0430\u0431\u044b \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0422\u0430\u043a \u0436\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 testinfra \u043d\u0430 ansible verifier \u0447\u0442\u043e \u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b-\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/58576edb7ce00491cd92d7bc6810fc93.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rangelt \u00f6eldes oli siin kompleks meetmeid:<\/p>\n<p><\/p>\n<ol>\n<li>\u00dcleminek dockerile.<\/li>\n<li>Eemaldada rollide testimine, mis dubleeritakse s\u00f5ltuvuste t\u00f5ttu.<\/li>\n<li>Slaidide arvu suurendamine.<\/li>\n<li>Testide k\u00e4ivitamise j\u00e4rjekord.<\/li>\n<li>V\u00f5imalus lintida <strong>K\u00d5IK<\/strong> kohalikult \u00fche k\u00e4suga.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/3bcdaf0afc24c74739c852e220aa3b2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kokkuv\u00f5ttes \u00fchtlustus ka Jenkins'i Pipeline.<\/p>\n<p><\/p>\n<ol>\n<li>K\u00e4ivita buildi etapid.<\/li>\n<li>Lintida k\u00f5ik paralleelselt.<\/li>\n<li>K\u00e4ivitage testimise rollide etapid paralleelselt.<\/li>\n<li>L\u00f5petada.<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"lessons-learned\">\u00d5pitud \u00f5ppetunnid<\/h2>\n<p><\/p>\n<h3 id=\"avoid-global-variables\">V\u00e4ltida globaalsete muutujate kasutamist<\/h3>\n<p><\/p>\n<p>Ansible kasutab globaalseid muutujaid, osaline lahendus on <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/reference_appendices\/config.html#default-private-role-vars\">private_role_vars<\/a><\/noindex>, aga see ei ole imerohi. <\/p>\n<p><\/p>\n<p>T\u00f5in n\u00e4ite. Oletame, et meil on <code>role_a<\/code> ja <code>role_b<\/code><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat role_a\/defaults\/main.yml\n---\nmsg: a\n\n# cat role_a\/tasks\/main.yml\n---\n- debug:\n    msg: role_a={{ msg }}<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat role_b\/defaults\/main.yml\n---\nmsg: b\n\n# cat role_b\/tasks\/main.yml\n---\n- set_fact:\n    msg: b\n- debug:\n    msg: role_b={{ msg }}<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">- hosts: localhost\n  vars:\n    msg: tere\n  roles:\n    - role: role_a\n    - role: role_b\n  tasks:\n    - debug:\n        msg: play={{msg}}<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/7712ba529596ee00eaac22c9e59f7abe.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Naljakas asjaolu on see, et plaanide tulemus s\u00f5ltub mitmetest mitte alati ilmsetest asjadest, n\u00e4iteks rollide loetlemise j\u00e4rjekorrast. Kahjuks on see Ansible'i loomuses ja parim, mida teha saab, on kasutada teatud kokkuleppeid, n\u00e4iteks kasutada rolli sees ainult neid muutujaid, mis on selles rollis kirjeldatud.<\/p>\n<p><\/p>\n<p><strong>HALB<\/strong>: kasutada globaalseid muutujaid.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat roles\/some_role\/tasks\/main.yml\n---\ndebug:\n  var: java_home<\/code><\/pre>\n<p><\/p>\n<p><strong>HEA<\/strong>: A <code>defaults<\/code> : m\u00e4\u00e4rata vajalikud muutujad ja hiljem kasutada ainult neid.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat roles\/some_role\/defaults\/main.yml\n---\nr__java_home:\n &quot;{{ java_home | default('\/path') }}&quot;\n\n# cat roles\/some_role\/tasks\/main.yml\n---\ndebug:\n  var: r__java_home\n<\/code><\/pre>\n<p><\/p>\n<h3 id=\"prefix-role-variables\">Eelneva rolli muutujad<\/h3>\n<p><\/p>\n<p><strong>HALB<\/strong>: kasutada globaalseid muutujaid.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat roles\/some_role\/defaults\/main.yml\n---\ndb_port: 5432<\/code><\/pre>\n<p><\/p>\n<p><strong>HEA<\/strong>: Rooli sees muutujaid kasutades kasutada muutujad, millel on rolli nime eesliide, et oleks lihtsam aru saada, mis toimub, vaadates inventuuri.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># cat roles\/some_role\/defaults\/main.yml\n---\nsome_role__db_port: 5432<\/code><\/pre>\n<p><\/p>\n<h3 id=\"use-loop-control-variable\">Kasuta ts\u00fcklit control muutuja<\/h3>\n<p><\/p>\n<p><strong>HALB<\/strong>: Kasutada ts\u00fcklites standardset muutujat <code>elemendi<\/code>, kui see \u00fclesanne\/plaan on kuskil kaasatud, v\u00f5ib see p\u00f5hjustada ootamatut k\u00e4itumist<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- hosts: localhost\n  tasks:\n    - debug:\n        msg: &quot;{{ item }}&quot;\n      loop:\n        - item1\n        - item2\n<\/code><\/pre>\n<p><\/p>\n<p><strong>HEA<\/strong>: \u00dcmber m\u00e4\u00e4rata muutuja ts\u00fcklis l\u00e4bi <code>loop_var<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- hosts: localhost\n  tasks:\n    - debug:\n        msg: &quot;{{ item_name }}&quot;\n      loop:\n        - item1\n        - item2\n      loop_control:\n        loop_var: item_name\n<\/code><\/pre>\n<p><\/p>\n<h3 id=\"check-input-variables\">Kontrolli sisendi muutujad<\/h3>\n<p><\/p>\n<p>Oleme kokku leppinud, et kasutame muutujate eeliseid; oleks hea kontrollida, et need on m\u00e4\u00e4ratletud nagu ootame ja n\u00e4iteks, et need ei ole t\u00fchjaks v\u00e4\u00e4rtuseks \u00fcle kirjutatud.<\/p>\n<p><\/p>\n<p><strong>HEA<\/strong>: Kontrollige muutujaid.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">- name: &quot;Verify that required string variables are defined&quot;\n  assert:\n    that: ahs_var is defined and ahs_var | length &gt; 0 and ahs_var != None\n    fail_msg: &quot;{{ ahs_var }} needs to be set for the role to work &quot;\n    success_msg: &quot;Required variables {{ ahs_var }} is defined&quot;\n  loop_control:\n    loop_var: ahs_var\n  with_items:\n    - ahs_item1\n    - ahs_item2\n    - ahs_item3<\/code><\/pre>\n<p><\/p>\n<h3 id=\"avoid-hashes-dictionaries-use-flat-structure\">V\u00e4ltige hash-dictionary, kasutage tasapinnalist struktuuri.<\/h3>\n<p><\/p>\n<p>Kui roll ootab hash\/dictionary \u00fches parameetris, siis kui me soovime muuta \u00fchte alamparameetrit, tuleb meil \u00fcmber m\u00e4\u00e4rata kogu hash\/dictionary, mis suurendab konfigureerimise keerukust.<\/p>\n<p><\/p>\n<p><strong>HALB<\/strong>: Kasutage hash\/dictionary.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nuser:\n  name: admin\n  group: admin<\/code><\/pre>\n<p><\/p>\n<p><strong>HEA<\/strong>: Kasutage tasapinnalist muutuja struktuuri.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nuser_name: admin\nuser_group: &quot;{{ user_name }}&quot;<\/code><\/pre>\n<p><\/p>\n<h3 id=\"create-idempotent-playbooks--roles\">Looge idempotentsed m\u00e4ngud ja rollid.<\/h3>\n<p><\/p>\n<p>Rollid ja m\u00e4ngud peavad olema idempotentsed, kuna see v\u00e4hendab konfiguratsiooni h\u00e4lvet ja hirmu midagi rikkuda. Kuid kui kasutate molecule'i, on see vaikimisi k\u00e4itumine.<\/p>\n<p><\/p>\n<h3 id=\"avoid-using-command-shell-modules\">V\u00e4ltige k\u00e4su shell moodulite kasutamist.<\/h3>\n<p><\/p>\n<p>Shell mooduli kasutamine viib imperatiivse kirjeldusparadigmini, selle asemel, et deklaratiivne, mis on Ansible'i p\u00f5hiolemus.<\/p>\n<p><\/p>\n<h3 id=\"test-your-roles-via-molecule\">Testige oma rolle via molecule.<\/h3>\n<p><\/p>\n<p>Molecule on paindlik lahendus; vaatame m\u00f5ningaid stsenaariume.<\/p>\n<p><\/p>\n<h4 id=\"molecule-multiple-instances\">Molecule mitmed instantsid<\/h4>\n<p><\/p>\n<p>V <code>molecule.yml<\/code> jaotises <code>platvormid<\/code> saab kirjeldada mitmeid hoste, mida turvata.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n    draiver:\n      nimi: docker\n    platvormid:\n      - nimi: postgresql-instance\n        hostinimi: postgresql-instance\n        pilt: registry.example.com\/postgres10:latest\n        eelnevalt_loodud_pilt: jah\n        \u00fclekirjutamise_k\u00e4sk: vale\n        v\u00f5rgu_re\u017eiim: host\n      - nimi: app-instance\n        hostinimi: app-instance\n        eelnevalt_loodud_pilt: jah\n        pilt: registry.example.com\/docker_centos_ansible_tests\n        v\u00f5rgu_re\u017eiim: host<\/code><\/pre>\n<p><\/p>\n<p>Seega neid hoste saab hiljem <code>converge.yml<\/code> kasutada:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- nimi: \u00dchenda k\u00f5ik\n  hostid: k\u00f5ik\n  muutujad:\n    ansible_kasutaja: root\n  rollid:\n    - roll: some_role\n\n- nimi: \u00dchenda db\n  hostid: db-instance\n  rollid:\n    - roll: some_db_role\n\n- nimi: \u00dchenda rakendus\n  hostid: app-instance\n  rollid:\n    - roll: some_app_role<\/code><\/pre>\n<p><\/p>\n<h4 id=\"ansible-verifier\">Ansible'i verifikaator<\/h4>\n<p><\/p>\n<p>Molecule'is on v\u00f5imalik kasutada ansible'i, et kontrollida, kas instants on \u00f5igesti seadistatud; see on alates 3. versioonist vaikes\u00e4tetes. See ei ole nii paindlik kui testinfra\/inspec, kuid saab kontrollida, kas faili sisu vastab meie ootustele:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Verify\n  hosts: all\n  tasks:\n    - name: copy config\n      copy:\n        src: expected_standalone.conf\n        dest: \/root\/wildfly\/bin\/standalone.conf\n        mode: &quot;0644&quot;\n        owner: root\n        group: root\n      register: config_copy_result\n\n    - name: Certify that standalone.conf changed\n      assert:\n        that: not config_copy_result.changed<\/code><\/pre>\n<p><\/p>\n<p>V\u00f5i k\u00e4ivitada teenuse, oodata selle saadavust ja teha smoke test:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n  - name: Kontrolli\n    hosts: solr\n    tasks:\n      - command: \/blah\/solr\/bin\/solr start -s \/solr_home -p 8983 -force\n      - uri:\n          url: http:\/\/127.0.0.1:8983\/solr\n          method: GET\n          status_code: 200\n        register: uri_result\n        until: uri_result is not failed\n        retries: 12\n        delay: 10\n      - name: Postita dokumendid solr'i\n        command: \/blah\/solr\/bin\/post -c master \/exampledocs\/books.csv<\/code><\/pre>\n<p><\/p>\n<h3 id=\"put-complex-logic-into-modules--plugins\">Pane keeruline loogika moodulitesse ja pistikprogrammidesse<\/h3>\n<p><\/p>\n<p>Ansible propageerib deklaratiivset l\u00e4henemist, seega kui teete koodis haruk\u00e4ike, andmete transformatsioone, shell mooduleid, siis kood muutub raskesti loetavaks. Et selle vastu v\u00f5idelda ja muuta see arusaadavamaks, on hea praktika seda keerukust \u00fcletada oma moodulite loomisega.<\/p>\n<p><\/p>\n<h3 id=\"summarize-tips--tricks\">Kokkuv\u00f5te n\u00e4pun\u00e4idetest ja nippidest<\/h3>\n<p><\/p>\n<ol>\n<li>V\u00e4ltige globaalmuutujate kasutamist.<\/li>\n<li>Eelista rollimuutujatele eesliiteid.<\/li>\n<li>Kasutage ts\u00fckli juhtimismuutujat.<\/li>\n<li>Kontrollige sisendmuutujaid.<\/li>\n<li>V\u00e4ltige hash-s\u00f5nastikke, kasutage staatilist struktuuri.<\/li>\n<li>Looge idempotentsed m\u00e4ngukavad ja rollid.<\/li>\n<li>V\u00e4ltige k\u00e4surea moodulite kasutamist.<\/li>\n<li>Testige oma rolle molekuliga.<\/li>\n<li>Pane keeruline loogika moodulitesse ja pistikprogrammidesse.<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h2>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"How to start testing Ansible, refactor a project in a year, and not lose your mind.\" src=\"\/wp-content\/uploads\/2020\/05\/c52a13f6ba5500fce506fb0d448b496e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ei saa lihtsalt v\u00f5tta ja refaktoreerida infrastruktuuri projektis, isegi kui teil on IaC. See on pikk protsess, mis n\u00f5uab kannatlikkust, aega ja teadmisi.<\/p>\n<p><\/p>\n<h2 id=\"links\">Lingid<\/h2>\n<p><\/p>\n<ul>\n<li>Esitlused <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.mail.ru\/public\/266x\/3hJ2mQBzf\">How to test Ansible and don&#8217;t go nuts<\/a><\/noindex><\/li>\n<li>Video <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=GdrJv5oypfg\">How to test Ansible and don&#8217;t go nuts<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/467171\">Mida ma \u00f5ppisin, testides 200 000 rida infrastruktuuri koodi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/500040\/\">Ansible: Konfiguratsiooni migreerimine 120 VM Coreoselt Centos'ele 18 kuuga<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/342216\/\">Kuidas katsetada oma distributsiooni saamata samal ajal jalgrataste purunemist<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/437004\/\">Test me if you can, or do YML programmers dream of testing ansible?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ultral\/awesome-iac-testing\">Loetelu suurep\u00e4rastest IaC testimise artiklitest, k\u00f5nelekstidest ja linkidest<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.goncharov.xyz\/it\/ansible-testing-ru.html\">krossipost<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/500226\/\">Inglise versioon<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p><strong>UPD1 2020.05.01 20:30<\/strong> \u2014 Esimese plaanide profileerimise jaoks saab kasutada <code>callback_whitelist = profile_tasks<\/code> et m\u00f5ista, mis t\u00e4pselt kaua kestab. Seej\u00e4rel vaatame \u00fcle <noindex><a rel=\"nofollow\" href=\"https:\/\/shadow-soft.com\/turbo-charge-your-ansible\/\">ansible'i kiirusmeetodid<\/a><\/noindex>. Saame proovida <noindex><a rel=\"nofollow\" href=\"https:\/\/mitogen.networkgenomics.com\/ansible_detailed.html\">mitogen<\/a><\/noindex><br \/>\n<strong>UPD2 2020.05.03 16:34<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/500226\/\">Inglise versioon<\/a><\/noindex><\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/500058\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 DevOps-40 2020-03-18: \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f legacy, \u0442.\u043a. \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0443\u043c\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u043f\u043b\u043e\u0445\u043e, \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0427\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 Infrastructure as Code. \u0414\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u0430\u043a \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c Ansible \u0437\u0430 \u0433\u043e\u0434 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80306,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80305","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 DevOps-40 2020-03-18: \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f legacy, \u0442.\u043a. \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0443\u043c\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u043f\u043b\u043e\u0445\u043e, \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0427\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 Infrastructure as Code. \u0414\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u0430\u043a \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c Ansible \u0437\u0430 \u0433\u043e\u0434 \u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c Ansible, \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0437\u0430 \u0433\u043e\u0434 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0442\u0435\u0442\u044c \u0441 \u043a\u0430\u0442\u0443\u0448\u0435\u043a | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 DevOps-40 2020-03-18: \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f legacy, \u0442.\u043a. \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0443\u043c\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u043f\u043b\u043e\u0445\u043e, \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0427\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 Infrastructure as Code. \u0414\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u0430\u043a \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c Ansible \u0437\u0430 \u0433\u043e\u0434 \u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek\" \/>\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-05-04T23:42:50+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-04T23:42:50+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\udd47Kuidas alustada Ansible'i testimist, refaktoorida projekti aastaga ja mitte k\u00fcllalt palju m\u00e4ssama minna | ProHoster","description":"See on esitlus DevOps-40 le 2020-03-18: Alates teisest commit'ist muutub iga kood legacy'ks, kuna algsed ideed hakkavad lahknema karmist reaalsusest. See ei ole hea ega halb, see on tegelikkus, millega on raske vaielda ja millega tuleb koos eksisteerida. Selle protsessi osa on refaktoorimine. Infrastruktuuri koodi refaktoorimine. Olgu see aluseks, kuidas refaktoorida Ansible'i aastaga ja","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c Ansible, \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0437\u0430 \u0433\u043e\u0434 \u0438 \u043d\u0435 \u0441\u043b\u0435\u0442\u0435\u0442\u044c \u0441 \u043a\u0430\u0442\u0443\u0448\u0435\u043a | ProHoster","og:description":"\u042d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 DevOps-40 2020-03-18: \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f legacy, \u0442.\u043a. \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0443\u043c\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441 \u0441\u0443\u0440\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u043d\u0435 \u043f\u043b\u043e\u0445\u043e, \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0427\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. \u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 Infrastructure as Code. \u0414\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043a\u0430\u043a \u043e\u0442\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c Ansible \u0437\u0430 \u0433\u043e\u0434 \u0438","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-nachat-testirovat-ansible-otrefaktorit-proekt-za-god-i-ne-sletet-s-katushek","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-05-04T23:42:50+00:00","article:modified_time":"2020-05-04T23:42:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80305","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 16:20:41","updated":"2022-09-29 15:21:39"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/80305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=80305"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/80305\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/80306"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=80305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=80305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=80305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}