Návod: ako otestovať Ansible role a zistiť problémy pred výrobou
Ahoj všetci!
Pracujem ako inžinier DevOps pre hotelovú rezervačnú službu. Ostrovok.ru. V tomto článku chcem hovoriť o našich skúsenostiach s testovaním rolí Ansible.
Na Ostrovok.ru používame ansible ako správcu konfigurácie. Nedávno sme dospeli k potrebe testovať roly, ale ako sa ukázalo, nie je na to veľa nástrojov - asi najobľúbenejší je rámec Molecule, takže sme sa ho rozhodli použiť. Ale ukázalo sa, že jeho dokumentácia o mnohých nástrahách mlčí. Nenašli sme dostatočne podrobného sprievodcu v ruštine, preto sme sa rozhodli napísať tento článok.
molekula
Molekula — rámec na pomoc pri testovaní rolí Ansible.
Zjednodušený popis: Molecule vytvorí inštanciu na platforme, ktorú určíte (cloud, virtuálny stroj, kontajner; ďalšie podrobnosti nájdete v časti Vodič), spustí na ňom vašu rolu, potom spustí testy a odstráni inštanciu. Ak dôjde k zlyhaniu jedného z krokov, Molekula vás na to upozorní.
Teraz viac.
Niektoré teórie
Uvažujme o dvoch kľúčových entitách molekuly: Scenár a Vodič.
Scenár
Skript obsahuje popis toho, čo, kde, ako a v akom poradí sa bude vykonávať. Jedna rola môže mať niekoľko skriptov a každý je adresár pozdĺž cesty <role>/molecule/<scenario>, ktorá obsahuje popisy činností požadovaných pre test. Musí existovať scenár default, ktorý sa automaticky vytvorí, ak rolu inicializujete pomocou Molecule. Názvy nasledujúcich skriptov sú podľa vášho uváženia.
Postupnosť testovacích akcií v skripte sa nazýva maticea predvolene je to takto:
(Označené kroky ?, sú predvolene preskočené, ak nie sú špecifikované používateľom)
lint - beh linters. Predvolene yamllint и flake8,
destroy — vymazanie inštancií z posledného spustenia Molecule (ak nejaké zostávajú),
dependency? — inštalácia prípustnej závislosti testovanej roly,
syntax - kontrola syntaxe roly pomocou ansible-playbook --syntax-check,
create - vytvorenie inštancie,
prepare? — príprava inštancie; napríklad kontrola/inštalácia python2
converge — spustenie testovanej príručky,
idempotence — znovu spustiť príručku pre test idempotencie,
side_effect? — činnosti, ktoré priamo nesúvisia s úlohou, ale sú potrebné pre testy,
verify — spustenie testov výslednej konfigurácie pomocou testinfra(predvolené) /goss/inspec,
cleanup? - (v nových verziách) - zhruba povedané „čistenie“ vonkajšej infraštruktúry ovplyvnenej molekulou,
destroy — vymazanie inštancie.
Táto sekvencia pokrýva väčšinu prípadov, ale v prípade potreby ju možno upraviť.
Každý z vyššie uvedených krokov je možné spustiť samostatne pomocou molecule <command>. Mali by ste však pochopiť, že pre každý takýto príkaz cli môže existovať vlastný sled akcií, ktorý môžete zistiť spustením molecule matrix <command>. Napríklad pri spustení príkazu converge (spustením testovanej príručky) sa vykonajú nasledujúce akcie:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
Postupnosť týchto akcií je možné upraviť. Ak už bolo niečo zo zoznamu dokončené, bude to preskočené. Aktuálny stav, ako aj konfigurácia inštancie, sú uložené v adresári Molecule $TMPDIR/molecule/<role>/<scenario>.
Pridajte kroky s ? Môžete opísať požadované akcie vo formáte Ansible playbook a vytvoriť názov súboru podľa kroku: prepare.yml/side_effect.yml. Očakávajte, že tieto súbory Molecule budú v priečinku skriptov.
Vodič
Ovládač je entita, v ktorej sa vytvárajú inštancie pre testy.
Zoznam štandardných ovládačov, pre ktoré má Molecule pripravené šablóny, je: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
Vo väčšine prípadov sú šablóny súbory create.yml и destroy.yml v priečinku skript, ktoré popisujú vytvorenie a odstránenie inštancie, resp.
Výnimkou sú Docker a Vagrant, pretože interakcie s ich modulmi môžu prebiehať bez vyššie uvedených súborov.
Za zvýraznenie stojí Delegovaný ovládač, pretože ak sa použije, v súboroch na vytváranie a odstraňovanie inštancií je popísaná iba práca s konfiguráciou inštancie, zvyšok by mal popísať inžinier.
Predvolený ovládač je Docker.
Teraz prejdime k praxi a zvážme ďalšie funkcie.
Začíname
Ako „ahoj svet“ otestujeme jednoduchú rolu inštalácie nginx. Ako ovládač zvolíme docker – myslím, že väčšina z vás ho má nainštalovaný (a pamätajte, že docker je predvolený ovládač).
Pripraviť virtualenv a nainštalujte ho do nej molecule:
Ďalším krokom je inicializácia novej roly.
Inicializácia novej roly, ako aj nového skriptu, sa vykonáva pomocou príkazu 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
Výsledkom je typická ansible rola. Ďalej, všetky interakcie s molekulami CLI sú vytvorené z koreňa roly.
Pozrime sa, čo je v adresári rolí:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Pozrime sa na konfiguráciu molecule/default/molecule.yml (nahradíme iba obrázok docker):
Popisuje konfiguráciu inštancií.
V prípade dockera ako ovládača sa Molecule iteruje cez túto sekciu a každý prvok zoznamu je dostupný v Dockerfile.j2 ako premenná item.
V prípade vodiča, v ktorom create.yml и destroy.yml, sekcia je v nich dostupná ako molecule_yml.platforms, a jej iterácie sú už popísané v týchto súboroch.
Keďže Molecule poskytuje správu inštancií modulom Ansible, mali by ste tam vyhľadať zoznam možných nastavení. Modul sa používa napríklad pre Docker docker_container_module. Ktoré moduly sa používajú v iných ovládačoch, nájdete v dokumentáciu.
Môžete tiež nájsť príklady použitia rôznych ovládačov v testoch samotnej molekuly.
Poďme nahradiť tu centos: 7 na ubuntu.
proviant
„Poskytovateľ“ je entita, ktorá spravuje inštancie. V prípade Molecule je to ansible, podpora pre ostatných sa neplánuje, takže túto sekciu možno s výhradou nazvať rozšírenou konfiguráciou ansible.
Je toho veľa, na čo by ste tu mohli poukázať, ale podľa môjho názoru zdôrazním hlavné body:
playbooks: Môžete určiť, ktoré zošity sa majú použiť v určitých fázach.
Názov a popis sekvencií skriptov.
Predvolenú maticu akcií príkazu môžete zmeniť pridaním kľúča <command>_sequence a ako hodnotu pre to definovať zoznam krokov, ktoré potrebujeme.
Povedzme, že chceme zmeniť postupnosť akcií pri spustení príkazu playbook run: molecule converge
Naša jednoduchá rola bola otestovaná bez problémov.
Stojí za to pamätať, že ak sa počas prevádzky vyskytnú problémy molecule test, potom ak ste nezmenili štandardnú sekvenciu, Molecule inštanciu vymaže.
Nasledujúce príkazy sú užitočné na ladenie:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Existujúca rola
Do existujúcej roly sa pridá nový skript z adresára rolí s nasledujúcimi príkazmi:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
Ak je toto prvý skript v role, potom parameter -s možno vynechať, pretože sa vytvorí skript default.
Záver
Ako vidíte, Molecule nie je veľmi zložitá a pri použití vlastných šablón môžete zredukovať nasadenie nového skriptu na úpravu premenných v playbookoch na vytváranie a odstraňovanie inštancií. Molekula sa bez problémov integruje so systémami CI, čo vám umožňuje zvýšiť rýchlosť vývoja znížením času na manuálne testovanie zošitov.
Ďakujem za tvoju pozornosť. Ak máte skúsenosti s testovaním ansible rolí a nesúvisí to s Molecule, povedzte nám o tom v komentároch!