ProHoster > blog > administratie > Instructies: hoe u weerwortrollen kunt testen en problemen kunt ontdekken vóór de productie
Instructies: hoe u weerwortrollen kunt testen en problemen kunt ontdekken vóór de productie
Hallo iedereen!
Ik werk als DevOps-ingenieur bij een hotelboekingsservice. Ostrovok.ru. In dit artikel wil ik het hebben over onze ervaringen met het testen van weerwortrollen.
Bij Ostrovok.ru gebruiken we ansible als configuratiemanager. Onlangs kwamen we tot de noodzaak om rollen te testen, maar het bleek dat er niet zo veel tools hiervoor zijn - het meest populaire is misschien het Molecule-framework, dus besloten we het te gebruiken. Maar het bleek dat zijn documentatie over veel valkuilen zwijgt. We konden geen voldoende gedetailleerde handleiding in het Russisch vinden, dus besloten we dit artikel te schrijven.
molecule
Molecuul - een raamwerk om weerweerbare rollen te helpen testen.
Vereenvoudigde beschrijving: het molecuul maakt een instantie op het platform dat u opgeeft (cloud, virtuele machine, container; zie voor meer details de sectie bestuurder), voert uw rol erop uit, voert vervolgens tests uit en verwijdert de instantie. Als een van de stappen mislukt, zal de Molecule u hierover informeren.
Nu meer.
Een beetje theorie
Beschouw twee belangrijke entiteiten van het molecuul: Scenario en Driver.
Scenario
Het script bevat een beschrijving van wat, waar, hoe en in welke volgorde er wordt uitgevoerd. Eén rol kan meerdere scripts hebben, en elk is een map langs het pad <role>/molecule/<scenario>, dat beschrijvingen bevat van de acties die nodig zijn voor de test. Script moet worden opgenomen default, die automatisch wordt aangemaakt als u de rol initialiseert met een molecuul. De namen van de volgende scripts zijn aan jou.
De reeks testacties in een script wordt genoemd Matrix, en standaard is dit:
(Stappen gelabeld ?, standaard overgeslagen als dit niet is opgegeven door de gebruiker)
lint - lopende linters. Standaard worden gebruikt yamllint и flake8,
destroy - het verwijderen van instanties van de laatste lancering van de Molecule (indien aanwezig),
dependency? — installatie van de weerwerende afhankelijkheid van de geteste rol,
syntax - het controleren van de syntaxis van de rol die gebruikt wordt ansible-playbook --syntax-check,
create - een exemplaar maken,
prepare? — voorbereiding van de instantie; controleer/installeer bijvoorbeeld Python2
converge — lancering van het draaiboek dat wordt getest,
idempotence - het draaiboek voor de idempotentietest opnieuw opstarten,
side_effect? - acties die niet direct verband houden met de rol, maar wel noodzakelijk zijn voor tests,
verify - tests uitvoeren van de resulterende configuratie met behulp van testinfra(standaard) /goss/inspec,
cleanup? - (in nieuwe versies) - grofweg het "reinigen" van de externe infrastructuur die door de Molecule wordt beïnvloed,
destroy - Een exemplaar verwijderen.
Deze volgorde dekt de meeste gevallen, maar kan indien nodig worden gewijzigd.
Elk van de bovenstaande stappen kan afzonderlijk worden uitgevoerd met molecule <command>. Maar het moet duidelijk zijn dat er voor elk van deze cli-commando's een eigen reeks acties kan zijn, die u kunt achterhalen door het uitvoeren van molecule matrix <command>. Bijvoorbeeld bij het uitvoeren van de opdracht converge (door het testboek uit te voeren), worden de volgende acties uitgevoerd:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
De volgorde van deze acties kan worden bewerkt. Als iets uit de lijst al is gedaan, wordt dit overgeslagen. De huidige status, evenals de configuratie van de instanties, slaat de Molecule op in de map $TMPDIR/molecule/<role>/<scenario>.
Voeg stappen toe met ? u kunt de gewenste acties beschrijven in het ansible-playbook-formaat en de bestandsnaam maken volgens de stap: prepare.yml/side_effect.yml. Verwacht deze bestanden. Het molecuul bevindt zich in de scriptmap.
bestuurder
Een driver is een entiteit waarin testinstanties worden gemaakt.
De lijst met standaard drivers waarvoor Molecule templates klaar heeft staan is als volgt: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
In de meeste gevallen zijn sjablonen bestanden create.yml и destroy.yml in de scriptmap die respectievelijk het maken en verwijderen van een exemplaar beschrijft.
De uitzonderingen zijn Docker en Vagrant, omdat interacties met hun modules kunnen plaatsvinden zonder de bovengenoemde bestanden.
Het is de moeite waard om het gedelegeerde stuurprogramma te benadrukken, omdat als het wordt gebruikt in de bestanden voor het maken en verwijderen van een exemplaar, alleen het werk met de configuratie van exemplaren wordt beschreven, de rest moet door de ingenieur worden beschreven.
Het standaardstuurprogramma is Docker.
Laten we nu verder gaan met oefenen en verdere functies daar overwegen.
Aan de slag
Laten we als "hallo wereld" een eenvoudige nginx-installatierol testen. Laten we docker als stuurprogramma kiezen - ik denk dat de meesten van jullie het geïnstalleerd hebben (en onthoud dat docker het standaardstuurprogramma is).
Laten we ons voorbereiden virtualenv en installeer daarin molecule:
De volgende stap is het initialiseren van de nieuwe rol.
Initialisatie van een nieuwe rol, evenals een nieuw script, wordt uitgevoerd met behulp van de opdracht molecule init <params>:
> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars
6 directories, 1 file
Het bleek een typische weerwortrol. Verder vinden alle interacties met CLI-moleculen plaats vanuit de basis van de rol.
Laten we eens kijken wat er in de rolmap staat:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Laten we de configuratie analyseren molecule/default/molecule.yml (vervang alleen docker-afbeelding):
Shell is slechts een commandoshell die wordt gebruikt als Galaxy en Gilt niet aan uw behoeften voldoen.
Ik zal hier niet lang blijven wonen, het is genoeg beschreven documentatie.
bestuurder
De naam van de bestuurder. Die van ons is dokwerker.
pluis
Het linter is yamllint.
Handige opties in dit deel van de configuratie zijn de mogelijkheid om een configuratiebestand voor yamllint te specificeren, omgevingsvariabelen door te sturen of de linter uit te schakelen:
Beschrijft de configuratie van de instances.
In het geval van docker als driver wordt de Molecule herhaald in deze sectie en is elk element van de lijst beschikbaar in Dockerfile.j2 als variabele item.
In het geval van een bestuurder die dit vereist create.yml и destroy.yml, de sectie is daarin beschikbaar als molecule_yml.platforms, en iteraties erover worden al beschreven in deze bestanden.
Omdat de Molecule controle geeft over instances van weerwortmodules, moet daar ook naar de lijst met mogelijke instellingen worden gezocht. Voor docker wordt bijvoorbeeld de module gebruikt docker_container_module. Welke modules in andere stuurprogramma's worden gebruikt, kunt u vinden in documentatie.
Evenals voorbeelden van het gebruik van verschillende stuurprogramma's zijn te vinden in de tests van het molecuul zelf.
Vervang hier cent: 7 op ubuntu.
bevoorrader
"Leverancier": een entiteit die instanties beheert. In het geval van Molecule is dit een weersbaard, ondersteuning voor anderen is niet gepland, dus deze sectie kan met een voorbehoud de weersbaarde uitgebreide configuratie worden genoemd.
Hier kun je veel dingen specificeren, ik zal naar mijn mening de belangrijkste punten benadrukken:
playbooks: u kunt opgeven welke draaiboeken in bepaalde fasen moeten worden gebruikt.
Naam en beschrijving van scriptreeksen.
U kunt de standaard actiematrix van elke opdracht wijzigen door de sleutel toe te voegen <command>_sequence en als waarde ervoor door de lijst met stappen te definiëren die we nodig hebben.
Laten we zeggen dat we de volgorde van acties willen wijzigen bij het uitvoeren van de opdracht Playbook run: molecule converge
Opzetten van een raamwerk voor testen en een vervolg daarop. De standaardlinter is testinfra и flake8. De mogelijke opties zijn dezelfde als hierboven:
Onze eenvoudige rol werd zonder problemen getest.
Het is de moeite waard eraan te denken dat als er problemen zijn tijdens het werk molecule test, en als u de standaardreeks niet hebt gewijzigd, zal de Molecule de instantie verwijderen.
De volgende opdrachten zijn handig voor foutopsporing:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Bestaande rol
Het toevoegen van een nieuw script aan een bestaande rol is uit de rollenmap met de volgende commando's:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
Als dit het eerste scenario in de rol is, dan de parameter -s kan worden weggelaten omdat er dan een script wordt gemaakt default.
Conclusie
Zoals u kunt zien, is de Molecule niet erg complex, en door uw eigen sjablonen te gebruiken, kan het implementeren van een nieuw script worden beperkt tot het bewerken van variabelen in de playbooks voor het maken en verwijderen van instanties. Het molecuul integreert naadloos met CI-systemen, waardoor u de ontwikkelingssnelheid kunt verhogen door de tijd voor het handmatig testen van playbooks te verkorten.
Bedankt voor uw aandacht. Als je ervaring hebt met het testen van weerwortrollen, en het is niet gerelateerd aan het molecuul, vertel het ons dan in de reacties!