Hoeveel mensen hier maken gebruik van Puppet in hun acceptatie en/of productieomgeving? Hoeveel daarvan gebruiken Puppet ook om middleware te installeren en te configureren? En hoeveel daarvan gebruiken puppet ook om de applicatie instellingen en installatie ta managen.
Robert keek naar de planning. Eigenlijk zou hij blij moeten zijn. Waar vroeger het inrichten van de systemen een belangrijk stuk van de planning kostte, was dat nu een non-issue. Sinds ze Puppet gebruikte voor het inspoelen en inrichten van de systemen, was dat in een vloek en een zucht gedaan. En het was niet alleen snel, het was ook nog eens kwalitatief veel beter dan voorheen.
Nee, het probleem was wat daarna kwam. Het installeren en inrichten van de middleware en de applicaties. Dat duurde nog steeds weken voordat dat klaar was . Het leek wel of ze daar nog in de middeleeuwen waren. Alles werd met het handje gedaan. Er waren lange draaiboeken, overigens ook nog vaak met veel fouten erin.
Zou het niet mooi zijn als wat ze geleerd hadden met de inrichting van systemen, ook door konden trekken naar middleware en applicaties. Zou het niet mooi zijn als ze puppet konden gebruiken om ook dit onderdelen op de systemen te zetten en op de juiste manier te configureren. Dan zouden ze heel snel van van niets een draaiende applicatie neer kunnen zetten.
Hoe meer Robert er over na dacht, hoe meer hij het idee opvatte om de lat hoger te leggen. De lat hoger had in dit geval een dubbele betekenis. Naast de gangbare betekenis van de uitdaging aangaan, zag Robert de uitspraak ook als een metafoor voor de inzet van Puppet. Waar Puppet meestal ingezet werd voor OS en direct daarna gerelateerde zaken, ging hij kijken hoe hij de toepassing van Puppet kon uitbreiden naar hoger gelegen lagen van de stack.
Wat kon Robert bedenken om ook middleware en applicaties te installeren met behulp van Puppet.
Als eerste dacht Robert natuurlijk aan Exec’s en define’s. Alles wat hij kon doen met shell scriptjes, kon hij natuurlijk ook binnen Puppet uit laten voeren door een serie van Exec declaraties. Eigenlijk heel er triviaal.
Maar toen Robert hiermee begon, kwam hij er al snel achter dat hier ook wel wat nadelen aan kleefde
Hij merkte dat hij al snel een set van statements aan elkaar aan het linken was. Eigenlijk was hij procedureel aan programmeren in Puppet. Dit terwijl Puppet juist gemaakt was om declaratief vast te leggen hoe je systeem er uit moest zien.
Deze mismatch tussen procedureel en declaraties, zorgde er ook al snel voor dat zijn manifests moeilijk leesbaar en moeilijk onderhoudbaar werden. Ook bevatte de manifests eigenlijk veel boilerplate code. Veel requires en before’s waren nodig om de samenhang tussen de verschillende Exec’s te regelen.
Door alle exec’s wordt ook de output van een puppet-run erg ‘lawaai’. Er komen veel regels in de output en het is moeilijk te achterhalen wat er allemaal gebeurt. Laat staan of het goed gaat of fout gaat.
Puppet heeft ook een mogelijkheid om zelf types te ontwikkelen. Dit worden ook wel custom types genoemd
Custom types zijn erg krachtig. Je kunt de puppet DSL er mee uitbreiden. De custom types zijn geprogrammeerd in Ruby. Je kunt er eigenlijk alles mee doen wat je wil. Puppet heeft allerlei voorzieningen om met je host systeem te interacteren.
Een van de grote voordelen die Robert zag, was dat je de DSL aanpak van Puppet bleef gebruiken. Zoals al gezegd, Dat betekende dat je heel goed in staat bleef om je systeem te beschrijvenderwijs vast te leggen in plaats van procedureel.
Maar niet alles was rozengeur en maneschijn. Er bleek erg weinig documentatie over hoe je een custom type moest programmeren. Ook waren er erg specifieke flow’s door de types heen die lastig te doorgronden waren. Al met al bleek de leercurve erg stijl.
Toen Robertwat verder rondsnuffelde op de Forge, vond hij easy_type. Dat zag er interessant uit
Met easy_type werd een gedeelte van de specifieke puppetkennis weggehouden. Zo hoefde Robert niet meer te weten hoe de specifieke puppet flow er uitzag. Easy_type regelde dat voor een belangrijk gedeelte voor je
Door easy_type te gebruiken, kon hij zich focussen op de kennis van het te beheren object. Hoe haal ik de informatie op van het systeem, hoe maak ik het object aan, hoe wijzig ik het object en hoe haal ik het weer weg.
Na wat knutselen, was Robert in staat al snel een custom type te maken.
Zullen we eens gaan kijken hoe hij dat deed?
Zullen we eens gaan kijken hoe hij dat deed?
Voordat Robert met Easy_type aan de slag kon, moest hij het eerst installeren. Easy_type is zelf ook een module en daardoor kun je de reguliere puppet tools gebruiken om het te installeren.
Elk custom type is onderdeel van een module. Dus om een custom type te maken, meost Robert eerst een module aanmaken. Om dit te doen maakte robert gebruik van de Puppet module generator. Deze generator maakte alle benodigde directoeries aan en zorgde ook voor de files die de noodzakelijke meta informatie van de module bevatte.
Ok. Nu was alles klaar om te starten met de custom type. In de documentatie zag Robert dat easy_type een paar generatoren had waarmee je de basis zaken kon genereren. Eerst maar eens een scaffold doen. De scaffolf maakte de noodzakelijek directories aan. Ook maakte de scaffolfd een definitie aan van een type met daarin een parameter, namelijk de naam. Ook zorgde de scaffolfd voor een standaard provider, namelijk de simple.rb provider.
Allereerst de basis structuur van een custom type. Dit is niet specifieke voor easy_type, maar geldt voor alle custom types. Types kennen parameters en proporties.
Een property is een waarde van een object, waarbij een wijziging betekent, dat je ook op het systeem iets moet veranderen. Als je bijvoorbeeld de home directory van een gebruiker veranderd in de manifest, dan wil je ook graag dat het custom type daadwerkelijk een verandering aanbrengt op het systeem. Dit soort eigenschappen van objecten noemen we properties.
Waar een wijziging van de waarde van een property leidt tot een wijziging op het systeem, geldt dat voor een parameter niet Een parameter kent geen state.
Ook wordt de naam parameter gebruikt om een object op een systeem uniek te identificeren. Het naam attribute is al aangemaakt door de scaffolder en deze hoeven we niet meer apart aan te maken.
Easy_type heeft ook generatoren voor het aanmaken van parameter en properties
Hiermee hebben we de basis gelegd voor ons eigen custom_package type.
Met alleen deze akties, heeft Robert puppet al in staat gesteld om een basisoverzicht te creeeren van de resources die er op het systeem aanwezig zijn.