ProHoster > BLOG > administrare > Instrucțiuni: cum să testați rolurile ansible și să aflați despre probleme înainte de producție
Instrucțiuni: cum să testați rolurile ansible și să aflați despre probleme înainte de producție
Bună ziua tuturor!
Lucrez ca inginer DevOps într-un serviciu de rezervări hoteliere. Ostrovok.ru. În acest articol vreau să vorbesc despre experiența noastră în testarea rolurilor Ansible.
La Ostrovok.ru, folosim ansible ca manager de configurare. Recent, am ajuns la necesitatea de a testa roluri, dar după cum s-a dovedit, nu există atât de multe instrumente pentru aceasta - cel mai popular, poate, este cadrul Molecule, așa că am decis să-l folosim. Dar s-a dovedit că documentația sa tace despre multe capcane. Nu am putut găsi un manual suficient de detaliat în limba rusă, așa că am decis să scriem acest articol.
Moleculă
Moleculă — un cadru pentru a ajuta la testarea rolurilor Ansible.
Descriere simplificată: molecula creează o instanță pe platforma pe care o specificați (cloud, mașină virtuală, container; pentru mai multe detalii, consultați secțiunea Şofer), rulează rolul tău pe acesta, apoi rulează teste și șterge instanța. În caz de eșec la unul dintre trepte, Molecula vă va informa despre aceasta.
Acum mai mult.
Un pic de teorie
Să luăm în considerare două entități cheie ale Moleculei: Scenariu și Driver.
Scenariu
Scriptul conține o descriere a ce, unde, cum și în ce secvență va fi realizat. Un rol poate avea mai multe scripturi și fiecare este un director de-a lungul căii <role>/molecule/<scenario>, care conțin descrieri ale acțiunilor necesare testului. Trebuie să existe un scenariu default, care va fi creat automat dacă inițializați rolul cu o Moleculă. Numele următoarelor scripturi depinde de dvs.
Secvența acțiunilor de testare dintr-un script este numită matrice, iar implicit este:
(Pașii marcați ?, sărit în mod implicit dacă nu este specificat de utilizator)
lint - rularea linters. În mod implicit sunt utilizate yamllint и flake8,
destroy - ștergerea instanțelor de la ultima lansare a Moleculei (dacă există),
dependency? — instalarea dependenței ansible a rolului testat;
prepare? — pregătirea instanței; de exemplu, verificați/instalați python2
converge — lansarea playbook-ului testat,
idempotence — reluați manualul de joc pentru testul de idempotnță,
side_effect? - acțiuni care nu au legătură directă cu rolul, dar sunt necesare pentru teste,
verify - executarea de teste ale configurației rezultate folosind testinfra(Mod implicit) /goss/inspec,
cleanup? - (în versiuni noi) - aproximativ vorbind, „curățarea” infrastructurii externe afectate de Moleculă,
destroy — ștergerea unei instanțe.
Această secvență acoperă majoritatea cazurilor, dar poate fi modificată dacă este necesar.
Fiecare dintre pașii de mai sus poate fi rulat separat molecule <command>. Dar trebuie înțeles că pentru fiecare astfel de comandă cli poate exista propria sa secvență de acțiuni, pe care o puteți afla executând molecule matrix <command>. De exemplu, când rulați comanda converge (rularea playbook-ului testat) vor fi efectuate următoarele acțiuni:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
Secvența acestor acțiuni poate fi editată. Dacă ceva din listă a fost deja finalizat, acesta va fi omis. Starea curentă, precum și configurația instanței, sunt stocate în directorul Molecule $TMPDIR/molecule/<role>/<scenario>.
Adăugați pași cu ? puteți descrie acțiunile dorite în formatul ansible-playbook și puteți crea numele fișierului conform pasului: prepare.yml/side_effect.yml. Așteptați-vă ca aceste fișiere Molecule să fie în folderul script.
Şofer
Un driver este o entitate în care sunt create instanțe pentru teste.
Lista driverelor standard pentru care Molecule are șabloane gata făcute este: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
În cele mai multe cazuri, șabloanele sunt fișiere create.yml и destroy.yml în folderul script, care descriu crearea și respectiv ștergerea instanței.
Excepțiile sunt Docker și Vagrant, deoarece interacțiunile cu modulele lor pot avea loc fără fișierele de mai sus.
Merită evidențiat driverul delegat, deoarece dacă este utilizat în fișierele pentru crearea și ștergerea unei instanțe, este descrisă doar funcționarea cu configurarea instanțelor, restul ar trebui descris de inginer.
Driverul implicit este Docker.
Acum să trecem la exersare și să luăm în considerare alte funcții acolo.
Noțiuni de bază
Ca „bună lume”, vom testa un rol simplu de instalare nginx. Să alegem docker ca driver - cred că majoritatea dintre voi îl aveți instalat (și amintiți-vă că docker este driverul implicit).
Pregăti virtualenv și instalează-l în el molecule:
Următorul pas este inițializarea noului rol.
Inițializarea unui nou rol, precum și a unui nou script, se realizează folosind comanda 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
Sa dovedit un rol tipic ansible. În plus, toate interacțiunile cu moleculele CLI sunt realizate de la rădăcina rolului.
Să vedem ce este în directorul de roluri:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Să analizăm configurația molecule/default/molecule.yml (înlocuiește doar imaginea docker):
Shell este doar un shell de comandă care este folosit în cazul în care galaxy și gilt nu vă acoperă nevoile.
Nu voi sta aici mult timp, este descris suficient în documentație.
şofer
Numele șoferului. Al nostru este docker.
scamă
Yamllint este folosit ca linter.
Opțiunile utile din această parte a configurației sunt capacitatea de a specifica un fișier de configurare pentru yamllint, de a transmite variabile de mediu sau de a dezactiva linter:
Descrie configurația instanțelor.
În cazul docker ca driver, Molecula iterează peste această secțiune, iar fiecare element al listei este disponibil în Dockerfile.j2 ca variabilă item.
În cazul unui şofer în care create.yml и destroy.yml, secțiunea este disponibilă în ele ca molecule_yml.platforms, iar iterațiile peste acesta sunt deja descrise în aceste fișiere.
Deoarece Molecule oferă gestionarea instanțelor modulelor Ansible, ar trebui să căutați acolo lista de setări posibile. Pentru Docker, de exemplu, se folosește modulul docker_container_module. Ce module sunt utilizate în alte drivere pot fi găsite în documentație.
De asemenea, puteți găsi exemple de utilizare a diferitelor drivere în testele Moleculei în sine.
Să înlocuim aici centos:7 pe ubuntu.
asigurator
„Furnizor” - o entitate care gestionează instanțe. În cazul Molecule, acesta este ansible, suportul pentru alții nu este planificat, așa că această secțiune poate fi numită configurație extinsă ansible cu o avertizare.
Aici puteți preciza o mulțime de lucruri, voi evidenția punctele principale, după părerea mea:
cărți de joacă: Puteți specifica ce cărți de joc ar trebui utilizate în anumite etape.
Titlul și descrierea secvențelor de script.
Puteți modifica matricea de acțiuni implicită a oricărei comenzi adăugând cheia <command>_sequence și ca valoare pentru acesta, definirea listei de pași de care avem nevoie.
Să presupunem că vrem să schimbăm secvența de acțiuni atunci când rulăm comanda playbook run: molecule converge
Stabilirea unui cadru pentru teste și a unui linter pentru acesta. În mod implicit, linterul este utilizat testinfra и flake8. Opțiunile posibile sunt similare cu cele de mai sus:
Rolul nostru simplu a fost testat fără probleme.
Merită să ne amintim că, dacă apar probleme în timpul funcționării molecule test, atunci dacă nu ați modificat secvența standard, Molecule va șterge instanța.
Următoarele comenzi sunt utile pentru depanare:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Rolul existent
Are loc adăugarea unui nou script la un rol existent din directorul de roluri cu următoarele comenzi:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
Dacă acesta este primul script din rol, atunci parametrul -s poate fi omis deoarece va crea un script default.
Concluzie
După cum puteți vedea, Molecule nu este foarte complicat și, atunci când utilizați propriile șabloane, puteți reduce implementarea unui nou script la editarea variabilelor din manualele pentru crearea și ștergerea instanțelor. Molecula se integrează perfect cu sistemele CI, ceea ce vă permite să creșteți viteza de dezvoltare prin reducerea timpului pentru testarea manuală a manualelor.
Vă mulțumim pentru atenție. Dacă aveți experiență în testarea rolurilor ansible și nu are legătură cu Molecule, spuneți-ne despre asta în comentarii!