Bakalaacuteřskaacute praacutece
Českeacutevysokeacuteučeniacute technickeacutev Praze
F3 Fakulta elektrotechnickaacuteKatedra počiacutetačů
Automatickaacute spraacuteva laboratoře sOS Windows pomociacute technologiePuppet
Jan ŠtěpaacutenekSoftwaroveacute technologie a management
Květen 2016Vedouciacute praacutece Ing Ondřej Votava
Poděkovaacuteniacute ProhlaacutešeniacuteRaacuted bych poděkoval vedouciacutemu praacutece
panu Ing Ondřeji Votavovi za trpělivosta vstřiacutecnost při tvorbě teacuteto praacutece panuAleši Kapicovi za jeho rady a konzulta-ce při implementaci praacutece V neposledniacuteřadě děkuji myacutem přaacutetelům a rodině zapodporu po celou dobu meacuteho studia
Prohlašuji že jsem předloženou praacutecivypracoval samostatně a že jsem uvedlveškereacute použiteacute informačniacute zdroje v sou-ladu s Metodickyacutem pokynem o dodržo-vaacuteniacute etickyacutech principů při přiacutepravě vy-sokoškolskyacutech zaacutevěrečnyacutech praciacute
V Praze dne 10 5 2016
v
Abstrakt AbstractTato praacutece se zabyacutevaacute problemati-
kou automatizovaneacute spraacutevy počiacutetačů soperačniacutem systeacutemem Windows pomociacutetechnologie Puppet Ciacutelem je před-stavit technologii Puppet možnostispraacutevy operačniacuteho systeacutemu Windowsa navrhnout pracovniacute postup diacutekyktereacutemu lze Puppet udržitelně a sys-tematicky provozovat Součaacutestiacute praacuteceje teacutež implementace spraacutevy vybranyacutechzdrojů operačniacuteho systeacutemu Windows vtestovaciacutem prostřediacute
Kliacutečovaacute slova Puppet spraacuteva počiacute-tačoveacute infrastruktury bakalaacuteřskaacute zaacutevě-rečnaacute praacutece
This thesis focuses on how to managecomputer infrastructure with Windowsoperating system using Puppet technol-ogy The goal of this work is to intro-duce Puppet technology various Pup-petrsquos capabilities of Windows manage-ment and to propose workflow for in-frastructure implementation and furthersystematic development This work in-cludes implementation of managementof various Windows resources in test en-vironment
Keywords Puppet computer in-frastructure management bachelor the-sis
Title translation Automatic man-agement of pc laboratory with OSWindows based on Puppet technology
vi
Obsah 1 Uacutevod 111 Osobniacute motivace 1
2 Představeniacute naacutestroje Puppet 221 Co to je CM tool 2
211 Jazyk konfiguračniacutehosouboru 2
212 Styl programovaacuteniacute kon-figurace 2
213 Nastaveniacute klientskeacutehostroje 3
214 Distribučniacute model pull push 3
215 Idempotence 322 Puppet 3
221 Open Source Puppetvs Puppet Enterprise 4
23 Slovniacuteček pojmů z prostřediacutePuppet 4
Agent Node 4Master 4Manifest 4Modul 4Katalog 4
24 Dvě varianty architekturyPuppet infrastruktury 5
25 Zdroje Puppetu jako zaacuteklad-niacute prvky ovlaacutedaacuteniacute systeacutemu 6
26 Podporovaneacute platformy 627 Jak ziacuteskat Puppet 728 Proč jsem vybral Puppet 7
3 Multiplatformniacute Puppet 831 Soubory 832 Uživateleacute a skupiny uživatelů 933 Služby 934 Zaacuteznamy hosts 935 Instalace programů 936 Reboot 937 Spouštěniacute vlastniacuteho přiacutekazu 938 Plaacutenovaneacute uacutelohy 1039 Windows registry 10
310 Active Directory 103101 Spraacuteva Active Directory 103102 Modul domainndash
membership 103103 Modul acl 11
3104 Dalšiacute moduly pro ovlaacute-daacuteniacute prostřediacute Windows 11
4 Testovaacuteniacute 1241 Statickaacute kotrola koacutedu 1242 Unit testy 1243 Akceptačniacute testy 1244 Test Driven Development 13
5 Testovaciacute prostřediacute AWS 1451 Požadavky na virtualizačniacute
platformu 1452 Amazon Web services 1553 Služby AWS 15
531 VPC 15532 EC2 15533 Route53 16
6 Workflow 1761 Spraacuteva externiacutech modulů 17
611 Puppet module 17612 Git Submodule 17613 Puppetfile 17
62 Udržovaacuteniacute konfigurace veverzovaciacutem systeacutemu 18
63 Puppet Environments 1864 r10k 18
7 Implementace 2071 Specifikace uacutelohy 2072 Vyacuteběr technologiiacute 2073 Vyacutevojoveacute prostřediacute 20
731 Psaniacute Puppet koacutedu 23732 Navaacutezaacuteniacute komunikace
agentů s masterem 23733 Nasazeniacute koacutedu na vyacute-
vojoveacute prostřediacute 2374 Vyacuteslednaacute konfigurace 23
741 Modul students 24742 Modul classroomx
programs 24743 Modul classroomx
test 258 Otestovaacuteniacute funkčnosti imple-
mentace 2681 Unit testy 2682 Akceptačniacute testy 2783 Testovaacuteniacute struktury vyacutevojo-
veacuteho prostřediacute 2884 Dedikovaneacute testovaciacute stroje 29
vii
841 Rozděleniacute testů naWindows a Unix 29
85 Test driven development 3086 Vyacutesledky testů 30
861 Vyacutesledky testů siacuteťoveacuteinfrastruktury 30
862 Vyacutesledky testů testo-vaciacutech strojů 31
863 Vyacutesledky testů agentů 31864 Ukaacutezka reportovaciacuteho
naacutestroje rspec 319 Zaacutevěr 34
Literatura 35A Slovniacuteček 39
viii
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Poděkovaacuteniacute ProhlaacutešeniacuteRaacuted bych poděkoval vedouciacutemu praacutece
panu Ing Ondřeji Votavovi za trpělivosta vstřiacutecnost při tvorbě teacuteto praacutece panuAleši Kapicovi za jeho rady a konzulta-ce při implementaci praacutece V neposledniacuteřadě děkuji myacutem přaacutetelům a rodině zapodporu po celou dobu meacuteho studia
Prohlašuji že jsem předloženou praacutecivypracoval samostatně a že jsem uvedlveškereacute použiteacute informačniacute zdroje v sou-ladu s Metodickyacutem pokynem o dodržo-vaacuteniacute etickyacutech principů při přiacutepravě vy-sokoškolskyacutech zaacutevěrečnyacutech praciacute
V Praze dne 10 5 2016
v
Abstrakt AbstractTato praacutece se zabyacutevaacute problemati-
kou automatizovaneacute spraacutevy počiacutetačů soperačniacutem systeacutemem Windows pomociacutetechnologie Puppet Ciacutelem je před-stavit technologii Puppet možnostispraacutevy operačniacuteho systeacutemu Windowsa navrhnout pracovniacute postup diacutekyktereacutemu lze Puppet udržitelně a sys-tematicky provozovat Součaacutestiacute praacuteceje teacutež implementace spraacutevy vybranyacutechzdrojů operačniacuteho systeacutemu Windows vtestovaciacutem prostřediacute
Kliacutečovaacute slova Puppet spraacuteva počiacute-tačoveacute infrastruktury bakalaacuteřskaacute zaacutevě-rečnaacute praacutece
This thesis focuses on how to managecomputer infrastructure with Windowsoperating system using Puppet technol-ogy The goal of this work is to intro-duce Puppet technology various Pup-petrsquos capabilities of Windows manage-ment and to propose workflow for in-frastructure implementation and furthersystematic development This work in-cludes implementation of managementof various Windows resources in test en-vironment
Keywords Puppet computer in-frastructure management bachelor the-sis
Title translation Automatic man-agement of pc laboratory with OSWindows based on Puppet technology
vi
Obsah 1 Uacutevod 111 Osobniacute motivace 1
2 Představeniacute naacutestroje Puppet 221 Co to je CM tool 2
211 Jazyk konfiguračniacutehosouboru 2
212 Styl programovaacuteniacute kon-figurace 2
213 Nastaveniacute klientskeacutehostroje 3
214 Distribučniacute model pull push 3
215 Idempotence 322 Puppet 3
221 Open Source Puppetvs Puppet Enterprise 4
23 Slovniacuteček pojmů z prostřediacutePuppet 4
Agent Node 4Master 4Manifest 4Modul 4Katalog 4
24 Dvě varianty architekturyPuppet infrastruktury 5
25 Zdroje Puppetu jako zaacuteklad-niacute prvky ovlaacutedaacuteniacute systeacutemu 6
26 Podporovaneacute platformy 627 Jak ziacuteskat Puppet 728 Proč jsem vybral Puppet 7
3 Multiplatformniacute Puppet 831 Soubory 832 Uživateleacute a skupiny uživatelů 933 Služby 934 Zaacuteznamy hosts 935 Instalace programů 936 Reboot 937 Spouštěniacute vlastniacuteho přiacutekazu 938 Plaacutenovaneacute uacutelohy 1039 Windows registry 10
310 Active Directory 103101 Spraacuteva Active Directory 103102 Modul domainndash
membership 103103 Modul acl 11
3104 Dalšiacute moduly pro ovlaacute-daacuteniacute prostřediacute Windows 11
4 Testovaacuteniacute 1241 Statickaacute kotrola koacutedu 1242 Unit testy 1243 Akceptačniacute testy 1244 Test Driven Development 13
5 Testovaciacute prostřediacute AWS 1451 Požadavky na virtualizačniacute
platformu 1452 Amazon Web services 1553 Služby AWS 15
531 VPC 15532 EC2 15533 Route53 16
6 Workflow 1761 Spraacuteva externiacutech modulů 17
611 Puppet module 17612 Git Submodule 17613 Puppetfile 17
62 Udržovaacuteniacute konfigurace veverzovaciacutem systeacutemu 18
63 Puppet Environments 1864 r10k 18
7 Implementace 2071 Specifikace uacutelohy 2072 Vyacuteběr technologiiacute 2073 Vyacutevojoveacute prostřediacute 20
731 Psaniacute Puppet koacutedu 23732 Navaacutezaacuteniacute komunikace
agentů s masterem 23733 Nasazeniacute koacutedu na vyacute-
vojoveacute prostřediacute 2374 Vyacuteslednaacute konfigurace 23
741 Modul students 24742 Modul classroomx
programs 24743 Modul classroomx
test 258 Otestovaacuteniacute funkčnosti imple-
mentace 2681 Unit testy 2682 Akceptačniacute testy 2783 Testovaacuteniacute struktury vyacutevojo-
veacuteho prostřediacute 2884 Dedikovaneacute testovaciacute stroje 29
vii
841 Rozděleniacute testů naWindows a Unix 29
85 Test driven development 3086 Vyacutesledky testů 30
861 Vyacutesledky testů siacuteťoveacuteinfrastruktury 30
862 Vyacutesledky testů testo-vaciacutech strojů 31
863 Vyacutesledky testů agentů 31864 Ukaacutezka reportovaciacuteho
naacutestroje rspec 319 Zaacutevěr 34
Literatura 35A Slovniacuteček 39
viii
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Abstrakt AbstractTato praacutece se zabyacutevaacute problemati-
kou automatizovaneacute spraacutevy počiacutetačů soperačniacutem systeacutemem Windows pomociacutetechnologie Puppet Ciacutelem je před-stavit technologii Puppet možnostispraacutevy operačniacuteho systeacutemu Windowsa navrhnout pracovniacute postup diacutekyktereacutemu lze Puppet udržitelně a sys-tematicky provozovat Součaacutestiacute praacuteceje teacutež implementace spraacutevy vybranyacutechzdrojů operačniacuteho systeacutemu Windows vtestovaciacutem prostřediacute
Kliacutečovaacute slova Puppet spraacuteva počiacute-tačoveacute infrastruktury bakalaacuteřskaacute zaacutevě-rečnaacute praacutece
This thesis focuses on how to managecomputer infrastructure with Windowsoperating system using Puppet technol-ogy The goal of this work is to intro-duce Puppet technology various Pup-petrsquos capabilities of Windows manage-ment and to propose workflow for in-frastructure implementation and furthersystematic development This work in-cludes implementation of managementof various Windows resources in test en-vironment
Keywords Puppet computer in-frastructure management bachelor the-sis
Title translation Automatic man-agement of pc laboratory with OSWindows based on Puppet technology
vi
Obsah 1 Uacutevod 111 Osobniacute motivace 1
2 Představeniacute naacutestroje Puppet 221 Co to je CM tool 2
211 Jazyk konfiguračniacutehosouboru 2
212 Styl programovaacuteniacute kon-figurace 2
213 Nastaveniacute klientskeacutehostroje 3
214 Distribučniacute model pull push 3
215 Idempotence 322 Puppet 3
221 Open Source Puppetvs Puppet Enterprise 4
23 Slovniacuteček pojmů z prostřediacutePuppet 4
Agent Node 4Master 4Manifest 4Modul 4Katalog 4
24 Dvě varianty architekturyPuppet infrastruktury 5
25 Zdroje Puppetu jako zaacuteklad-niacute prvky ovlaacutedaacuteniacute systeacutemu 6
26 Podporovaneacute platformy 627 Jak ziacuteskat Puppet 728 Proč jsem vybral Puppet 7
3 Multiplatformniacute Puppet 831 Soubory 832 Uživateleacute a skupiny uživatelů 933 Služby 934 Zaacuteznamy hosts 935 Instalace programů 936 Reboot 937 Spouštěniacute vlastniacuteho přiacutekazu 938 Plaacutenovaneacute uacutelohy 1039 Windows registry 10
310 Active Directory 103101 Spraacuteva Active Directory 103102 Modul domainndash
membership 103103 Modul acl 11
3104 Dalšiacute moduly pro ovlaacute-daacuteniacute prostřediacute Windows 11
4 Testovaacuteniacute 1241 Statickaacute kotrola koacutedu 1242 Unit testy 1243 Akceptačniacute testy 1244 Test Driven Development 13
5 Testovaciacute prostřediacute AWS 1451 Požadavky na virtualizačniacute
platformu 1452 Amazon Web services 1553 Služby AWS 15
531 VPC 15532 EC2 15533 Route53 16
6 Workflow 1761 Spraacuteva externiacutech modulů 17
611 Puppet module 17612 Git Submodule 17613 Puppetfile 17
62 Udržovaacuteniacute konfigurace veverzovaciacutem systeacutemu 18
63 Puppet Environments 1864 r10k 18
7 Implementace 2071 Specifikace uacutelohy 2072 Vyacuteběr technologiiacute 2073 Vyacutevojoveacute prostřediacute 20
731 Psaniacute Puppet koacutedu 23732 Navaacutezaacuteniacute komunikace
agentů s masterem 23733 Nasazeniacute koacutedu na vyacute-
vojoveacute prostřediacute 2374 Vyacuteslednaacute konfigurace 23
741 Modul students 24742 Modul classroomx
programs 24743 Modul classroomx
test 258 Otestovaacuteniacute funkčnosti imple-
mentace 2681 Unit testy 2682 Akceptačniacute testy 2783 Testovaacuteniacute struktury vyacutevojo-
veacuteho prostřediacute 2884 Dedikovaneacute testovaciacute stroje 29
vii
841 Rozděleniacute testů naWindows a Unix 29
85 Test driven development 3086 Vyacutesledky testů 30
861 Vyacutesledky testů siacuteťoveacuteinfrastruktury 30
862 Vyacutesledky testů testo-vaciacutech strojů 31
863 Vyacutesledky testů agentů 31864 Ukaacutezka reportovaciacuteho
naacutestroje rspec 319 Zaacutevěr 34
Literatura 35A Slovniacuteček 39
viii
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Obsah 1 Uacutevod 111 Osobniacute motivace 1
2 Představeniacute naacutestroje Puppet 221 Co to je CM tool 2
211 Jazyk konfiguračniacutehosouboru 2
212 Styl programovaacuteniacute kon-figurace 2
213 Nastaveniacute klientskeacutehostroje 3
214 Distribučniacute model pull push 3
215 Idempotence 322 Puppet 3
221 Open Source Puppetvs Puppet Enterprise 4
23 Slovniacuteček pojmů z prostřediacutePuppet 4
Agent Node 4Master 4Manifest 4Modul 4Katalog 4
24 Dvě varianty architekturyPuppet infrastruktury 5
25 Zdroje Puppetu jako zaacuteklad-niacute prvky ovlaacutedaacuteniacute systeacutemu 6
26 Podporovaneacute platformy 627 Jak ziacuteskat Puppet 728 Proč jsem vybral Puppet 7
3 Multiplatformniacute Puppet 831 Soubory 832 Uživateleacute a skupiny uživatelů 933 Služby 934 Zaacuteznamy hosts 935 Instalace programů 936 Reboot 937 Spouštěniacute vlastniacuteho přiacutekazu 938 Plaacutenovaneacute uacutelohy 1039 Windows registry 10
310 Active Directory 103101 Spraacuteva Active Directory 103102 Modul domainndash
membership 103103 Modul acl 11
3104 Dalšiacute moduly pro ovlaacute-daacuteniacute prostřediacute Windows 11
4 Testovaacuteniacute 1241 Statickaacute kotrola koacutedu 1242 Unit testy 1243 Akceptačniacute testy 1244 Test Driven Development 13
5 Testovaciacute prostřediacute AWS 1451 Požadavky na virtualizačniacute
platformu 1452 Amazon Web services 1553 Služby AWS 15
531 VPC 15532 EC2 15533 Route53 16
6 Workflow 1761 Spraacuteva externiacutech modulů 17
611 Puppet module 17612 Git Submodule 17613 Puppetfile 17
62 Udržovaacuteniacute konfigurace veverzovaciacutem systeacutemu 18
63 Puppet Environments 1864 r10k 18
7 Implementace 2071 Specifikace uacutelohy 2072 Vyacuteběr technologiiacute 2073 Vyacutevojoveacute prostřediacute 20
731 Psaniacute Puppet koacutedu 23732 Navaacutezaacuteniacute komunikace
agentů s masterem 23733 Nasazeniacute koacutedu na vyacute-
vojoveacute prostřediacute 2374 Vyacuteslednaacute konfigurace 23
741 Modul students 24742 Modul classroomx
programs 24743 Modul classroomx
test 258 Otestovaacuteniacute funkčnosti imple-
mentace 2681 Unit testy 2682 Akceptačniacute testy 2783 Testovaacuteniacute struktury vyacutevojo-
veacuteho prostřediacute 2884 Dedikovaneacute testovaciacute stroje 29
vii
841 Rozděleniacute testů naWindows a Unix 29
85 Test driven development 3086 Vyacutesledky testů 30
861 Vyacutesledky testů siacuteťoveacuteinfrastruktury 30
862 Vyacutesledky testů testo-vaciacutech strojů 31
863 Vyacutesledky testů agentů 31864 Ukaacutezka reportovaciacuteho
naacutestroje rspec 319 Zaacutevěr 34
Literatura 35A Slovniacuteček 39
viii
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
841 Rozděleniacute testů naWindows a Unix 29
85 Test driven development 3086 Vyacutesledky testů 30
861 Vyacutesledky testů siacuteťoveacuteinfrastruktury 30
862 Vyacutesledky testů testo-vaciacutech strojů 31
863 Vyacutesledky testů agentů 31864 Ukaacutezka reportovaciacuteho
naacutestroje rspec 319 Zaacutevěr 34
Literatura 35A Slovniacuteček 39
viii
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Tabulky Obraacutezky81 Vyacutesledky unit testů modulu
awsvpc 3082 Vyacutesledky akceptačniacutech testů
modulu awsvpc 3183 Vyacutesledky akceptačniacutech tes-
tů modulu awsvpc ndash siacuteťovaacutekomunikace 31
84 Vyacutesledky akceptačniacutech testůkonfigurace testovaciacutech strojů 31
85 Vyacutesledky unit testů modulustudents 32
86 Vyacutesledky unit testů moduluclassroomtest 32
87 Vyacutesledky unit testů moduluclassroomprograms 32
88 Vyacutesledky akceptačniacutech testůPuppet agentů 33
21 Komunikace mezi puppetagentem a masterem 5
22 Zdroje puppet 623 Obliacutebenost CM naacutestrojů 771 Diagram vyacutevojoveacuteho prostře-
diacute v AWS 2181 Report běhu rspec testu 33
ix
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 1Uacutevod
V teacuteto praacuteci představiacutem způsob jak pomociacute Infrastructure as Code (IaC) spravovat po-čiacutetačovou infrastrukturu Představiacutem naacutestroj Puppet jako naacutestroj IaC pro automatizacikonfigurace a kraacutetce srovnaacutem vybraneacute alternativniacute naacutestroje
V dalšiacute čaacutesti praacutece podrobně rozeberu možnosti Puppetu pro konfiguraci operačniacutehosysteacutemu Windows V prostřediacute Windows existujiacute nativniacute naacutestroje pro spraacutevu konfigu-race ndash zejmeacutena domeacutena Active Directory a Powershell DSC Puppet zde představujezajiacutemavou opensource alternativu
V samostatneacute kapitole se budu věnovat problematice automatickyacutech testů ProtožePuppet využiacutevaacute konfiguraci definovanou pomociacute zdrojoveacuteho koacutedu lze tento koacuted velmipečlivě testovat na různyacutech uacuterovniacutech
Nakonec představiacutem konkreacutetniacute implementaci konfigurace v testovaciacutem prostřediacute
11 Osobniacute motivaceNejprve se musiacutem přiznat že jsem dušiacute programaacutetor - nikoliv systeacutemovyacute administraacute-tor Proto mě teacutema IaC velice zaujalo jako způsob jak vneacutest programaacutetorskeacute naacutevykydo světa konfigurace počiacutetačů Jako programaacutetoři se snažiacuteme do našiacute praacutece zanaacutešetstandardy Učiacuteme se naacutevrhoveacute vzory učiacuteme se pomociacute agilniacutech vyacutevojovyacutech metod leacutepea efektivněji doručovat software našim zaacutekazniacutekům učiacuteme se pomociacute automatickyacutechtestů kontrolovat kvalitu softwaru učiacuteme se pomociacute refaktoru naacuteš software vylepšovatTo vše můžeme pomociacute IaC použiacutet i při konfiguraci počiacutetačoveacute infrastruktury
1
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 2Představeniacute naacutestroje Puppet
Puppet je naacutestroj pro spraacutevu konfigurace ndash v anglicky psaneacute literatuře se takoveacute naacutestrojeoznačujiacute jako CM Tools nebo CCA tools
Takovyacutech naacutestrojů je celaacute řada a v teacuteto kapitole bych čtenaacuteře raacuted seznaacutemil s obecnyacutemivlastnostmi těchto naacutestrojů a takeacute s odlišnostmi diacuteky kteryacutem si můžeme vybrat naacutestrojpřesně podle našich požadavků
21 Co to je CM toolNaacutestroje pro spraacutevu konfigurace lze obecně charakterizovat jako programy ktereacute pomociacutekonfiguračniacuteho souboru provaacutedějiacute změny konfigurace na vzdaacutelenyacutech strojiacutech Takovyacutechprogramů je celaacute řada a obecně nelze řiacuteci kteryacute je lepšiacute nebo horšiacute Je třeba vždy uvaacutežitvyacuteběr naacutestroje pro konkreacutetniacute použitiacute V naacutesledujiacuteciacutech podkapitolaacutech uvedu zaacutekladniacuterozdiacutely mezi zmiacuteněnyacutemi programy
Lišiacute se samozřejmě v jazyku tohoto konfiguračniacuteho souboru daacutele se mohou lišit vsysteacutemu distribuce konfigurace na ovlaacutedaneacute stroje a takeacute ve způsobu jak konfiguracina ovlaacutedanyacutech strojiacutech aplikujiacute
211 Jazyk konfiguračniacuteho souboruPři vyacuteběru konfiguračniacuteho naacutestroje si zaacuteroveň vybiacuteraacuteme v jakeacutem jazyce budeme psaacutetvlastniacute konfiguraci Každyacute naacutestroj vychaacuteziacute z nějakeacuteho tradičniacuteho programovaciacuteho ja-zyka namaacutetkouPuppet Chef [1] - RubyAnsible - Python
Při vyacuteběru vhodneacuteho naacutestroje se tedy můžeme řiacutedit našiacute preferenciacute daneacuteho progra-movaciacuteho prostřediacute
212 Styl programovaacuteniacute konfiguraceCM tools naacutem daacutevaji na vyacuteběr mezi dvěma styly programovaacuteniacutedeklarativniacute programovaacuteniacute - řiacutekaacuteme jak maacute vypadat stroj po aplikovaacuteniacute konfigurace
(napřiacuteklad Puppet) imperativniacute programovaacuteniacute - řiacutekaacuteme co maacute stroj udělat aby požadovaneacute konfiguracedosaacutehl (napřiacuteklad Chef)
Nutno podotknout že mezi těmito styly programovaacuteniacute neniacute jeden lepšiacute než druhyacuteJde o osobniacute preferenci administraacutetora v jakeacutem stylu se mu bude leacutepe uvažovat [2]
2
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
22 Puppet
213 Nastaveniacute klientskeacuteho strojeOvlaacutedanyacute stroj musiacute byacutet vždy nějak nastaven aby se k němu mohl CM tool připojit akomunikovat s niacutem Rozdiacutely jsou zejmeacutena v rozsahu tohoto prvotniacuteho nastaveniacute Puppetvyžaduje na ovlaacutedaneacutem stroji nainstalovanyacute svůj klientskyacute program puppet zatiacutemconapřiacuteklad naacutestroj Ansible si vystačiacute s prostyacutem ssh připojeniacutem a na ovlaacutedaneacutem strojižaacutednyacute klientskyacute software nepotřebuje [3]
Tyto rozdiacutely určujiacute zejmeacutena počaacutetečniacute investici do zavedeniacute automatizovaneacute in-frastruktury ndash některeacute naacutestroje jsou komplikovanějšiacute na instalaci než jineacute
214 Distribučniacute model pull pushMaacuteme na vyacuteběr ze dvou zaacutekladniacutech distribučniacutech modelů V obou existuje centraacutelniacuteprvek kteryacute obsahuje připravenou konfiguraci prostřediacutePush model - centraacutelniacute prvek saacutem aktivně ovlaacutedaacute klientskeacute stroje a přikazuje jim
aby provedly konfiguraci (přiacuteklad Ansible ve vyacutechoziacutem nastaveniacute) Zajiacutemaveacute na tomtomodelu je že musiacute byacutet dopředu jasneacute jakeacute stroje se budou konfigurace uacutečastnit Jinakby centraacutelniacute prvek nevěděl jakeacute stroje maacute ovlaacutedatPull model - o konfiguraci žaacutedajiacute klientskeacute stroje a centraacutelniacute prvek je na vyžaacutedaacuteniacuteobsluhuje (přiacuteklad Puppet) Narozdiacutel od pull modelu zde centraacutelniacute prvek nepotřebujedopředu vědět jakeacute konkreacutetniacute stroje bude konfigurovat
215 IdempotenceVšechny zde zmiacuteněneacute konfiguračniacute naacutestroje včetně Puppetu aplikujiacute změny konfigu-race idempotentně Tedy opakovanou aplikaciacute konfigurace se stav ovlaacutedaneacuteho strojenezměniacute [4]
Uvažujme napřiacuteklad tuto konfiguraci souboru v jazyku Puppet
file rsquoctempfiletxtrsquoensure =gt presentcontent =gt generated by puppet manifest
Zdroj file neřiacutekaacute že se bude soubor filetxt vytvaacuteřet ale že je třeba zařiacutedit aby vsouboroveacutem systeacutemu byl na určeneacute cestě a se zadanyacutem obsahem To sice může znamenatže bude soubor vytvořen (pokud chybiacute) ale takeacute to může znamenat že se existujiacuteciacutemusouboru změniacute obsah nebo se dokonce nestane vůbec nic (pokud soubor popisu jižodpoviacutedaacute) Povšimněme si parametru ensure ndash tiacutem pouze deklarujeme požadovanyacutestav souboru a nemusiacuteme řešit přesnyacute postup jak se tohoto stavu dosaacutehne
Na zachovaacuteniacute idempotence konfigurace musiacuteme myslet zejmeacutena pokud budeme chtiacutetkonfiguračniacute naacutestroj rozšiřovat o naše vlastniacute funkce nebo pokud budeme potřebovatproveacutest nějakyacute vlastniacute přiacutekaz (zdroj Puppetu exec) V takoveacutem přiacutepadě totiž musiacutemesami zajistit implementaci deklarativniacuteho vyjaacutedřeniacute konfigurace
Vyacuteše zmiacuteněnyacute přiacuteklad v jazyke Puppet je pouze ilustračniacute ndash u ostatniacutech CM naacutestrojůlůje přiacutestup k idempotenci obdobnyacute [5]
22 PuppetPuppet je program pro spraacutevu konfigurace počiacutetačovyacutech systeacutemů Byl vytvořen firmouPuppetLabs v roce 2005 Je napsaacuten v jazyce Ruby a pro psaniacute konfigurace se použiacutevaacutezvlaacuteštniacute DSL jazyk [6] vychaacutezejiacuteciacute praacutevě z ruby
3
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
2 Představeniacute naacutestroje Puppet 221 Open Source Puppet vs Puppet Enterprise
Puppet je vydaacutevaacuten ve dvou verziacutech ndash Open Source Puppet a Puppet Enterprise [7]Zaacutekladniacute verze Puppetu je dostupnaacute pod opensource licenciacute [8] V teacuteto verzi je obsaženavlastniacute implementace jazyka Puppet a všechny nutneacute naacutestroje ke zprovozněniacute Puppetinfrastruktury Veškeryacute popis jazyka prostřediacute i praktickeacute ukaacutezky v teacuteto praacuteci se tyacutekajiacutepraacutevě varianty Open Source Puppet
Jako komerčniacute variantu nabiacuteziacute firma PuppetLabs soubor programů Puppet Enter-prise kteryacute nad raacutemec opensource verze nabiacuteziacute různeacute užitečneacute naacutestroje na zpřiacutejemněniacutea zefektivněniacute použitiacute Puppetu Enterprise verze nabiacuteziacute napřiacuteklad rozsaacutehlejšiacute instalačniacuteprogram nabiacuteziacute připraveneacute grafickeacute rozhraniacute na ovlaacutedaacuteniacute Puppetu reporting o běhuPuppetu a samozřejmě profesionaacutelniacute podporu Kompletniacute vyacutečet nabiacutezenyacutech funkciacute pla-ceneacute verze najdeme na oficiaacutelniacutem webu [9]
23 Slovniacuteček pojmů z prostřediacute Puppet
Agent NodeStroj zapojenyacute do Puppet infrastruktury kteryacute chceme konfigurovat Umiacute konfiguro-vat saacutem sebe pomociacute puppet apply a umiacute se spojit s masterem v raacutemci komunikaceagent - master
MasterStroj zapojenyacute do Puppet infrastruktury kteryacute pro agenty připravuje zkompilovanyacutekatalog
ManifestSoubor s koacutedem Puppetu Obsahuje vlastniacute definici konfigurace
ModulModul je znovupoužitelnaacute kolekce manifestů Obsahuje definice typů virtuaacutelniacutech zdrojůPuppetu soubory a šablony pro běh přiacuteslušneacute konfigurace
Je to kontejner kteryacute zapouzdřuje nějakou samostatnou ucelenou konfiguraci Je tonapřiacuteklad modul pro konfiguraci Apache serveru [10] nebo konfigurace apt [11] pro-gramu v operačniacutem systeacutemu Debian
Moduly si můžeme naprogramovat vlastniacute nebo můžeme využiacutet již připravenyacutech ofici-aacutelniacutech i neoficiaacutelniacutech modulů Oficiaacutelniacute zdroj pro distribuci veřejně dostupnyacutech modulůje portaacutel httpsforgepuppetcom Můžeme zde vyhledaacutevat zveřejněneacute moduly apo přihlaacutešeniacute takeacute vlastniacute moduly nabiacutezet k použitiacute ostatniacutem Nejsme ale zaacutevisliacute jen natomto oficiaacutelniacutem zdroji ndash můžeme moduly hledat napřiacuteklad na httpsgithubcomnebo je udržovat ve vlastniacutem soukromeacutem repositaacuteři Moduly jsou nakonec jen zdrojoveacutesoubory takže nejsme omezeni žaacutednyacutem proprietaacuterniacutem distribučniacutem kanaacutelem
KatalogVyacuteslednaacute konfigurace kteraacute se aplikuje na ovlaacutedanyacute stroj Typicky se jednaacute o kombinacikonfiguraciacute mnoha manifestů V katalogu jsou umiacutestěny všechny virtuaacutelniacute zdroje z přiacute-slušnyacutech manifestů uspořaacutedaneacute do orientovaneacuteho acyklickeacuteho grafu Toto uspořaacutedaacuteniacuteurčuje pořadiacute aplikace jednotlivyacutech zdrojů
4
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
24 Dvě varianty architektury Puppet infrastruktury
Obraacutezek 21 Komunikace mezi Puppet Agentem a Masterem Obraacutezek převzat z [13]
24 Dvě varianty architektury Puppet infrastruktury
Puppet nabiacuteziacute dva zaacutekladniacute způsoby použitiacute Puppet apply a komunikaciagent - master
V přiacutepadě puppet apply se Puppet spouštiacute přiacutemo na konfigurovaneacutem stroji (a žaacutednyacutejinyacute stroj neniacute třeba) Nejprve je třeba na stroj nějakyacutem způsobem nahraacutet soubory sPuppet konfiguraciacute a poteacute pomociacute přiacutekazu
puppet apply
spustiacuteme běh konfigurace [12]Varianta agent - master je určena pro konfiguraci mnoha strojů najednou Stroje
v infrastruktuře jsou rozděleny na dva typy ndash ovlaacutedaneacutemu stroji řiacutekaacuteme Puppet Agenta ovlaacutedajiacuteciacutemu stroji řiacutekaacuteme Puppet Master
Na obraacutezku 21 je znaacutezorněna komunikace mezi agentem a masterem V bodě 1)zahaacutejiacute agent komunikaci navaacutezaacuteniacutem spojeniacute s masterem Předaacute mu o sobě množstviacuteinformaciacute na zaacutekladě kteryacutech Puppet Master vygeneruje katalog s konfiguraciacute V bodě2) posiacutelaacute master agentovi zpracovanyacute katalog s konfiguraciacute ndash agent se ho ihned pokusiacutespustit Po aplikaci konfigurace z katalogu agent v bodě 3) posiacutelaacute masterovi vyacutestupz provedenyacutech operaciacute Tento vyacutestup lze pomociacute naacutestrojů z edice Puppet Enterprisedaacutele zpracovaacutevat a napřiacuteklad zobrazovat v grafickeacutem rozhraniacute pro operaacutetora
5
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
2 Představeniacute naacutestroje Puppet 25 Zdroje Puppetu jako zaacutekladniacute prvky ovlaacutedaacuteniacutesysteacutemu
Zdroje (resources) jsou zaacutekladniacute entity se kteryacutemi pracujeme při programovaacuteniacute v Pup-petu Puppet se naacutes snažiacute odstiacutenit od konkreacutetniacute implementace reaacutelnyacutech zdrojů operač-niacuteho systeacutemu Použiacutevaacute pro to praacutevě zdroje ktereacute jsou pro různeacute platformy implemen-tovaacuteny providery
Obraacutezek 22 Zdroje puppet
Puppet nabiacuteziacute abstrakce napřiacuteklad pro praacuteci se soubory uživateli systeacutemovyacutemi služ-bami plaacutenovanyacutemi uacutelohami a mnoha dalšiacutemi Kompletniacute vyacutečet standardniacutech zdrojůnalezneme na oficiaacutelniacutech straacutenkaacutech [14] Naviacutec vybraneacute zdroje ktereacute se tyacutekajiacute ovlaacutedaacuteniacuteoperačniacutech systeacutemů Windows podrobněji popiacutešu ve zvlaacuteštniacute kapitole
26 Podporovaneacute platformyPuppet agent je možneacute provozovat na nejrůznějšiacutech Unix platformaacutech včetně Mac OSa na moderniacutech verziacutech operačniacuteho systeacutemu Windows (verze pro pracovniacute stanice iservery) [15] Kompletniacute podporovaneacute verze nalezneme na oficiaacutelniacutech straacutenkaacutech [16]
Pro provozovaacuteniacute Puppet Serveru (Puppet Master) je vyacuteběr platforem vyacuterazně menšiacuteJe nutneacute použiacutet Unix ndash a to jeden z těchto [17]Red Hat Enterprise LinuxRHEL-derived distrosFedoraDebianUbuntu
6
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
27 Jak ziacuteskat Puppet
27 Jak ziacuteskat PuppetNa Unix platformaacutech lze najiacutet oficiaacutelniacute verzi Puppetu i Puppet Serveru v přiacuteslušneacutem ba-liacutekovaciacutem naacutestroji Pro Windows jsou připraveny ke staženiacute msi instalačniacute soubory [18]
28 Proč jsem vybral PuppetPuppet je jedniacutem z nejpoužiacutevanějšiacutech [19] naacutestrojů pro automatizaci konfigurace počiacute-tačoveacute infrastruktury
Obraacutezek 23 Obliacutebenost CM naacutestrojů Obraacutezek převzat z [19]
Maacute velmi propracovanyacute vlastniacute dsl jazyk založenyacute na Ruby syntaxi ndash v kapitole im-plementace předvedu jak je tento dsl jazyk pohodlnyacute diacuteky jeho deklarativniacute povazeProgramovaacuteniacute konfigurace Puppetu použiacutevaacute deklarativniacute přiacutestup a pro komplikovanějšiacuteinfrastrukturu mi osobně přijde deklarativniacute model přehlednějšiacute Je to možnaacute tiacutem žejsem zvyklyacute na funkcionaacutelniacute programovaacuteniacute ktereacute praacutevě deklarativniacute přiacutestup hojně vy-užiacutevaacute Uacuteloha konfigurace se pro deklarativniacute způsob vyacutevoje dle meacuteho naacutezoru velicehodiacute protože konfigurace systeacutemu je nakonec praacutevě popis zamyacutešleneacuteho stavu počiacutetačo-veacuteho systeacutemu ndash nikoliv algoritmus kteryacutem se ke stavu dostaneme Samozřejmě pokudbych měl představovat konfiguračniacute naacutestroje celeacutemu vyacutevojoveacutemu tyacutemu ve ktereacutem jsouvyacutevojaacuteři zvykliacute vyacutehradně na imperativniacute programovaacuteniacute Puppet bych patrně nezvolil
Nejčastějšiacute distribučniacute model Puppetu je pull varianta v podobě agent - masterkomunikace Lze ale použiacutet i variantu puppet apply kteraacute obejde centraacutelniacute prvek Puppetinfrastruktury a dociacutelit tiacutem distribučniacute varianty push ndash Puppet tedy nabiacuteziacute to nejlepšiacutez obou modelů
Protože ciacutelem praacutece je spraacuteva strojů s Windows je důležitaacute i velice dobraacute podporaPuppetu praacutevě pro tuto skupinu operačniacutech systeacutemů Jak Puppet umiacute s Windows pra-covat uvedu ve zvlaacuteštniacute kapitole
7
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 3Multiplatformniacute Puppet
Puppet podporuje mnoho operačniacutech systeacutemů z rodiny Unix a takeacute vybraneacute typy Win-dows [16] Pokud to alepsoň trochu jde snažiacute se Puppet použiacutevat stejneacute vyacuterazoveacute pro-středky na obou platformaacutech Pro administraacutetora je tedy vyacutehodneacute že mnoheacute naacutevrhoveacutevzory konfigurace může uplatnit na obou platformaacutech a leacutepe zuacuteročit čas kteryacute věnovalučeniacute se Puppetu
Zaacutekladniacute stavebniacute kameny systeacutemu Puppet jsou nejrůznějšiacute zdroje ndash resources [14]Tyto zdroje jsou implementovaacuteny pomociacute providerů na konkreacutetniacutech podporovanyacutechplatformaacutech a pro administraacutetora je tedy připravena přiacutejemnaacute abstrakce nad ovlaacutedaciacutemiprvky systeacutemu Napřiacuteklad zdroj ovlaacutedajiacuteciacute soubory ndash file ndash existuje jak pro Unix takpro Windows Lišiacute se praacutevě v implementaci provideru protože se soubory na Unixu sezachaacuteziacute jinak než na Windows
Samozřejmě takovaacute abstrakce nezvlaacutedne plně odstiacutenit typ operačniacuteho systeacutemu ale jepřiacutejemneacute spravovat Unix i Windows podobnyacutemi vyjadřovaciacutemi prostředky
V naacutesledujiacuteciacutech kapitolaacutech bych raacuted čtenaacuteře seznaacutemil s vybranyacutemi zdroji Puppetu azejmeacutena upozornil v čem se lišiacute chovaacuteniacute Unixoveacute a Windows verze [20ndash21]
31 SouboryZdroj pro ovlaacutedaacuteniacute souborů se na obou platformaacutech jmenuje file Společneacute pro oběplatformy je možnost nastavovaacuteniacute jmeacutena cesty obsahu a přiacutestupovyacutech praacutev souboruKaždyacute z těchto parametrů se ale lišiacute možnostmi ktereacute jednotliveacute operačniacute systeacutemynabiacuteziacute jmeacuteno souboru narozdiacutel od Unixu Windows nerozlišuje mezi velkyacutemi a malyacutemi piacutes-
meny Puppet toto nijak neupravuje a nechaacutevaacute řešeniacute na administraacutetorovi lomiacutetka v cestě souboru Na platformě Windows Puppet automaticky upravuje lo-miacutetka na spraacutevnou variantuPřiacutestupovaacute praacuteva Primaacuterně se použiacutevaacute verze opraacutevněniacute pro linux ndash tedy praacuteva voktaloveacute notaci pro vlastniacuteka skupinu a ostatniacute Windows verze tato opraacutevněniacute takeacutedokaacuteže zpracovat a namapuje je na vlastniacute pojetiacute opraacutevněniacute Pro podrobnějšiacute spraacutevuopraacutevněniacute k souborům a adresaacuteřům však potřebujeme specializovaneacute moduly jako jenapřiacuteklad puppetlabsacl [22] modulKonce řaacutedků tradičniacutemu probleacutemu při multiplatformniacute komunikaci se nevyhnemeani v přiacutepadě Puppetu Probleacutem je zejmeacutena to že v přiacutepadě spraacutevy Windows spoluvždy komunikuje Puppet Agent a Master přitom Master nutně musiacute byacutet Unixovyacutesysteacutem Pro přenos obsahu souborů tedy musiacuteme byacutet velice obezřetniacute a uchovaacutevatna Puppet Masteru řetězce a šablony souborů se spraacutevnyacutemi konci řaacutedků Obecneacutepravidlo je že přenos souborů Puppet provaacutediacute binaacuterně ndash tedy zachovaacutevaacute konce řaacutedkůtakoveacute jakeacute jsou uloženeacute u Puppet Mastera U jinyacutech zdrojů ktereacute mohou upravo-vat obsah textovyacutech souborů (napřiacuteklad hosts zaacuteznamy) se většinou automatickypoužijiacute spraacutevneacute konce řaacutedků daneacuteho agenta Vše je třeba konzultovat s manuaacutelovyacutemistraacutenkami modulů
8
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
32 Uživateleacute a skupiny uživatelů
32 Uživateleacute a skupiny uživatelůPro ovlaacutedaacuteniacute uživatelů a skupin existuje opět společnyacute zdroj Puppetu user resp groupPro Windows je třeba zmiacutenit že umiacute ovlaacutedat pouze lokaacutelniacute uživatele nikoliv uživateleActive Directory ndash k tomu budeme opět potřebovat zvlaacuteštniacute modul
33 SlužbyPro obě platformy existuje zdroj jmeacutenem service Lišiacute se v parametrech pomociacute kteryacutechse služby ovlaacutedajiacute Obě platformy majiacute zaacutekladniacute parametr zda maacute byacutet služba spuštěnači zastavena Unixovaacute varianta umožňuje určit startstop skripty zatiacutemco u Windows sivoliacuteme startup type [23] ndash parametr udaacutevajiacuteciacute zda maacute byacutet služba spouštěna automatickyči ručně
34 Zaacuteznamy hostsOvlaacutedaacuteniacute zaacuteznamů hosts je pro Unix i pro Windows stejneacute ndash lišiacute se pouze vnitřniacuteimplementace jak a kam se zaacuteznamy zapisujiacute
35 Instalace programůSpraacuteva programů je mezi Unixy a Windows na prvniacute pohled naprosto odlišnaacute - kupodivuale takeacute použiacutevaacute stejnyacute zdroj na obou platformaacutech Rozdiacutel prameniacute zejmeacutena z toho že naUnixu v drtiveacute většině přiacutepadů maacuteme nějakeacuteho spraacutevce instalovanyacutech programů (aptyum apod) Ve standardniacute instalaci Windows však žaacutednyacute takovyacute spraacutevce neniacute Musiacutemetedy sami zajistit aby měly Windows přiacutestup k instalačniacutemu exe nebo msi souboru apoteacute ho pomociacute instalačniacutech parametrů korektně nainstalovat Distribuci instalačniacutehosouboru můžeme zařiacutedit různyacutemi způsoby Můžeme namapovat siacuteťovyacute disk můžemesoubor staacutehnout na disk agenta a po instalaci ho vymazat Obě tato řešeniacute ale zdalekanejsou tak pohodlnaacute jako spraacutevci baliacuteků v přiacutepadě Unixu
Pro Windows ovšem existuje jistaacute alternativa k bdquoručniacutemuldquo stahovaacuteniacute programů Jeto aplikace chocolatey [24] kteraacute pro Windows představuje to co pro Debian apt nebopro Fedoru yum Jednaacute se o baliacutečkovaciacute systeacutem pro Windows a Puppet s niacutem umiacute diacutekyzvlaacuteštniacutemu provideru pracovat [25] Nevyacutehoda ovšem je že tato aplikace neniacute v čisteacuteinstalaci Windows
36 RebootPřiacutemo navaacutežeme na předchoziacute kapitolu o instalaci programů Na Windows je mnohoprogramů ktereacute nutně vyžadujiacute po instalaci restart systeacutemu ndash to ve světě Unixu vpodstatě neznaacuteme Nicmeacuteně komunita Puppetu se tiacutem nenechala zastrašit a připravilamodul pro restart systeacutemu Pomociacute obvyklyacutech metod řazeniacute aplikovaacuteniacute Puppet zdrojůmůžeme napřiacuteklad v Puppetu určit že po instalaci všech programů z manifestu se maacutestroj restartovat nebo napřiacuteklad k restartu systeacutemu maacute dojiacutet před instalaciacute vybraneacutehoprogramu
37 Spouštěniacute vlastniacuteho přiacutekazuPro obě platformy se vlastniacute skripty spouštiacute obdobně zdrojem exec U Windows existujezvlaacuteštniacute provider powershell pomociacute ktereacuteho můžeme přiacutemo při běhu Puppetu spustitkoacuted v programu powershell
9
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
3 Multiplatformniacute Puppet 38 Plaacutenovaneacute uacutelohy
Zde se verze Windows od Unixů lišiacute viacutece Unix maacute na spouštěniacute opakovanyacutech plaacutenova-nyacutech uacuteloh program cron ndash tak se takeacute jmenuje zdroj Puppetu kteryacute tyto uacutelohy ovlaacutedaacuteWindows ovšem cron nemaacute a tak se jeho zdroj pro spouštěniacute opakovanyacutech uacuteloh odlišujenaacutezvem i formou ndash scheduled_task
39 Windows registryJedniacutem z důležityacutech rozdiacutelů mezi spraacutevou Windows a Unixu je forma uchovaacutevaacuteniacute kon-figurace v systeacutemu Unix je silně orientovanyacute na soubory a pro většinu konfiguraciacutepoužiacutevaacute praacutevě soubory Z pohledu Puppetu je to velice přiacutejemnaacute věc protože zdroj naovlaacutedaacuteniacute souborů už maacute a nemusiacute proto vytvaacuteřet dalšiacute pro nastavovaacuteniacute programů a slu-žeb U Windows je situace jinaacute a pro konfiguraci se v drtiveacute většině přiacutepadů použivajiacuteWindows registry
Puppet pro ovlaacutedaacuteniacute registry připravil vlastniacute modul pomociacute ktereacuteho lze přidaacutevat aodebiacuterat kliacuteče z registry a samozřejmě takeacute upravovat typy a hodnoty zaacuteznamů
Kromě samotneacute konfigurace se Windows registry velice hodiacute pro ziacuteskaacutevaacuteniacute informaciacute osysteacutemu Toho Puppet využiacutevaacute v programu facter [26] pomociacute ktereacuteho se může Puppetrozhodovat v manifestech co přesně na systeacutemu vykonaacute Pro facter si můžeme psaacutet inaše vlastniacute funkce a v přiacutepadě Windows jsou praacutevě registry velice vhodnaacute knihovnainformaciacute
310 Active DirectoryPro systeacutem Windows existuje tradičniacute naacutestroj pro spraacutevu entit v siacuteti ndash Active Directory(AD) Zaměřeniacute tohoto naacutestroje je tedy podobneacute jako naacutestroje Puppet Bylo by ovšemnerozumneacute považovat Puppet za nesmiřitelnou konkurenci pro AD Puppet by měl vtakoveacutem soupeřeniacute velikou nevyacutehodu protože je to mnohem mladšiacute systeacutem a muselby přesvědčit spraacutevce počiacutetačovyacutech siacutetiacute aby opustili zavedeneacute a vyzkoušeneacute řešeniacute ADa dali přednost praacutevě Puppetu Nezapomeňme že za AD stojiacute obrovskaacute mezinaacuterodniacutekorporace a soupeřeniacute s niacute by tedy jistě nebylo jednoducheacute [27]
Dle meacuteho naacutezoru je mnohem zajiacutemavějšiacute nabiacutednout staacutevajiacuteciacutem uživatelům AD naacutestrojkteryacutem AD mohou spravovat ndash nikoliv naacutehradu ale užitečnyacute doplněk A přesně k tomusloužiacute naacutesledujiacuteciacute Puppet moduly pro ovlaacutedaacuteniacute Active Directory
3101 Spraacuteva Active DirectoryModul pro spraacutevu vlastniacuteho Active Directory je k dispozici v repositaacuteři forgepuppetcom pod naacutezvem jriviereWindows_ad [28] Tento modul nabiacuteziacute zaacutekladniacute spraacutevu AD instalace AD a konfigurace zaacutekladniacutech parametrů spraacuteva uživatelskyacutech skupin spraacuteva uživatelů a jejich zařazeniacute do skupin spraacuteva organizačniacutech jednotek
3102 Modul domainndashmembershipModul trlinkindomain_membership [29] sloužiacute k zařazovaacuteniacute strojů do domeacuteny spra-vovaneacute pomociacute AD (domain membership)
Pomociacute zadaneacuteho uživatele s opraacutevněniacutem přidaacutevat strojedo domeacuteny umožniacute pro strojurčit konkreacutetniacute domeacutenu a parametry pro připojeniacute [30]
10
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
310 Active Directory
3103 Modul aclPro spraacutevu přiacutestupovyacutech opraacutevněniacute ke zdrojům operačniacuteho systeacutemu pomociacute ACL (accesscontrol list [31]) sloužiacute modul puppetlabsacl [22]
Přiacuteklad použitiacute modulu
acl rsquoctemppermsrsquopermissions =gt [ identity =gt rsquoAdministratorrsquo rights =gt [rsquofullrsquo] identity =gt rsquoUsersrsquo rights =gt [rsquoreadrsquorsquoexecutersquo]
]
Modul umožňuje identifikovat uživatele pomociacute jejich SID (securty identifier) i FQDN(fully qualified domain name) Daacutele podporuje nastavovat praacuteva ke zdroji pomociacute mno-žiny ACE (access control entries) [32]
3104 Dalšiacute moduly pro ovlaacutedaacuteniacute prostřediacute WindowsModulů fungujiacuteciacutech v prostřediacute Windows je daleko viacutec než je možneacute v teacuteto praacuteci zmiacutenitI diacuteky aktivniacute komunitě okolo systeacutemu Puppet je na oficiaacutelniacutech zdrojiacutech pro systeacutemyWindows [33] nepřeberneacute množstviacute užitečnyacutech naacutestrojů[34]
11
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 4Testovaacuteniacute
Jako každyacute jinyacute zdrojovyacute koacuted i manifesty Puppetu mohou obsahovat chyby Můžemese poučit u programovaacuteniacute v tradičniacutech jazyciacutech a do světa spraacutevy konfigurace zařaditpsaniacute automatickyacutech testů
Testovat můžeme na viacutece uacuterovniacutech ndash můžeme staticky kontrolovat syntax koacutedu Pup-petu pomociacute programu puppet-lint [35] můžeme psaacutet unit testy pomociacute programurspec-puppet a můžeme psaacutet takeacute akceptačniacute testy nad zkonfigurovanyacutemi stroji po-mociacute naacutestroje serverspec [36]
41 Statickaacute kotrola koacuteduPrvniacute kontrola koacutedu začiacutenaacute linterem - tedy statickou analyacutezou koacutedu Pro Puppet jepřipraven program puppet-lint Ve standardniacute konfiguraci obsahuje mnoho užitečnyacutechkontrol - od kontroly spraacutevneacuteho odsazeniacute řaacutedků přes standardizovaneacute pořadiacute argumentůa vynucovaacuteniacute komentaacuteřů u definovanyacutech typů až po odhaleniacute skutečnyacutech chyb jakonapřiacuteklad duplicita v seznamu parametrů modulu
Puppet-lint dokonce umiacute pomociacute parametru --fix některeacute nedostatky saacutem opravitndash napřiacuteklad chybnyacute typ odsazeniacute řaacutedků
Puppet je pro novaacutečka poměrně zaacuteludnyacute jazyk vzhledem ke sveacute deklarativniacute povazePro programaacutetora zvykleacuteho na proceduraacutelniacute přiacutestup k psaniacute koacutedu je puppet-lint neo-cenitelnyacute raacutedce a pomocniacutek při osvojovaacuteniacute bdquobest-practicesldquo
Puppet-lint je otevřenyacute ostaniacutem vyacutevojaacuteřům a nabiacuteziacute na svyacutech straacutenkaacutech naacutevod jaksi naprogramovat vlastniacute metody linteru
42 Unit testyPo statickeacute kontrole koacutedu jsou na řadě unit testy Nabiacuteziacute se použitiacute programurspec-puppet [37] Tento program je založen na testovaciacutem frameworku pro jazykRuby Rspec [38] Rspec-puppet obsahuje veškerou funkcionalitu frameworku rspeca ještě naviacutec přidaacutevaacute rozšiacuteřeniacute pro pohodlneacute testovaacuteniacute Puppet koacutedu Při unit tes-tech se žaacutedneacute nastavovaacuteniacute vzdaacutelenyacutech strojů neprovaacutediacute ndash běh Puppetu se zastaviacute přivygenerovaacuteniacute katalogu s Puppet zdroji
Po vygenerovaacuteniacute katalogu se kontroluje stav zdrojů ktereacute byly do katalogu zařazenyMůžeme kontrolovat zda modul vygeneroval spraacutevneacute typy zdrojů se spraacutevnyacutemi parame-try můžeme kontrolovat zda modul skončil vyacutejimkou při zadaacuteniacute nepovoleneacute kombinaceparametrů a mnoho dalšiacuteho [39]
43 Akceptačniacute testyAkceptačniacute testy provaacutediacuteme na skutečnyacutech zkonfigurovanyacutech strojiacutech Pro implementacitestů jsem použil program serverspec
12
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
44 Test Driven Development
Tento program je podobně jako rspec-puppet založen na testovaciacutem frameworkuRspec Obsahuje ale naviacutec funkce pro testovaacuteniacute zdrojů a nastaveniacute systeacutemu Pomociacute růz-nyacutech backendů můžeme testy v serverspecu spouštět na různyacutech platformaacutech Tradičněje podporovaacuten Unix ale můžeme si zvolit i backend pro Docker kontejnery nebo v tomtopřiacutepadě pro stroje s operačniacutem systeacutemem Windows Pro Unix je kontrola vzdaacuteleneacutehosysteacutemu implementovaacutena ssh přiacutekazy a pro systeacutemy s Windows použiacutevaacute serverspecwinrm spojeniacute
Nejzajiacutemavějšiacute na programu serverspec jsou ovšem dostupneacute funkce pro testovaacuteniacutestavu systeacutemu Kompletniacute informace nalezneme v manuaacutelovyacutech straacutenkaacutech na internetuZde bych ale zmiacutenil několik vybranyacutech typů ktereacute lze použiacutet i na platformě Windowsfileusergrouppackagewindows feature commandporthost servicewindows registry key
44 Test Driven DevelopmentPomociacute testovaciacutech naacutestrojů ktereacute jsem představil můžeme i při psaniacute konfiguraceinfrastruktury použiacutet moderniacute techniku psaniacute koacutedu ndash Test Driven Development Samo-zřejmě nic naacutes k psaniacute testů nenutiacute (Puppet funguje i bez nich) ale pro bezchybnyacute audržitelnyacute vyacutevoj jsou testy velice vhodneacute
Unit testy a integračniacute testy oceniacuteme při samotneacutem psaniacute koacutedu v Puppetu a ak-ceptačniacute testy psaneacute v naacutestroji serverspec jsou užitečneacute i při jakeacutekoliv jineacute adminis-traci systeacutemu ndash nejsou zaacutevisleacute na použitiacute Puppetu Pokud bychom se rozhodli vyzkoušetjinyacute systeacutem pro spraacutevu konfigurace nebo v přiacutepadě prostřediacute Windows nativniacute spraacutevupomociacute Active Directory testy v programu serverspec naacutem posloužiacute stejně dobře
13
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 5Testovaciacute prostřediacute AWS
V předchoziacutech kapitolaacutech jsem srovnaacuteval psaniacute konfigurace s psaniacutem koacutedu v tradič-niacutem programovaciacutem jazyku V teacuteto kapitole představiacutem dalšiacute podobnost s tradičniacutemprogramovaacuteniacutem ndash vyacutevojoveacute prostřediacute
Velmi často programujeme na jineacutem typu zařiacutezeniacute než na ktereacutem bude programprovozovaacuten Valnaacute většina programaacutetorů programuje na osobniacutem počiacutetači či notebookuale přesto vyacutesledek jejich praacutece funguje na uacuteplně jinyacutech architekturaacutech ndash programujemezaacutekladniacute desky roboty aplikace na mobilniacutech telefonech mnohatunoveacute stroje ve vyacuteroběndash všechny tyto platformy majiacute společnyacute rys vyacutevoje ndash použitiacute emulaacutetoru U konfiguracejsme postaveni před uacuteplně stejnyacute probleacutem Programujeme koacuted kteryacute bude fungovat nauacuteplně jinyacutech platformaacutech a proto pro rychlyacute vyacutevoj potřebujeme opět emulaacutetor ciacuteloveacutehosysteacutemu ndash virtualizovanyacute hardware
Od virtualizačniacuteho systeacutemu potřebujeme zejmeacutena rychleacute generovaacuteniacute strojů pro laděniacutea testovaacuteniacute našiacute konfigurace Pro každyacute use case konfigurace budeme chtiacutet zvlaacuteštniacute izo-lovanyacute hardware abychom se mohli soustředit na konkreacutetniacute konfiguračniacute uacutekol a teprvez vyzkoušenyacutech ověřenyacutech postupů sklaacutedali funkčniacute celek
Existuje mnoho služeb a programů ktereacute naacutem virtualizaci hardware nabiacuteziacute Můžemesi zvolit virtualizaci běžiacuteciacute na našem osobniacutem počiacutetači (Virtualbox Vagrant) nebozvolit službu kteraacute využiacutevaacute hw zdroje vzdaacuteleneacuteho vyacutepočetniacuteho střediska (Amazon WebServices Microsoft Azure Google cloud a dalšiacute) Pro testovaacuteniacute Puppetu na Windowsjsem se rozhodl použiacutet praacutevě služby vzdaacuteleneacuteho datacentra Diacuteky tomu maacutem volnostv modelovaacuteniacute viacutecestrojoveacute konfigurace a nejsem vaacutezaacuten dostupnyacutem fyzickyacutem hardwaremeacuteho osobniacuteho počiacutetače Zaacuteroveň je možneacute u vzdaacuteleneacute služby daacutet přiacutestupoveacute uacutedajeosobaacutem zodpovědnyacutem za kontrolu (a nenutit je instalovat si virtualizačniacute program nasveacute počiacutetače)
Puppet je systeacutem pro ovlaacutedaacuteniacute zdrojů ciacuteloveacuteho systeacutemu a proto naacutes jistě nepřekvapiacuteže i pro virtualizačniacute platformy existuje mnoho Puppet modulů pomociacute nichž lze tytoplatformy ovlaacutedat Mezi podporovaneacute platformy patřiacute napřiacuteklad Amazon Web Services(AWS) Microsoft Azure VMware OpenStack nebo Google Compute Engine [40]
Diacuteky programatickeacutemu přiacutestupu Puppetu můžeme k vyacutevoji konfigurace infrastruk-tury přistupovat jako k vyacutevoji běžneacuteho programu Tedy vyacutesledek neniacute konkreacutetniacute instalo-vanaacute instance stroje ale koacuted odevzdanyacute ve verzovaciacutem systeacutemu kteryacute můžeme kdykolivpoužiacutet a vyrobit si instance noveacute
Puppet naacutem tak umožňuje uchovaacutevat si přesnou podobu nastaveniacute prostřediacute ve kte-reacutem naši konfiguraci testujeme a pomociacute napojeniacute na api poskytovatele virtualizacemůžeme celeacute prostřediacute vytvořit a po použitiacute opět odstranit
51 Požadavky na virtualizačniacute platformumusiacute umět spouštět linuxoveacute stroje i stroje s operačniacutem systeacutemem Windowsmusiacute umět modelovat siacuteťoveacute zapojeniacute strojů abychom si mohli vyzkoušet
agent - master komunikaci
14
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
52 Amazon Web services
musiacute byacutet za rozumnou cenumusiacute existovat možnost spravovat prostřediacute programaticky nejleacutepe pomociacute Puppetmodulů
52 Amazon Web servicesK testovaacuteniacute konfigurace systeacutemu Windows pomociacute Puppetu jsem si vybral službu Ama-zon Web Services (AWS) S touto platformou jsem již ziacuteskal zkušenosti v profesionaacutelniacutemnasazeniacute a je mi proto z uvedenyacutech platforem nejbližšiacute Zaacuteroveň splňuje všechny bodyz vyacuteše uvedenyacutech požadavků
AWS je poskytovatel infrastruktury bdquoon demandldquo Tedy platiacute se jen za to co skutečněpoužiacutevaacuteme To je velice vyacutehodneacute v testovaciacutem prostřediacute kdy neniacute dlouhodobě spuštěnžaacutednyacute stroj ale soustavně se stroje při spuštěniacute testu zaklaacutedajiacute a na konci testu se rušiacuteI při viacutecestrojoveacute konfiguraci prostřediacute tak zaplatiacuteme pouze několik minut běhu celeacutehoprostřediacute
53 Služby AWSV protřediacute AWS chceme zaklaacutedat virtuaacutelniacute stroje a připojovat je do naacutemi zvoleneacute siacuteťoveacutetopologie V naacutesledujiacuteciacutech kapitolaacutech představiacutem zaacutekladniacute stavebniacute prvky prostřediacute ajejich ovlaacutedaacuteniacute pomociacute Puppetu
531 VPCVirtual Private Cloud (VPC) je služba pro modelovaacuteniacute siacuteťoveacuteho zapojeniacute virtuaacutelniacutechstrojů VPC v sobě zahrnuje veškereacute siacuteťoveacute nastaveniacute prostřediacuteVPC zapouzdřuje veškerou infrastrukturu v raacutemci AWS uacutečtu Určuje AWS region
ve ktereacutem budeme pracovat a udaacutevaacute vnitřniacute povolenyacute rozsah adres Přiacuteklad založeniacuteVPC pomociacute Puppet modulu
ec2_vpc rsquopuppet-testrsquoensure =gt presentregion =gt rsquoeu-central-1rsquocidr_block =gt 1000024
Subnet představuje podsiacuteť v raacutemci VPC Musiacute existovat alespoň jedna ale mužemejich založit viacutec pro modelovaacuteniacute komplikovanějšiacute siacuteťoveacute topologieRoute table pro každou podsiacuteť musiacuteme specifikovat routovaciacute tabulku Internet Gateway (IGW) prvek pro napojeniacute VPC podsiacutetě do veřejneacuteho internetuElastic IP můžeme alokovat veřejnou ipv4 adresu a přiřadit ji virtuaacutelniacutemu strojiSecurity Group můžeme specifikovat jednoduchaacute pravidla pro povolovaacuteniacute a zakazo-vaacuteniacute komunikace po siacuteti ndash v podstatě je to takovyacute jednoduchyacute firewall
532 EC2Elastic Compute Cloud (EC2) je služba ovlaacutedajiacuteciacute virtuaacutelniacute stroje Zejmeacutena je možneacutepomociacute niacute vytvaacuteřet a mazat virtuaacutelniacute stroje vytvaacuteřet obrazy disků pro zaacutelohovaacuteniacute avytvaacuteřet ze strojů šablony ze kteryacutech můžeme zaklaacutedat dalšiacute stroje
15
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
5 Testovaciacute prostřediacute AWS Instances vlastniacute virtuaacutelniacute stroje Nabiacutezejiacute se v různyacutech vyacutekonnostniacutech konfiguraciacutech
a předevšiacutem si můžeme zvolit různeacute předinstalovaneacute operačniacute systeacutemy V teacuteto praacutecipoužiji Debian Jessie a Windows Server 2012Amazon Machine Images (AMI) jsou připraveneacute obrazy disků s nainstalovanyacutem ope-račniacutem systeacutemem ze kteryacutech se spouštiacute noveacute virtuaacutelniacute stroje Jsou připraveny nej-různějšiacute varianty AMI na AWS Marketplace s předpřipravenyacutem software Můžeme siale připravit i naše vlastniacute šablony a toho využijeme pro zaacutekladniacute instalaci PuppetuVolumes spraacuteva pevnyacutech disků připojenyacutech k instanciacutemSnapshots vytvaacuteřeniacute obrazů disků pro zaacutelohu
533 Route53Route53 je dynamickyacute dns server kteryacute umožňuje spravovat zaacuteznamy o domeacuteně jakve vnitřniacute siacuteti tak při komunikaci s okolniacutem internetem Pro ovlaacutedaacuteniacute zaacuteznamů o do-meacuteně je připraveno programatickeacute rozhraniacute Toto rozhraniacute se daacute použiacutet napřiacuteklad proimplementaci dynamickeacute dns služby kdy se každyacute stroj při startu do dns přihlaacutesiacute a přivypiacutenaacuteniacute odhlaacutesiacute
16
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 6Workflow
V teacuteto kapitole představiacutem postup vyacutevoje Puppet koacutedu od programovaacuteniacute na lokaacutelniacutempočiacutetači až po nasazeniacute koacutedu na společnaacute prostřediacute (testovaciacute nebo dokonce produkčniacute)Puppet přivaacutediacute do prostřediacute Windows spraacutevu systeacutemu ve formě zdrojoveacuteho koacutedu (miacutestoovlaacutedaacuteniacute grafickeacuteho rozhraniacute) Stejně jako u jakeacutehokoliv jineacuteho zdrojoveacuteho koacutedu je tedyna miacutestě tento koacuted verzovat pomociacute nějakeacuteho verzovaciacuteho systeacutemu Pro tento přiacutepadjsem zvolil distribuovanyacute verzovaciacute systeacutem Git
V předchoziacutech kapitolaacutech jsem se často odkazoval na veřejně dostupneacute moduly ktereacutemůžeme použiacutet pro naši praacuteci Je načase představit způsob jak uchovaacutevat zaacutevislosti natěchto externiacutech modulech
61 Spraacuteva externiacutech modulůMůžeme si zvolit z viacutece možnostiacute jak ke spraacutevě modulů přistupovatPuppet ModuleGit SubmodulePuppetfile
611 Puppet modulePrvniacute možnost jak se dostat ke sdiacuteleneacutemu koacutedu je pomociacute přiacutekazu puppet module kteryacuteje součaacutetiacute standardniacute instalace Puppetu Pomociacute tohoto programu můžeme instalovatmoduly zveřejněneacute na portaacutele httpsforgepuppetcom Nabiacutedka je značně ob-saacutehlaacute a z veřejnyacutech modulů si pravděpodobně vybereme Může se však staacutet že bychompotřebovali nějakyacute meacuteně znaacutemyacute modul kteryacute najdeme napřiacuteklad na httpsgithubcom ale na httpsforgepuppetcom zveřejněnyacute neniacute Stejně tak naacutem Puppet Mo-dule nepomůže v přiacutepadě že bychom chtěli sdiacutelet naacuteš vlastniacute modul mezi projekty achtěli ho miacutet pouze ve sveacutem neveřejneacutem repositaacuteři
612 Git SubmoduleProtože jsem se rozhodl použiacutet git můžeme zvolit řešeniacute Git Submodule Valnaacute většinamodulů je zveřejněna na httpsgithubcom a proto si je můžeme bez probleacutemupřidat do našeho projektu jako submoduly Nevyacutehoda je ovšem značnaacute naacuteročnost použitiacutesubmodulů zejmeacutena při aktualizaci vzaacutelenyacutech repositaacuteřů Naviacutec je třeba aby všichničlenoveacute tyacutemu se submoduly uměli pracovat
613 PuppetfileKonečně třetiacute navrhovaneacute řešeniacute počiacutetaacute se zavedeniacutem konfiguračniacuteho souboruPuppetfile V tomto souboru definujeme externiacute moduly z repositaacuteře forgepuppetcom můžeme zde uveacutest i git nebo svn repositaacuteře s přiacuteslušnou verziacute commitu a nakonecmůžeme takeacute specifikovat cestu k lokaacutelniacutemu modulu Staženiacute respektive aktualizaci
17
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
6 Workflow takoveacuteho Puppetfilu obstaraacute program r10k o ktereacutem ještě bude řeč v naacutesledujiacuteciacutekapitole Pomociacute přiacutekazu
r10k puppetfile install
nainstaluje program r10k do zadaneacuteho adresaacuteře veškereacute zaacutevislosti z Puppetfilu
62 Udržovaacuteniacute konfigurace ve verzovaciacutem systeacutemuGit je velice užitečnyacute naacutestroj mimojineacute diacuteky kvalitniacute spraacutevě různyacutech verziacute koacutedu pomociacutevětviacute Praacutevě větve budou hraacutet kliacutečovou roli i v mnou zvoleneacutem postupu
Když spolupracuje viacutece lidiacute na jednom puppet projektu pravděpodobně budou para-lelně vyviacutejet různeacute funkcionality Pomociacute gitu si rozděliacute svou praacuteci do větviacute ale potompřijde probleacutem jak si na společneacutem prostřediacute konfiguraci vyzkoušet
Snadno můžeme vyklonovat git repositaacuteř se zdrojovyacutem koacutedem na Puppet Masterdo složky etcpuppet a tiacutem zajistit že Puppet Master aplikuje naši konfiguraci naagenty Probleacutem nastane v přiacutepadě kdy bychom chtěli z jednoho Puppet Mastera dis-tribuovat viacutece verziacute konfigurace najednou Napřiacuteklad bychom chtěli vyzkoušet novouverzi modulu ve sdiacuteleneacutem prostřediacute a nechceme přitom možneacute chyby zaneacutest na všechnystroje Hodilo by se kdybychom si mohli zvolit jeden konkreacutetniacute testovaciacute stroj a praacutevěna něm vyzkoušet novou verzi modulu
Naštěstiacute autoři Puppetu mysleli i na tento přiacutepad a připravili Puppet prostřediacute (Pup-pet Environments)
63 Puppet EnvironmentsPuppet Master může agentům nabiacutezet viacutece izolovanyacutech konfiguraciacute (prostřediacute) Agentisi potom dle sveacuteho uvaacuteženiacute vyberou jedno prostřediacute a o to Puppet Mastera požaacutedajiacuteProstřediacute se mohou mezi sebou lišit v jedinneacutem parametru ale i v celeacutem rozsahu koacutedu
Povšimněme si prosiacutem že prostřediacute je jedniacutem z maacutela způsobů jak si agent můžezvolit svou konfiguraci a nenechat vše jen na masterovi
Prostřediacute mohou byacutet definovaacutena staticky v hlavniacutem konfiguračniacutem souboruetcpuppetpuppetconf [15] pokud ale počiacutetaacuteme s dynamickou množinou prostřediacutebude pro naacutes vhodnějšiacute definovat prostřediacute dynamickaacute Pro to stačiacute založit v hlavniacutemadresaacuteři Puppetu adresaacuteř environments (napřiacuteklad etcpuppetenvironments) Agent potom použiacutevaacute prostřediacute stejně bez ohledu na to zda jsou definovaacutena statickynebo dynamicky
Posledniacute krok spočiacutevaacute v namapovaacuteniacute větviacute v git repositaacuteři na adresaacuteře dynamickyacutechprostřediacute v Puppet Masteru
64 r10kProgram r10K je program napsanyacute v jazyce Ruby a maacute za uacutekol zefektivnit praacuteci a přiinstalaci Puppet Modulů a prostřediacute [41] Je to oficiaacutelniacute program použityacute i v komerčniacutevariantě Puppetu ndash Puppet Enterprise
V předchoziacute kapitole jsem vysvětlil jak pomociacute Puppetfile spravuje moduly konfigu-race a nyniacute zbyacutevaacute představit spraacutevu dynamickyacutech prostřediacute
Program r10k dokaacuteže pomociacute přiacutekazu deploy ze zadaneacuteho git repositaacuteře přečiacutestvšechny větve a pro každou z nich vytvořit na určeneacutem miacutestě adresaacuteř s obsahem reposi-taacuteře Naviacutec pokud danyacute repositaacuteř obsahuje v kořenoveacutem adresaacuteři Puppetfile nainstalujevyacuteše zmiacuteněnyacutem způsobem všechny potřebneacute zaacutevislosti
18
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
64 r10k
Pokud tedy maacuteme v našem git repositaacuteři větve production testing dev zavolaacuteniacutempřiacutekazu
r10k deploy environment -p
vytvořiacuteme tuto adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentsproductionetcpuppetenvironmentstestingetcpuppetenvironmentsdev
Puppet Master potom může nabiacutezet agentům ke konfiguraci tři různaacute prostřediacute
19
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 7Implementace
V teacuteto kapitole demonstruji použitiacute systeacutemu Puppet při spraacutevě počiacutetačoveacute siacutetě s počiacute-tači s operačniacutem systeacutemem Windows Zaměřiacutem se zejmeacutena na pracovniacute postup vyacutevojekonfigurace a na představeniacute zdrojoveacuteho koacutedu konfigurace
71 Specifikace uacutelohyPředstaviacutem modelovyacute přiacuteklad na ktereacutem demonstruji zaacutekladniacute techniky a přednostisysteacutemu Puppet
Mějme počiacutetačovou učebnu ve ktereacute probiacutehaacute vyacuteuka programovaacuteniacute Potřebujeme za-jistit aby na počiacutetačiacutech byly nainstalovaacuteny programy pro vyacuteuku (Notepad++ a NetBe-ans) aby se mohli studenti na počiacutetače přihlaacutesit ndash tedy aby každyacute měl sveacuteho uživateleNa konci vyacuteuky bude pro studenty připraven test ndash je tedy třeba na stroje rozdistri-buovat zadaacuteniacute Aby ale studenti neopisovali budou jejich stroje předem rozděleny dodvou skupin a každaacute skupina dostane zadaacuteniacute odlišneacute
72 Vyacuteběr technologiiacuteVeškereacute zdrojoveacute koacutedy budu udržovat v git repositaacuteři umiacutestěneacutem ve veřejneacute služběBitBucket gitbitbucketorgstepanekjpuppetgit
Na zaacutekladě zhodnoceniacute prostřediacute AWS z kapitoly Testovaciacute prostřediacute jsem se rozhodlpoužiacutet praacutevě to Kromě již zmiacuteněnyacutech vyacutehod platformy AWS je pozitivniacute i podporaPuppetu Puppet nabiacuteziacute mnoho modulů pro ovlaacutedaacuteniacute prvků AWS infrastruktury [42]Teacuteměř celou konfiguraci prostřediacute tak mohu udržovat jako Puppet manifest (s vyacutejimkoudynamickeacuteho registrovaacuteniacute strojů do dns Route53)
Jako distribučniacute model pro tuto uacutelohu použiji model agent - master ndash tedy budezapotřebiacute jeden linuxovyacute stroj pro roli Puppet Mastera a daacutele spravovaneacute stroje s ope-račniacutem systeacutemem Windows Pro mastera použiji operačniacute systeacutem Debian ve verzi 84(koacutedoveacute označeniacute Jessie) a pro agenty použiji operačniacute systeacutem Microsoft Windows Ser-ver 2012 R2 Base
Daacutele budu samozřejmě potřebovat program puppet ndash zvolil jsem verzi 372 zejmeacutenaproto že je obsažena ve vyacutechoziacutem nastaveniacute Debianu
73 Vyacutevojoveacute prostřediacuteNa obraacutezku 71 je znaacutezorněna struktura vyacutevojoveacuteho prostřediacute Celeacute prostřediacute je izolo-
vaacuteno ve vlastniacutem VPC Uvnitř VPC je definovaacutena lokaacutelniacute podsiacuteť ke ktereacute je připojenaIGW aby stroje mohly komunikovat s vnějšiacutem internetem V siacuteti jsou daacutele umiacutestěnyEC2 instance ke kteryacutem se budu připojovat pomociacute ElasticIP Stroje dostaacutevajiacute přikaždeacutem spuštěniacute jinou vnitřniacute IPv4 adresu ale my musiacuteme zaneacutest propojeniacute strojů doneměnneacute struktury zdrojoveacuteho koacutedu ndash potřebujeme proto předklad ip adres na staacuteleacute dns
20
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
73 Vyacutevojoveacute prostřediacute
Obraacutezek 71 Diagram vyacutevojoveacuteho prostřediacute v AWS
zaacuteznamy To zajistiacute služba Route53 ndash dynamicky konfigurovatelnyacute dns server Bohuželpro dynamickeacute registrovaacuteniacute EC2 instanciacute do Route53 dns serveru zatiacutem Puppet modulneniacute Při zaklaacutedaacuteniacute prostřediacute jsem tedy zadal přiacuteslušneacute zaacuteznamy do Route53 ručně Daloby se to jistě zautomatizovat použitiacutem samostatneacuteho naacutestroje kteryacute přihlašuje systeacutemdo Route53 při startu a odhlašuje při vypiacutenaacuteniacute
Daacutele představiacutem vlastniacute konfiguraci AWS vyacutevojoveacuteho prostřediacute zapsanou jako PuppetManifest
$vpcName = rsquoagent-masterrsquo$ensure = rsquopresentrsquo
$debianMasterName = rsquodebian-masterrsquo
21
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
7 Implementace $debianMasterAmi = rsquoami-4ebd5221rsquo
aws_vpc $vpcNameensure =gt $ensurevpcName =gt $vpcName
aws_vpcec2_instance rsquodebian-masterrsquoname =gt $debianMasterNameimage_id =gt $debianMasterAmi
Aws_vpcEc2_instance lt||gt ensure =gt $ensuresubnet =gt $vpcName-subnetsecurity_groups =gt [$vpcName-access]
aws_vpcec2_elastic_ip rsquo5228187150rsquoensure =gt $ensureinstance =gt $debianMasterName
if $ensure == rsquoabsentrsquo Ec2_instance lt||gt
before =gt [Ec2_vpc_subnet[$vpcName-subnet]Ec2_securitygroup[$vpcName-access]
]
Pro jednoduchost zde uvaacutediacutem přiacuteklad vytvořeniacute jedinneacuteho stroje Puppet Master -jak se vytvaacuteřiacute viacutece strojů je uvedeno v repositaacuteři praacutece Typ Aws_vpc je můj vlastniacutemodul kteryacute zapouzdřuje ovlaacutedaacuteniacute VPC Obsahuje definovaneacute typy pro vytvořeniacute siacuteťoveacuteinfrastruktury pro vytvořeniacute EC2 instance a pro připojovaacuteniacute k ElasticIP
Tento manifest sestaviacute celeacute prostřediacute podle specifikovanyacutech parametrů Je sestaventak aby protřediacute uměl vytvořit i odstranit pomociacute proměnneacute ensure Je důležiteacute imple-mentovat i odstraňovaacuteniacute abychom mohli po otestovaacuteniacute nepoužiacutevaneacute prostředky z awsodstranit (čas po kteryacute jsou prostředky spuštěny je zpoplatněn)
Z koacutedu je patrneacute že na sobě jednotliveacute zdroje zaacutevisiacute Pro zapojeniacute EC2 instancemusiacute byacutet napřiacuteklad již připravena podsiacuteť Aplikujiacute se zde implicitniacute zaacutevislosti To jeovšem probleacutem při odstraňovaacuteniacute pomociacute ensure =gt absent ndash tehdy je třeba odstraňo-vat zdroje v opačneacutem pořadiacute než při vytvaacuteřeniacute Implicitniacute zaacutevislosti totiž neřešiacute zdazdroje vytvaacuteřiacuteme nebo odstraňujeme a aplikuje se vždyPři odstraňovaacuteniacute je ovšem třebazaacutevislosti obraacutetit Napřiacuteklad nejprve je třeba odtranit EC2 instanci a teprve potom mů-žeme rušit siacuteť Proto je na konci manifestu vyacuteraz v podmiacutence if(ensure =gt absent)kteryacute pořadiacute provaacuteděniacute zdrojů upravuje explicitně
22
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
74 Vyacuteslednaacute konfigurace
Daacutele je třeba zmiacutenit AMI šablony ze kteryacutech jsou EC2 instance spouštěny Ty jsempředem připravil tak že jsem na čistyacute operačniacute systeacutem nainstaloval program puppetresp puppetmaster To je prvniacute nutnyacute krok abychom s Puppet infrastrukturou vů-bec mohli začiacutet Daacutele jsem do AMI obrazu pro Puppet Mastera nainstaloval programgit a přidal bdquodeployldquo ssh kliacuteč abych na něj mohl pomociacute Gitu nahraacutet zdrojovyacute koacutedkonfigurace z git repositaacuteře
Manifest je možneacute spustit na libovolneacutem počiacutetači ze ktereacuteho se můžeme připojit donašeho AWS uacutečtu pomociacute aws cli programu Puppet moduly vyžadujiacute pro přihlaacutešeniacutenastaveneacute proměnneacute prostřediacute s přihlašovaciacutemi uacutedaji k AWS uacutečtu AWS_ACCESS_KEY_ID aAWS_SECRET_ACCESS_KEY ktereacute nalezneme ve weboveacutem administračniacutem rozhraniacute AWS
731 Psaniacute Puppet koacuteduParalelně s vytvaacuteřeniacutem vyacutevojoveacuteho prostřediacute můžeme začiacutet připravovat manifesty i prohlavniacute konfiguraci Windows Vyacutevoj konfigurace probiacutehaacute na lokaacutelniacutem počiacutetači pomociacuteobliacutebeneacuteho vyacutevojoveacuteho editoru Pro mnoho programaacutetorskyacutech editorů existujiacute rozšiacuteřeniacutepro jazyk Puppet Při psaniacute koacutedu si již na lokaacutelniacutem počiacutetači můžeme postupně oveřovatspraacutevnost konfigurace pomociacute spouštěniacute pupet lint (statickaacute kontrola Puppet koacutedu)nebo napřiacuteklad psaniacutem unit testů v prostřediacute rspec-puppet
732 Navaacutezaacuteniacute komunikace agentů s masteremPro zahaacutejeniacute komunikace mezi agenty a masterem je třeba proveacutest mezi těmito strojivyacuteměnu a potvrzeniacute ssl certifikaacutetů Komunikace totiž probiacutehaacute zabezpečeně Každyacute agenti master si při prvniacutem spuštěniacute vygeneruje dvojici kliacutečů Agenti při navaacutezaacuteniacute spojeniacute po-šlou k ověřeniacute svůj veřejnyacute kliacuteč masterovi a ten si kliacuteč zařadiacute do skupiny kliacutečů k ověřeniacuteAdministraacutetor potom tyto požadavky na masterovi ověřiacute zkontrolovaacuteniacutem otisku kliacuteče anaacuteslednyacutem přiacutekazem puppet cert sign lthostname agentagt potvrdiacute autenticitu cer-tifikaacutetu Agentovi se vraacutetiacute zpět veřejnyacute kliacuteč mastera ndash potvrzovat nemusiacute nic
Tiacutemto se spustiacute proces spraacutevy konfigurace agenta
733 Nasazeniacute koacutedu na vyacutevojoveacute prostřediacuteKoacuted udržovanyacute v git repositaacuteři potřebujeme nahraacutet na Puppet Master Použiji k tomuprogram r10k Do konfiguračniacuteho souboru etcr10kr10kyml na stroji Puppet Mas-ter zadaacuteme cestu ke git repositaacuteři a cestu kam chceme koacuted umiacutestit (napřiacuteklad přiacutemo doetcpuppet kde ho Puppet očekaacutevaacute) Spuštěniacutem přiacutekazu
r10k deploy environment -p
na stroji Puppet Master zařiacutediacuteme nahraacuteniacute aktuaacutelniacute verze koacutedu z git repositaacuteředo daneacute cesty Program r10k zaacuteroveň vytvořiacute spraacutevnou adresaacuteřovou strukturu vetcpuppetenvironment Pro každou větev v git repositaacuteři připraviacute vlastniacute adresaacuteřa tiacutem může Puppet pracovat s větvemi gitu jako s Puppet Environments ndash tohovyužijeme při nahraacutevaacuteniacute odlišnyacutech verziacute zadaacuteniacute testu pro studenty na vyacuteukoveacute strojeV konfiguraci Puppetu každeacuteho vyacuteukoveacuteho stroje zadaacuteme jedno ze dvou prostřediacute apomociacute větviacute v gitu potom udržujeme rozdiacutely mezi těmito konfiguracemi
74 Vyacuteslednaacute konfiguraceUacutelohu jsem naimplementoval pomociacute třiacute modulů Ovlaacutedajiacute uživatele instalaci programůa soubory se zadaacuteniacutem
23
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
7 Implementace 741 Modul students
Modul students maacute jeden argument a to seznam studentů Podle tohoto argumentuzaložiacute přiacuteslušneacute lokaacutelniacute uživatele nejdřiacutev ovšem zařiacutediacute aby existovala potřebnaacute skupinauživatelů students Každeacutemu uživateli modul založiacute vlastniacute domovskyacute adresaacuteř Bohuželzdroj user neumiacute adresaacuteř založit saacutem a spoleacutehaacute se že již existuje Proto adresaacuteř musiacutemezaložit sami pomociacute zdroje file
class students($students = []
) local user and local group
each($students)|$student|
file CUsers$studentensure =gt directory
user $student
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt CUsers$student
group rsquostudentsrsquo
ensure =gt present
742 Modul classroom programsPro spraacutevu programů použiji spraacutevce baliacuteků chocolatey Pomociacute něj je instalace pro-gramů velice snadnaacute ndash stačiacute použiacutet zdroj package
class classroom_programsinclude rsquochocolateyrsquo
package rsquonotepadplusplusinstallrsquoensure =gt latestprovider =gt chocolatey
package rsquonetbeansrsquo
ensure =gt rsquo73rsquoprovider =gt chocolateyrequire =gt Package[rsquojdk8rsquo]
packagersquojdk8rsquo
ensure =gt rsquo8092rsquoprovider =gt chocolatey
Všimněme si že jsem zde musel vyjaacutedřit zaacutevislost programu NetBeans na jdk8 ndashPuppet o teacuteto zaacutevislosti nic neviacute a proto zde nenastane automatickyacute require
24
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
74 Vyacuteslednaacute konfigurace
743 Modul classroom testNakonec je třeba na vzdaacuteleneacute stroje nahraacutet zadaacuteniacute uacutekolu K tomu naacutem posloužiacute mo-dul classroom_test kteryacute diacuteky parametrizovaneacute šabloně vyplniacute zadaacuteniacute pro každeacutehostudenta individuaacutelně
class classroom_test($students
)
each($students)|$student|
file CUsers$studenttesttxtensure =gt filerequire =gt File[CUsers$student]content =gt template(rsquoclassroom_testtesttxterbrsquo)
Šablona pro zadaacuteniacute s použityacutem parametrem
Zadaacuteniacute testu A pro lt=studentgt
Daacutele majiacute byacutet stroje rozděleny do dvou skupin tak aby každaacute skupina dostala odlišneacutezadaacuteniacute To můžeme elegantně zařiacutedit použitiacutem Puppet Environments V git repositaacuteřik tomu uacutečelu připraviacuteme dvě větve zadaniA a zadaniB Na Puppet Masteru potompomociacute přiacutekazu
r10k deploy environment -p
vytvořiacuteme naacutesledujiacuteciacute adresaacuteřovou strukturu
etcpuppetenvironmentsetcpuppetenvironmentszadaniAetcpuppetenvironemntszadaniB
To je přesně struktura ktereacute Puppet Master rozumiacute a může tak agentům poskytovatdvě různeacute verze manifestů V našem přiacutepadě se manifesty lišiacute praacuteve v šabloně zadaacuteniacute
25
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 8Otestovaacuteniacute funkčnosti implementace
Pro kontrolu spraacutevnosti konfigurace připraviacutem sadu automatickyacutech testů Pro každyacutemanifest připraviacutem sadu unit testů Daacutele pomociacute akceptačniacutech testů psanyacutech v naacutestrojiserverspec budu testovat strukturu vyacutevojoveacuteho prostřediacute a nastaveniacute jednotlivyacutechstrojů
81 Unit testyPro unit testy použiacutevaacutem program rspec-puppet Testy probiacutehajiacute tak že se testovanyacutemanifest spustiacute v odděleneacutem adresaacuteři kde jsou připraveny všechny zaacutevislosti (moduly)pro běh manifestu Naacutesledně se manifest pomociacute programu rspec-puppet nanečistospustiacute (tedy konfigurace doopravdy neměniacute stav systeacutemu) a kontroluje se zda manifestproběhl jak měl
Jako přiacuteklad unit testu zde uvedu test na třiacutedu students
describe rsquostudentsrsquo do
let (title) rsquotest_instancersquo context rsquowith ensure =gt presentrsquo do
let(params) students =gt [rsquotest_studentrsquo]
it is_expectedto compile end
let (title) rsquotest_instancersquo context rsquowith ensure =gt rsquo + instanceState do
let(params) students =gt [rsquotest_studentrsquo test_student1]
it
should contain_file(CUserstest_student)with(
ensure =gt directory
)should contain_file(CUserstest_student1)with(
ensure =gt directory
)should contain_user(test_student)with(
26
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
82 Akceptačniacute testy
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_studentrsquo
)should contain_user(test_student1)with(
ensure =gt presentpassword =gt rsquo123456Abcrsquogroups =gt [rsquostudentsrsquo rsquoRemote Desktop Usersrsquo]home =gt rsquoCUserstest_student1rsquo
)should contain_group(students)with(
ensure =gt present
)
end
end
82 Akceptačniacute testyTesty jsou ve zvlaacuteštniacute variantě pro každyacute ovlaacutedanyacute stroj ndash zde pro stručnost uvedu jedentest pro Puppet Agent
describe user(rsquostudent1rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe user(rsquostudent2rsquo) doit should exist it should belong_to_group rsquostudentsrsquo it should belong_to_group rsquoRemote Desktop Usersrsquo
end
describe file(rsquocUsersstudent1testtxtrsquo) doit should be_file it should contain testu A it should contain student1
enddescribe file(rsquocUsersstudent2testtxtrsquo) do
it should be_file it should contain testu A it should contain student2
27
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
8 Otestovaacuteniacute funkčnosti implementace end
describe user(rsquopuppetrsquo) doit should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
describe package(rsquoNetbeans IDE 73rsquo) doit should be_installed
end
describe package(rsquoNotepad++rsquo) doit should be_installed
end
83 Testovaacuteniacute struktury vyacutevojoveacuteho prostřediacuteKromě testovaacuteniacute vlastniacute implementace konfigurace pro Windows ve vyacutevojoveacutem prostřediacuteje vhodneacute kontrolovat takeacute manifest kteryacutem prostřediacute vytvaacuteřiacuteme Můžeme ho opěttestovat unit testy i akceptačniacutemi testy
Přiacuteklad unit testu v rspec-puppet kteryacute kontroluje modul aws_vpc
describe rsquoaws_vpcrsquo dolet (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it is_expectedto compile end
let (title) rsquotestVpcrsquo context rsquowith ensure =gt presentrsquo do
let(params) ensure =gt rsquopresentrsquovpcName =gt rsquotestVpcrsquo
it
should contain_ec2_vpc(rsquotestVpcrsquo)should contain_ec2_securitygroup(rsquotestVpc-accessrsquo)should contain_ec2_vpc_subnet(rsquotestVpc-subnetrsquo)should contain_ec2_vpc_internet_gateway(rsquotestVpc-igwrsquo)should contain_ec2_vpc_routetable(rsquotestVpc-routesrsquo)
end
end
V prvniacutem testu kontrolujeme zkompilovatelnost modulu a ve druheacutem kontrolujemeže obsahuje definice všech potřebnyacutech AWS zdrojů pro vytvořeniacute kompletniacute siacuteťoveacute in-frastruktury
28
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
84 Dedikovaneacute testovaciacute stroje
Akceptačniacute testy jsou vhodneacute zejmeacutena na kontrolu vyacutechoziacuteho stavu strojů ktereacutese hlaacutesiacute pod spraacutevu Puppet Mastera Tyto stroje lze testovat na spraacutevneacute nastaveniacute aspuštěniacute systeacutemoveacute služby puppet Spraacutevneacute nastaveniacute uživatele pod kteryacutem puppetběžiacute a v přiacutepadě Puppet Mastera můžeme kontrolovat zda maacute všechny předpokladypro staacutehnutiacute zdrojoveacuteho koacutedu konfigurace
Komentovanyacute přiacuteklad testu na kontrolu vyacutechoziacuteho stavu systeacutemu user for connecting to machinedescribe user(rsquopuppetrsquo) do
it should exist it should belong_to_group(rsquoAdministratorsrsquo)
end
We need git for fetching configuration from git repositorydescribe package(rsquoGit version 283rsquo) do
it should be_installed end
We need powershell executing of remote commandsdescribe Windows_feature(rsquoPowershellrsquo) do
it should be_installedby(powershell)with_version(40) end
ExecutionPolicy for running powershell scriptsdescribe command(rsquoGet-ExecutionPolicyrsquo) do
its(stdout) should contain rsquoUnrestrictedrsquoend
We need port 3389 for connecting to machine via winrm protocoldescribe port(3389) do
it should be_listening end
Obviously we need running Puppet servicedescribe service(rsquopuppetrsquo) do
it should be_installed it should be_enabled it should be_running it should have_start_mode(Automatic)
end
84 Dedikovaneacute testovaciacute strojePro běh testů jsem vyhradil zvlaacuteštniacute stroje uvnitř vyacutevojoveacuteho prostřediacute Je třeba nanich udržovat instalace testovaciacutech naacutestrojů a je tedy vhodneacute je zapojit do spravovaneacuteinfrastruktury Dalšiacute důvod proč jsem se rozhodl spouštět testy na strojiacutech uvnitř vyacutevo-joveacuteho prostřediacute je fakt že zejmeacutena akceptačniacute testy v naacutestroji serverspec přistupujiacute ktestovanyacutem strojům pomociacute jejich hostname a v teacuteto praacuteci udržuji dns zaacuteznamy strojůpouze ve vnitřniacute siacuteti
841 Rozděleniacute testů na Windows a UnixPůvodně jsem chtěl spouštět všechny testy na jedinneacutem linuxoveacutem stroji Při tomjsem ovšem narazil na probleacutem při unit testech manifestů pro Windows Naacutestroj
29
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
8 Otestovaacuteniacute funkčnosti implementace rspec-puppet se pokusiacute nanečisto zdroje aplikovat ndash napřiacuteklad při testovaacuteniacute instalaceprogramu ho ve skutečnosti neinstaluje ale zkusiacute zdroj package vytvořit aby proběhlynapřiacuteklad kontroly parametrů K aplikovaacuteniacute zdrojů jim ale Puppet musiacute rozumět aimplementace linuxu pochopitelně očekaacutevaacute zdroje ve formaacutetu pro Unix a definici zdrojůWindows vůbec nerozumiacute Napřiacuteklad pokud se pokusiacuteme validovat vytvořeniacute souborucsoubortxt na linuxoveacutem stroji rspec-puppet naacutem řekne že je cesta k souborunespraacutevně zadanaacute a že maacuteme zadat plnou cestu od kořene filesysteacutemu Linuxovaacuteimplementace nerozumiacute formaacutetu cesty Windows Podobnaacute situace nastane při volaacuteniacutevlastniacuteho přiacutekazu pomociacute programu powershell Na linuxu zahlaacutesiacute rspec-puppetchybu neznaacutemeacuteho provideru
85 Test driven developmentDiacuteky vyacuteše zmiacuteněnyacutem testovaciacutem technikaacutem můžeme uplatnit i programovaciacute styl TestDriven Development Tedy uacutezkeacute propojeniacute psaniacute testů a vyacutekonneacuteho koacutedu kdy je každaacutečaacutest vyacutekonneacuteho koacutedu napsaacutena jako reakce na neprochaacutezejiacuteciacute test Důsledneacute testovaacuteniacute jevelice vhodneacute praacutevě v přiacutepadě psaniacute koacutedu konfigurace protože přes všechny automati-zujiacuteciacute naacutestroje znamenaacute rozbitiacute testovaciacuteho prostřediacute vyacuteraznějšiacute časoveacute zdrženiacute než vpřiacutepadě rozbitiacute koacutedu nativniacuteho programu psaneacuteho v tradičniacutem programovaciacutem jazyku
86 Vyacutesledky testůV teacuteto kapitole prezenuji vyacutesledky běhu testů zvoleneacute konfigurace systeacutemu Rozděliljsem testy na tři zaacutekladniacute čaacutesti ndash testy samotneacute siacuteťoveacute infrastruktury AWS testy na-staveniacute strojů pro spouštěniacute testů a konečně testy samotneacute konfigurace Puppet agentů
861 Vyacutesledky testů siacuteťoveacute infrastruktury
use case vyacutesledekModul lze zkompilovat PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc subnet PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc internet gateway PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 vpc routetable PASSPři zaklaacutedaacuteniacute siacutetě je do katalogu zařazen modul ec2 securitygroup PASS
Tabulka 81 Vyacutesledky unit testů modulu aws vpc
V tabulce 82 jsou uvedeny testy zaacutekladniacutech konfiguraciacute testů Je to praacutevě modulaws_vpc kteryacute je za tuto konfiguraci zodpovědnyacute protože určuje AMI šablony ze kte-ryacutech se stroje spouštiacute Strojů maacuteme celkem pětStroj na testovaacuteniacute WindowsStroj na testovaacuteniacute UnixuPuppet Master2x Puppet agent
Daacutele kontroluji dostupnost strojů v siacuteti 83 Řaacutedky představujiacute pokusy o spojeniacutestroje v leveacutem sloupci s ostatniacutemi Přiacuteznak NA naznačuje že komunikace mezi těmitostroji neniacute potřebnaacute a tak se netestovala Napřiacuteklad testovaciacute stroje nepotřebujiacute vidětna žaacutedneacute okolniacute stroje
30
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
86 Vyacutesledky testů
Daacutele uvaacutediacutem seznam use case pro ověřeniacute funkčnosti nastaveniacute Na tento seznam seodkazuji z tabulky 82 Usecase1 - stroj se může spojit s vnějšiacutem internetemUsecase2 - stroj maacute nainstalovanyacute program puppetUsecase3 - na stroji je spuštěnaacute služba puppetUsecase4 - na stroji je nainstalovaacuten program gitUsecase5 - na stroji je nainstalovaacuten ssh kliacuteč pro přiacutestup k repositaacuteři
use case testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Usecase1 PASS PASS PASS PASS PASSUsecase2 PASS PASS PASS PASS PASSUsecase3 PASS PASS PASS PASS PASSUsecase4 PASS PASS PASS FAIL FAILUsecase5 PASS PASS PASS FAIL FAIL
Tabulka 82 Vyacutesledky akceptačniacutech testů modulu aws vpc
zahaacutejeniacute komunikace testovaciacute Windows testovaciacute Unix Master Agent1 Agent2Testovaciacute Windows NA NA NA NA NATestovaciacute Unix NA NA NA NA NAMaster NA NA PASS PASS PASSAgent1 NA NA PASS NA NAAgent2 NA NA PASS NA NA
Tabulka 83 Vyacutesledky akceptačniacutech testů modulu aws vpc - siacuteťovaacute komunikace
862 Vyacutesledky testů testovaciacutech strojůPro testovaciacute stroje je manifest velice jednoduchyacute ndash pouze nainstalovaacuteniacute několika pro-gramů Proto jsem unit testy vypustil a zaměřil se pouze na akceptačniacute testy 84
nainstalovanyacute program testovaciacute Windows testovaciacute Unixruby PASS PASSruby-dev PASS PASSrspec PASS PASSrspec-puppet PASS PASSrake PASS PASS
Tabulka 84 Vyacutesledky akceptačniacutech testů konfigurace testovaciacutech strojů
863 Vyacutesledky testů agentůPosledniacute čaacutest teacuteto kapitoly se věnuje testům spravovanyacutech Puppet agentů
Bylo třeba otestovat tři moduly - students classroom_test a classroom_programs
V tabulce akceptačniacutech testů 88 je vidět jak se lišiacute konfigurace pro stroje agent1 aagent2 diacuteky rozdiacutelneacutemu Puppet prostřediacute
864 Ukaacutezka reportovaciacuteho naacutestroje rspecTestovaciacute naacutestroj Rspec nabiacuteziacute různeacute reportovaciacute naacutestroje pro zobrazeniacute vyacutesledků
běhu testů Na obraacutezku 81 je vyacuteřez html straacutenky s vyacutesledky běhu testu pomociacute htmlreportovaciacuteho naacutestroje
31
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
8 Otestovaacuteniacute funkčnosti implementace use case vyacutesledek
Modul lze zkompilovat PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul file typu adresaacuteř PASSDo katalogu zařazen modul user se jmeacutenem student1 PASSDo katalogu zařazen modul user se jmeacutenem student2 PASSDo katalogu zařazen modul group se jmeacutenem students PASS
Tabulka 85 Vyacutesledky unit testů modulu students s parametrem student1 a student2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student1 PASSDo katalogu zařazen modul file s obsahuje text Zadaacuteniacute testu A pro student2 PASS
Tabulka 86 Vyacutesledky unit testů modulu classroom test s parametrem student1 astudent2
use case vyacutesledekModul lze zkompilovat PASSDo katalogu zařazen modul package s naacutezvem programu NetBeans PASSDo katalogu zařazen modul package s naacutezvem programu NotepadPlusPlus PASSDo katalogu zařazen modul package s naacutezvem programu jdk8 PASS
Tabulka 87 Vyacutesledky unit testů modulu classroom programs
32
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
86 Vyacutesledky testů
Seznam use case pro akceptačniacute testy s parametrem student1 a student2Usecase1 stroj maacute založenou skupinu uživatelů studentsUsecase2 stroj maacute založeneacuteho uživatele student1Usecase3 stroj maacute založeneacuteho uživatele student2Usecase4 na stroji je nainstalovaacuten program Notepad++Usecase5 na stroji je nainstalovaacuten program NetBeansUsecase6 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student1Usecase7 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu A pro student2Usecase8 v domovskeacutem adresaacuteři uživatele student1 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student1Usecase9 v domovskeacutem adresaacuteři uživatele student2 existuje soubor testtxt a obsa-huje text Zadaacuteniacute testu B pro student2
use case Agent1 Agent2Usecase1 PASS PASSUsecase2 PASS PASSUsecase3 PASS PASSUsecase4 PASS PASSUsecase5 PASS PASSUsecase6 PASS FAILUsecase7 PASS FAILUsecase8 FAIL PASSUsecase9 FAIL PASS
Tabulka 88 Vyacutesledky akceptačniacutech testů Puppet agentů
Obraacutezek 81 Report běhu rspec testu
33
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Kapitola 9Zaacutevěr
V teacuteto praacuteci jsem představil problematiku spraacutevy počiacutetačoveacute infrastruktury s operačniacutemsysteacutemem Windows pomociacute naacutestroje Puppet Nejprve jsem přestavil naacutestroj Puppetjako naacutestroj pro konfiguraci infrastruktury (IaC) Uvedl jsem zaacutekladniacute principy Puppetua srovnal je s vybranyacutemi alternativniacutemi naacutestroji
Daacutele jsem rozebral konkreacutetniacute prostředky kteryacutemi Puppet dokaacuteže spravovat zdrojeoperačniacuteho systeacutemu Windows a srovnal použitiacute těchto prostředků na Windows a Unixu
Prozkoumal jsem prostřediacute AWS a navrhl jak ho lze použiacutet jako testovaciacute prostřediacutepro vyacutevoj konfigurace Zaacuteroveň jsem ukaacutezal jak lze použiacutet samotnyacute Puppet pro ovlaacutedaacuteniacuteAWS
S testovaciacutem prostřediacutem uacutezce souvisiacute automatickeacute testy Představil jsem rozděleniacutetestů na několik kategoriiacute ndash statickaacute kontrola zdrojoveacuteho koacutedu Puppetu unit testy anakonec akceptačniacute testy
Věnoval jsem se udržovaacuteniacute koacutedu Puppetu v git repositaacuteři Popsal jsem jak diacutekykonfiguračniacutemu souboru Puppetfile můžeme udržovat seznam zaacutevislostiacute našiacute konfiguracena veřejně dostupnyacutech modulech Daacutele jsem předvedl jak lze efektivně použiacutet Git proudržovaacuteniacute různyacutech verziacute konfigurace pro různaacute prostřediacute a jak je lze pomociacute programur10k snadno nasazovat
Nakonec jsem implementoval konkreacutetniacute přiacuteklady konfigurace v testovaciacutem prostřediacuteAWS a oveřil pomociacute automatickyacutech testů spraacutevnost konfigurace
34
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Literatura[1] LOSCHWITZ Martin Choosing between the leading open source configuration
managers ADMIN [online] 2014(23) [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[2] Srovnaacuteniacute deklarativniacuteho a imperativniacuteho stylu spraacutevy konfigurace [online] [cit2016-02-15] Dostupneacute zhttpswwwupguardcomblogarticlesdeclarative-vs-imperative-models-for-configuration-management
[3] Srovnaacuteniacute CM naacutestrojů Puppet a Ansible [online] [cit 2016-05-20] Dostupneacute zhttps ifireball wordpress com 2015 01 03 comparison-of-puppet-and-ansible
[4] Idempotence - wiki [online] [cit 2016-03-10] Dostupneacute zhttpscswikipediaorgwikiIdempotence
[5] TURK TYLER TESTING ANSIBLE IDEMPOTENCY [online] 2016 [cit 2016-04-05] Dostupneacute zhttptylerturkcomtesting-ansible-idempotency
[6] KANIES Luke [online] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblogwhy-puppet-has-its-own-configuration-language
[7] Srovnaacuteniacute Open Source Puppet s Enterprise Puppet [online] [cit 2016-05-20] Do-stupneacute zhttpswwwupguardcomarticlesopen-source-puppet-vs-puppet-enterprise-which-is-right-for-you
[8] Licence Open Source Puppet [online] [cit 2016-05-03] Dostupneacute zhttpsgithubcompuppetlabspuppetblobmasterLICENSE
[9] Srovnaacuteniacute komerčniacute a opensource verze Puppetu [online] [cit 2016-05-20] Dostupneacutezhttpspuppetcomenterprise-and-open-source
[10] Manuaacuteloveacute straacutenky pro Puppet modul Apache [online] [cit 2016-04-23] Dostupneacutezhttpsforgepuppetcompuppetlabsapache
[11] Manuaacuteloveacute straacutenky pro Puppet modul apt [online] [cit 2016-04-12] Dostupneacute zhttpsforgepuppetcompuppetlabsapt
[12] ARUNDEL John Puppet 3 Cookbook Birmingham Packt Publishing Ltd 201314-29
[13] FERNANDO Chanaka Udaya Kumara How puppet works in your IT in-frastructure [online] 2013 [cit 2016-03-21] Dostupneacute zhttpsoatutorialsblogspotcz2013_11_01_archivehtml
[14] Manuaacuteloveacute straacutenky virtuaacutelniacutech zdrojů Puppet [online] [cit 2016-05-03] Dostupneacutezhttpsdocspuppetcompuppet37referencetypehtml
35
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Literatura [15] TURNBULL James a Jeffrey MCCUNE Pro Puppet Birmingham Apress 2013
7-11 65-88[16] Diagram komunikace mezi Puppet Masterem a Puppet Agent Nodem [online] [cit
2016-04-05] Dostupneacute zhttpsdocspuppetcomguidesplatformshtml
[17] Puppet supported platforms [online] [cit 2016-05-10] Dostupneacute zhttps docs puppet com puppetserver 2 4 services master puppetserver htmlsupported-platforms
[18] Nabiacutedka instalačniacutech souborů Puppetu pro Windows [online] [cit 2016-05-03]Dostupneacute zhttps downloads puppetlabs com windows _ga = 1 109402881 525074775 1462901197
[19] WEINS Kim Cloud Computing Trends 2016 State of the Cloud Survey [online]2016 [cit 2016-05-10] Dostupneacute zhttp www rightscale com blog cloud-industry-insights cloud-computing-trends-2016-state-cloud-survey
[20] Představeniacute podpory Puppetu pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpsdocspuppetcomwindows
[21] BENNETT Liam Puppet on Windows [online] 2013 [cit 2016-05-20] Dostupneacutezhttpwwwliamjbennettmepost2013-10-06-puppet-on-windows-part-1
[22] Modul pri ovlaacutedaacuteniacute acl přiacutestupu [online] [cit 2016-04-25] Dostupneacute zhttpsforgepuppetcompuppetlabsacl
[23] Oficiaacutelniacute dokumentace pro Windows services [online] [cit 2016-05-20]Dostupneacute zhttps msdn microsoft com en-us library system serviceprocess servi-cestartmode(v=vs110)aspx
[24] Spraacutevce programů pro Windows [online] [cit 2016-05-20] Dostupneacute zhttpschocolateyorg
[25] REYNOLDS Rob Chocolatey using Chocolatey with Puppet [online] 2016 [cit2016-05-20]Dostupneacute zhttpspuppetcomblogchocolatey-using-chocolatey-puppet
[26] Program facter pro ziacuteskaacutevaacuteniacute infromaciacute o systeacutemu [online] [cit 2016-04-25] Do-stupneacute zhttpsgithubcompuppetlabsfacter
[27] REYNOLDS Rob Puppet Making Windows Awesome Since 2011 [online] 2014[cit 2016-05-20] Dostupneacute zhttpcodebettercomrobreynolds20140806puppet-making-windows-awesome-since-2011
[28] Modul pri ovlaacutedaacuteniacute Active Directory [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomjrivierewindows_ad
[29] Modul pro ovlaacutedaacuteniacute přiacuteslušnosti do Active Directory [online] [cit 2016-05-03] Do-stupneacute zhttpsforgepuppetcomtrlinkindomain_membership
36
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
[30] Dokumentace parametrů připojeniacute do Active Directory [online] [cit 2016-04-10]
Dostupneacute zhttpsmsdnmicrosoftcomen-uslibraryaa392154(v=vs85)aspx
[31] Oficiaacutelniacute dokumentace k ACL [online] [cit 2016-05-20] Dostupneacute zhttpsmsdnmicrosoftcomen-uslibrarywindowsdesktopaa374872(v=vs85)aspx
[32] Představeniacute přiacutestupu Puppetu k ACL [online] [cit 2016-05-20] Dostupneacute zhttps puppet com blog managing-permissions-on-windows-access-control-lists
[33] Nabiacutedka Puppet modulů pro windows [online] [cit 2016-05-20] Dostupneacute zhttpsforgepuppetcomtagswindows
[34] Soubor užitečnyacutech Puppet modulů pro Windows [online] [cit 2016-05-20] Dostupneacutezhttpsgithubcompuppetlabspuppetlabs-windows
[35] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute zhttppuppet-lintcom
[36] RHETT Jo Learning puppet 4 Sebastopol OrsquoReilly Media Inc 2015 177-188[37] Testovaciacute knihovna pro Puppet [online] [cit 2016-05-20] Dostupneacute z
httprspec-puppetcom
[38] Testovac9 framework Rspec [online] [cit 2016-05-20] Dostupneacute zhttpwwwrspecinfo
[39] PURVINE-RILEY Branan The Next Generation of Puppet Module Testing [on-line] 2012 [cit 2016-05-20] Dostupneacute zhttpspuppetcomblognext-generation-of-puppet-module-testing
[40] Podpora cloudovyacutech prostřediacute v Puppetu [online] [cit 2016-05-20] Dostupneacute zhttpspuppetcomsolutionscloud-management
[41] FRANCESCHI Alessandro Extending Puppet Packt Publishing 2014 194-197[42] Puppet Modul pro spraacutevu AWS [online] [cit 2016-05-20] Dostupneacute z
httpsgithubcompuppetlabspuppetlabs-aws
37
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39
Přiacuteloha ASlovniacuteček
ACL Access control listAD Active DirectoryAMI Amazon Machine ImagesAWS Amazon Web ServicesCCA tool Continuous Configuration AutomationCM tool Configuration Management toolDSC Desired State ConfigurationEC2 Elastic Compute CloudIaC Infrastructure as CodeIGW Internet GatewayVPC Virtual Private Cloud
39