ProHoster > Bloc > Administració > Instruccions: com provar rols ansibles i esbrinar els problemes abans de la producció
Instruccions: com provar rols ansibles i esbrinar els problemes abans de la producció
Hola a tots!
Treballo com a enginyer de DevOps en un servei de reserves d'hotels. Ostrovok.ru. En aquest article, vull parlar de la nostra experiència en provar rols ansibles.
A Ostrovok.ru, utilitzem ansible com a gestor de configuració. Recentment, hem arribat a la necessitat de provar els rols, però, com va resultar, no hi ha tantes eines per a això; la més popular, potser, és el marc de Molecule, així que vam decidir utilitzar-lo. Però va resultar que la seva documentació calla sobre moltes trampes. No vam trobar un manual prou detallat en rus, així que vam decidir escriure aquest article.
Molècula
Molècula - un marc per ajudar a provar rols ansibles.
Descripció simplificada: la molècula crea una instància a la plataforma que especifiqueu (núvol, màquina virtual, contenidor; per a més detalls, consulteu la secció Conductor), executa el vostre rol, després executa proves i elimina la instància. En cas de fallada en algun dels passos, la Molècula t'informarà.
Ara més.
Una mica de teoria
Considereu dues entitats clau de la molècula: l'escenari i el conductor.
Escenari
El guió conté una descripció de què, on, com i en quina seqüència es realitzarà. Un rol pot tenir diversos scripts, i cadascun és un directori al llarg del camí <role>/molecule/<scenario>, que conté descripcions de les accions necessàries per a la prova. S'ha d'incloure el guió default, que es crearà automàticament si inicialitzeu el rol amb una Molècula. Els noms dels scripts següents depenen de vostè.
S'anomena la seqüència d'accions de prova en un script matriu, i per defecte és:
(Pasos etiquetats ?, saltat per defecte si no l'especifica l'usuari)
lint - corrent linters. Per defecte s'utilitzen yamllint и flake8,
destroy - suprimir instàncies de l'últim llançament de la molècula (si n'hi ha),
dependency? — instal·lació de la dependència ansible del rol provat,
syntax - Comprovació de la sintaxi del rol utilitzant ansible-playbook --syntax-check,
create - Creació d'una instància,
prepare? — Preparació de la instància; per exemple, comproveu/instal·leu python2
converge — llançament del llibre de jocs que s'està provant,
idempotence - reiniciar el llibre de jugades per a la prova d'idempotència,
side_effect? - accions no directament relacionades amb el rol, però necessàries per a les proves,
verify - executar proves de la configuració resultant utilitzant testinfra(per defecte) /goss/inspec,
cleanup? - (en noves versions) - a grans trets, "netejar" la infraestructura externa afectada per la molècula,
destroy - Eliminació d'una instància.
Aquesta seqüència cobreix la majoria dels casos, però es pot canviar si cal.
Cadascun dels passos anteriors es pot executar per separat molecule <command>. Però s'ha d'entendre que per a cada comandament cli hi pot haver la seva pròpia seqüència d'accions, que podeu esbrinar executant molecule matrix <command>. Per exemple, quan s'executa l'ordre converge (executant el llibre de jugades a prova), es realitzaran les accions següents:
$ molecule matrix converge
...
└── default # название сценария
├── dependency # установка зависимостей
├── create # создание инстанса
├── prepare # преднастройка инстанса
└── converge # прогон плейбука
La seqüència d'aquestes accions es pot editar. Si alguna cosa de la llista ja està feta, s'ometrà. L'estat actual, així com la configuració de les instàncies, la Molècula emmagatzema al directori $TMPDIR/molecule/<role>/<scenario>.
Afegeix passos amb ? podeu descriure les accions desitjades en el format ansible-playbook i fer el nom del fitxer segons el pas: prepare.yml/side_effect.yml. Espereu aquests fitxers La molècula estarà a la carpeta de l'script.
Conductor
Un controlador és una entitat on es creen instàncies de prova.
La llista de controladors estàndard per als quals Molecule té plantilles preparades és la següent: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
En la majoria dels casos, les plantilles són fitxers create.yml и destroy.yml a la carpeta d'scripts que descriuen la creació i la supressió d'una instància, respectivament.
Les excepcions són Docker i Vagrant, ja que les interaccions amb els seus mòduls es poden produir sense els fitxers esmentats anteriorment.
Val la pena destacar el controlador Delegat, ja que si s'utilitza en els fitxers per crear i esborrar una instància, només es descriu el treball amb la configuració d'instàncies, la resta ha de ser descrita per l'enginyer.
El controlador predeterminat és Docker.
Ara passem a la pràctica i considerem més funcions allà.
primers passos
Com a "hola món", provem un rol d'instal·lació nginx senzill. Escollirem docker com a controlador; crec que la majoria de vosaltres el teniu instal·lat (i recordeu que docker és el controlador predeterminat).
El següent pas és inicialitzar el nou rol.
La inicialització d'un nou rol, així com d'un nou script, es realitza mitjançant l'ordre 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
Va resultar un paper ansible típic. A més, totes les interaccions amb les molècules CLI es fan des de l'arrel del paper.
Vegem què hi ha al directori de rols:
> tree molecule/default/
molecule/default/
├── Dockerfile.j2 # Jinja-шаблон для Dockerfile
├── INSTALL.rst. # Немного информации об установке зависимостей сценария
├── molecule.yml # Файл конфигурации
├── playbook.yml # Плейбук запуска роли
└── tests # Директория с тестами стадии verify
└── test_default.py
1 directory, 6 files
Analitzem la configuració molecule/default/molecule.yml (substitueix només la imatge de Docker):
Shell és només un intèrpret d'ordres que s'utilitza en cas que la galàxia i el daurat no cobreixin les vostres necessitats.
No em quedaré aquí durant molt de temps, ja n'hi ha prou descrit documentació.
conductor
El nom del conductor. El nostre és docker.
pelussa
El linter és yamllint.
Les opcions útils d'aquesta part de la configuració són la possibilitat d'especificar un fitxer de configuració per a yamllint, reenviar variables d'entorn o desactivar el linter:
Descriu la configuració de les instàncies.
En el cas de docker com a controlador, la molècula s'itera sobre aquesta secció i cada element de la llista està disponible a Dockerfile.j2 com a variable item.
En el cas d'un conductor que ho requereixi create.yml и destroy.yml, la secció està disponible en ells com a molecule_yml.platforms, i les iteracions sobre ell ja es descriuen en aquests fitxers.
Atès que la molècula proporciona control de les instàncies als mòduls ansibles, també s'hauria de cercar allà la llista de configuracions possibles. Per a docker, per exemple, s'utilitza el mòdul docker_container_module. A quins mòduls s'utilitzen en altres controladors es poden trobar documentació.
Així com exemples de l'ús de diversos controladors es poden trobar en les proves de la pròpia molècula.
Substitueix aquí centos:7 en ubuntu.
subministrador
"Proveïdor": una entitat que gestiona les instàncies. En el cas de Molecule, això és ansible, el suport per a altres no està previst, de manera que aquesta secció es pot anomenar configuració ampliada ansible amb una advertència.
Aquí podeu especificar moltes coses, en destacaré els punts principals, al meu entendre:
llibres de jugades: podeu especificar quins llibres de jugades s'han d'utilitzar en determinades etapes.
Nom i descripció de les seqüències de guió.
Podeu canviar la matriu d'accions per defecte de qualsevol ordre afegint la clau <command>_sequence i com a valor per a això definint la llista de passos que necessitem.
Suposem que volem canviar la seqüència d'accions quan executem l'ordre d'execució del llibre de jocs: molecule converge
Configuració d'un marc per a les proves i un linter. El linter predeterminat és testinfra и flake8. Les opcions possibles són les mateixes que les anteriors:
El nostre senzill paper es va provar sense problemes.
Val la pena recordar que si hi ha problemes durant el treball molecule test, aleshores, si no heu canviat la seqüència per defecte, la molècula suprimirà la instància.
Les ordres següents són útils per a la depuració:
> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge # Оставляет инстанс после прогона тестируемой роли.
> molecule login # Зайти в созданный инстанс.
> molecule --help # Полный список команд.
Rol existent
Afegir un script nou a un rol existent és del directori de rols amb les ordres següents:
# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>
En cas que aquest sigui el primer escenari del rol, llavors el paràmetre -s es pot ometre, ja que crearà un script default.
Conclusió
Com podeu veure, la Molècula no és gaire complexa i, utilitzant les vostres pròpies plantilles, el desplegament d'un nou script es pot reduir a l'edició de variables en els llibres de jugades de creació i supressió d'instàncies. La molècula s'integra perfectament amb els sistemes CI, la qual cosa us permet augmentar la velocitat de desenvolupament reduint el temps per a les proves manuals dels llibres de joc.
Gràcies per la vostra atenció. Si tens experiència en provar rols ansibles i no està relacionat amb la molècula, explica'ns-ho als comentaris!