Mindenkinek szia!
DevOps mérnökként dolgozom egy szállásfoglaló szolgáltatásnál. . Ebben a cikkben szeretném megosztani tapasztalatainkat az ansible szerepek teszteléséről.
Az Ostrovok.ru-nál a konfigurációs menedzsereként ansiblet használunk. Nemrégiben szükségessé vált a szerepek tesztelése, de kiderült, hogy erre az esetre nem sok eszköz létezik – a legnépszerűbb talán a Molecule keretrendszer, ezért ezt döntöttük el használni. De kiderült, hogy a dokumentációja sok csapdát nem említ. Az orosz nyelvű részletes útmutatót nem találtuk, ezért úgy döntöttünk, hogy megírjuk ezt a cikket.

Molecule
– keretrendszer az ansible szerepek tesztelésének segítésére.
Egyszerűsített leírás: A Molekula egy példányt hoz létre az Ön által megadott platformon (felhő, virtuális gép, konténer; további részletekért lásd a ), futtatja rajta a szerepét, majd elvégzi a teszteket és eltávolítja az példányt. Ha bármelyik lépésnél hiba lép fel, a Molekula értesít erről.
Nézzük most részletesebben.
Egy kis elmélet
Két kulcselemét vizsgáljuk meg a Molekulának: a Szenáriót és a Drivert.
Szenárió
A Szenárió tartalmazza azt a leírást, hogy mi, hol, hogyan és milyen sorrendben fog végrehajtódni. Egy szerepnek több szenáriója is lehet, és mindegyik egy könyvtár a következő úton: /molecule/, amely tartalmazza a teszthez szükséges tevékenységek leírását. Kötelező, hogy legyen egy szenárió, amely automatikusan létrejön, ha a Molekulával inicializálja a szerepet. A következő szenáriók neve szabadon választható. alapértelmezettA szenárióban a tesztelési lépések sorrendjét
hívják, és alapértelmezés szerint ez a következőképpen alakul: mátrix(A felhasználó által nem megadott lépések
alapértelmezés szerint átugrásra kerülnek) ?lint
– a linters futtatása. Alapértelmezés szerint aflake8yamllintésdestroy,– az előző Molecule futtatásból megmaradt példányok eltávolítása (ha vannak),syntaxdependency? — установка ansible-зависимости тестируемой роли,– a szerep szintaxisának ellenőrzése a következővel:ansible-playbook --syntax-check– egy példány létrehozása,,kubectl create -f manifest.yamlprepare– a tesztelendő playbook futtatása,? — подготовка инстанса; например, проверка / установка python2convergeidempotence– a playbook újrafuttatása az idempotencia tesztelésére,side_effect– a létrejött konfiguráció tesztje a? — действия, не относящиеся непосредственно к роли, но нужные для тестов,verifytestinfraalapértelmezésben) /gossinspec/– az példány eltávolítása.,tisztítási folyamatban? — (в новых версиях) — грубо говоря, «очистка» внешней инфраструктуры, задетой Молекулой,– az előző Molecule futtatásból megmaradt példányok eltávolítása (ha vannak),Ez a sorrend a legtöbb esetet lefedi, de szükség esetén módosítható.
Эта последовательность покрывает большинство случаев, но, при необходимости, её можно изменить.
Minden egyes fent említett lépést külön indíthatunk az alábbi parancs segítségével molecule. De meg kell értenünk, hogy minden egyes ilyen CLI-parancsnak saját végrehajtási sorrendje lehet, amelyet a következő paranccsal tudhatunk meg molecule matrix. Például, ha a parancsot futtatjuk converge (a tesztelendő playbook futtatása) a következő műveletek kerülnek végrehajtásra:
$ molecule matrix converge
...
└── default # szkript neve
├── dependency # függőségek telepítése
├── create # példány létrehozása
├── prepare # példány előkészítése
└── converge # playbook futtatásEzek sorrendjét módosíthatjuk. Ha a listán valami már végrehajtásra került, akkor azt átugorja. Az aktuális állapotot és a példányok konfigurációját a Molecule a következő könyvtárban tárolja $TMPDIR/molecule//.
Lépéseket a következőképpen adhatunk hozzá ? azok kívánt műveleteinek leírásával ansible playbook formátumban, és a fájl nevét ennek megfelelő lépésre állítsuk: prepare.yml/side_effect.yml. A Molecule várja ezeket a fájlokat a forgatókönyv mappájában.
Driver
A driver egy entitás, ahol a példányokat tesztelés céljából létrehozzák.
A standard driverek listája, amelyekhez a Molecule kész sablonokat biztosít: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegált.
A legtöbb esetben a sablonok fájlok create.yml és destroy.yml a forgatókönyv mappájában, amelyek a példány létrehozását és törlését írják le.
Kivételt képez a Docker és a Vagrant, mivel ezek moduljaikkal való interakciójuk előfordulhat a fent említett fájlok nélkül.
Kiemelendő a Delegált driver, mivel annak használata esetén a létrehozó és törlő fájlokban csak a példányok konfigurációjával kapcsolatos munka van leírva, a többit a mérnöknek kell definiálnia.
Alapértelmezett drivereként a Docker van megadva.
Most áttérünk a gyakorlati részre, és a további részleteket ott vizsgáljuk meg.
Munka kezdetek
Mint "hello world", teszteljük egy egyszerű nginx telepítő szerepkört. A drivernek a Dockert választjuk - úgy gondolom, hogy a legtöbben már telepítve van (és emlékezzünk, hogy a Docker az alapértelmezett driver).
Készüljünk fel virtualenv és telepítsük a következőt: molecule:
> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker # a molecule telepíti az ansible-t mint függőséget; a docker a driverhezA következő lépésként inicializálunk egy új szerepkört.
Az új szerepkör és új forgatókönyv inicializálása a következő parancs segítségével történik molecule init:
> molecule init role -r nginx
-- > Initializing new role nginx...
Initialized role in /nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars
6 directories, 1 fileEz egy tipikus Ansible szerep lett. A továbbiakban minden interakció a Molecule CLI-vel a szerep gyökeréből történik.
Nézzük meg, mi található a szerep könyvtárában:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja sablon a Dockerfile-hoz
├── INSTALL.rst. # Néhány információ a függőségek telepítéséről
├── molecule.yml # Konfigurációs fájl
├── playbook.yml # A szerep futtatásának playbook-ja
└── tests # Teszt könyvtár a verify fázisban
└── test_default.py
1 könyvtár, 6 fájlNézzük meg a konfigurációt molecule/default/molecule.yml (csak a docker image-t cseréljük):
---
dependency:
name: galaxy
driver:
name: docker
lint:
name: yamllint
platforms:
- name: instance
image: centos:7
provisioner:
name: ansible
lint:
name: ansible-lint
scenario:
name: default
verifier:
name: testinfra
lint:
name: flake8dependency
Ez a szakasz a függőségek forrását írja le.
Lehetséges lehetőségek: , , shell.
A Shell egyszerűen egy parancssori felület, amelyet akkor használnak, ha a galaxy és a gilt nem fedik le az igényeidet.
Nem akarom itt túl sokáig elidőzni, elegendő információt találunk a .
driver
A driver neve. Ez nálunk docker.
– a linters futtatása. Alapértelmezés szerint a
A yamllint van beállítva lintként.
A konfiguráció ezen részében hasznos opciók a yamllint konfigurációs fájljának megadása, környezeti változók átadása vagy a linter letiltása:
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: Falseplatforms
Az instansok konfigurációját írja le.
Docker esetében a driver szerepében a Molecule ebben a szakaszban iterál, és a lista minden eleme elérhető a Dockerfile.j2 mint változó item.
A driver esetében, ahol kötelezőek create.yml és destroy.yml, a szakasz elérhető számukra mint molecule_yml.platforms, az iterációkat pedig ezekben a fájlokban írják le.
Mivel a Molecule lehetőséget biztosít az Ansible modulokkal való instansok kezelésére, a lehetséges beállítások listáját ott kell keresni. Például a docker esetében az használatos. Milyen modulokat használnak a többi driver esetében, azt itt találod .
Valamint a különböző driverek használatának példáit a Molecule tesztjeiben találhatod .
centos:7 A „Beszállító” olyan entitás, amely kezeli az instansokat. A Molecule esetében ez az Ansible, mások támogatása nem tervezett, ezért ezt a szakaszt joggal nevezhetjük Ansible kiterjesztett konfigurációjának. Gyorsan emlékezzünk vissza, hogyan működik a moduláris aritmetika. Az óra már egy ismert koncepció. Az órák használata ubuntu.
provisioner
«Поставщик» — сущность, управляющая инстансами. В случае Молекулы это ansible, поддержка других не планируется, поэтому эту секцию можно с оговоркой назвать расширенной конфигурацией ansible.
Itt sok mindent meg lehet említeni, kiemelem a legfontosabb pillanatokat véleményem szerint:
- playbookok: meg lehet adni, hogy melyik playbookot kell használni a különböző szakaszokban.
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml- config_opciók:
provisioner:
name: ansible
config_options:
defaults:
fact_caching: jsonfile
ssh_connection:
scp_if_ssh: True- connection_opciók: paraméterek
provisioner:
name: ansible
connection_options:
ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"- opciók: Ansible paraméterek és környezeti változók
provisioner:
name: ansible
options:
vvv: true
diff: true
env:
FOO: BARforgatókönyv
A forgatókönyv szekvenciáinak neve és leírása.
A parancs alapértelmezett műveleti mátrixának megváltoztatásához hozzáadhatunk egy kulcsot <command>_sorozat és annak értékeként meghatározhatjuk a szükséges lépések listáját.
Tegyük fel, hogy meg szeretnénk változtatni a playbook futtató parancs indítási sorrendjét: molecule converge
# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- convergeverifikátor
A tesztkeretrendszer és a hozzá tartozó lint beállítása. Alapértelmezés szerint lint-ként használják alapértelmezésben) / és destroy. A lehetséges opciók hasonlóak a fentiekhez:
verifier:
name: testinfra
additional_files_or_dirs:
- ../path/to/test_1.py
- ../path/to/test_2.py
- ../path/to/directory/*
options:
n: 1
enabled: False
env:
FOO: bar
lint:
name: flake8
options:
benchmark: True
enabled: False
env:
FOO: barVisszatérve a szerepünkhöz. Szerkesszük a fájlt tasks/main.yml ilyen formára:
---
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
És adjunk hozzá teszteket a molecule/default/tests/test_default.py
def test_nginx_is_installed(host):
nginx = host.package("nginx")
assert nginx.is_installed
def test_nginx_running_and_enabled(host):
nginx = host.service("nginx")
assert nginx.is_running
assert nginx.is_enabled
def test_nginx_config(host):
host.run("nginx -t")
Kész, most már csak futtatni kell (a szerep gyökeréből, emlékeztetlek):
> molecule testHosszú kimenet spoiler alatt:
--> Sémák érvényesítése /nginx/molecule/default/molecule.yml.
Az érvényesítés sikeresen befejeződött.
--> Teszt mátrix
└── default
├── lint
├── destroy
├── dependency
├── syntax
├── create
├── prepare
├── converge
├── idempotence
├── side_effect
├── verify
└── destroy
--> Forgatókönyv: 'default'
--> Akció: 'lint'
--> Yamllint futtatása a /nginx/... fájlokon
A lintelés sikeresen befejeződött.
--> Flake8 futtatása a /nginx/molecule/default/tests/... fájlokon
A lintelés sikeresen befejeződött.
--> Ansible Lint futtatása a /nginx/molecule/default/playbook.yml... fájlon
A lintelés sikeresen befejeződött.
--> Forgatókönyv: 'default'
--> Akció: 'destroy'
Játék [Destroy] *****************************************************************
FELADAT [Molekula példány(ok) eltávolítása] ********************************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Várakozás az eltávolítás(ok) befejezésére] *******************************
rendben: [localhost] => (tétel=None)
rendben: [localhost]
FELADAT [Docker hálózat(ok) törlése] ************************************************
Játék RECAP *********************************************************************
localhost : ok=2 változott=1 elérhetetlen=0 meghiúsult=0
--> Forgatókönyv: 'default'
--> Akció: 'dependency'
Kihagyva, hiányzik a követelmények fájl.
--> Forgatókönyv: 'default'
--> Akció: 'syntax'
playbook: /nginx/molecule/default/playbook.yml
--> Forgatókönyv: 'default'
--> Akció: 'create'
Játék [Create] ******************************************************************
FELADAT [Bejelentkezés egy Docker regisztrációba] **********************************************
kihagyva: [localhost] => (tétel=None)
FELADAT [Dockerfile-ok létrehozása a képfelhasználónevek alapján] *************************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Helyi Docker képek felfedezése] ********************************************
rendben: [localhost] => (tétel=None)
rendben: [localhost]
FELADAT [Ansible kompatibilis kép létrehozása] ***************************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Docker hálózat(ok) létrehozása] ************************************************
FELADAT [Molekula példány(ok) létrehozása] *********************************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Várakozás a példány(ok) létrehozásának befejezésére] *******************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
Játék RECAP *********************************************************************
localhost : ok=5 változott=4 elérhetetlen=0 meghiúsult=0
--> Forgatókönyv: 'default'
--> Akció: 'prepare'
Kihagyva, a felkészítő playbook nincs konfigurálva.
--> Forgatókönyv: 'default'
--> Akció: 'converge'
Játék [Converge] ****************************************************************
FELADAT [Tények Gyűjtése] *********************************************************
rendben: [instance]
FELADAT [nginx : nginx telepítése] ***************************************************
megváltozott: [instance]
FELADAT [nginx : nginx indítása] *****************************************************
megváltozott: [instance]
Játék RECAP *********************************************************************
instance : ok=3 változott=2 elérhetetlen=0 meghiúsult=0
--> Forgatókönyv: 'default'
--> Akció: 'idempotence'
Az idempotencia sikeresen befejeződött.
--> Forgatókönyv: 'default'
--> Akció: 'side_effect'
Kihagyva, a mellékhatás playbook nincs konfigurálva.
--> Forgatókönyv: 'default'
--> Akció: 'verify'
--> Testinfra tesztek futtatása a /nginx/molecule/default/tests/...-ben
============================= teszt ülés kezdődik ==============================
platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
gyökérkönyvtár: /nginx/molecule/default, inifile:
pluginek: testinfra-1.16.0
összegyűjtött 4 elem
tests/test_default.py .... [100%]
========================== 4 sikeres 27.23 másodperc alatt ===========================
A hitelesítő sikeresen befejeződött.
--> Forgatókönyv: 'default'
--> Akció: 'destroy'
Játék [Destroy] *****************************************************************
FELADAT [Molekula példány(ok) eltávolítása] ********************************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Várakozás az eltávolítás(ok) befejezésére] *******************************
megváltozott: [localhost] => (tétel=None)
megváltozott: [localhost]
FELADAT [Docker hálózat(ok) törlése] ************************************************
Játék RECAP *********************************************************************
localhost : ok=2 változott=2 elérhetetlen=0 meghiúsult=0
A mi egyszerű szerepünk probléma nélkül teljesült.
Érdemes megjegyezni, hogy ha problémák merültek fel a munka során molekula teszt, akkor, ha nem módosítottad a standard sorrendet, a Molekula eltávolítja az instanciát.
A hibakereséshez az alábbi parancsok hasznosak:
> molecule --debug # hibainformáció. Normál indításkor a Molekula elrejti a naplókat.
> molecule converge # Az instanciát megtartja a tesztelt szerep futtatása után.
> molecule login # Belépés a létrehozott instanciába.
> molecule --help # A parancsok teljes listája.Meglévő szerep
Új forgatókönyv hozzáadása a meglévő szerephez a következőképpen történik a szerep könyvtárából a következő parancsokkal:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>Ha ez az első forgatókönyv a szerepben, akkor a paramétert -s kihagyhatod, mivel forgatókönyv jön létre. alapértelmezett.
Zárás
Ahogy látod, a Molekula nem bonyolult, és a saját sablonjaid használatával a új forgatókönyv telepítése minimalizálható a változók szerkesztésére az instanciák létesítését és törlését végző playbookokban. A Molekula problémamentesen integrálódik a CI rendszerekkel, ami növeli a fejlesztés sebességét a playbookok manuális tesztelési idejének csökkentésével.
Köszönöm figyelmedet. Ha van tapasztalatod az ansible szerepek tesztelésében, és az nem kapcsolódik a Molekulához, mesélj róla a megjegyzések között!
Forrás: habr.com
