Leiðbeiningar: hvernig á að prófa hugsanleg hlutverk og finna út um vandamál fyrir framleiðslu

Halló allir!

Ég vinn sem DevOps verkfræðingur í hótelbókunarþjónustu. Ostrovok.ru. Í þessari grein vil ég tala um reynslu okkar af því að prófa hugsanleg hlutverk.

Á Ostrovok.ru notum við ansible sem stillingastjóra. Nýlega komumst við að þörfinni á að prófa hlutverk, en eins og það kom í ljós eru ekki svo mörg verkfæri fyrir þetta - vinsælast er kannski sameindaramminn, svo við ákváðum að nota það. En það kom í ljós að skjöl hans eru þögul um margar gildrur. Við gátum ekki fundið nægilega ítarlega handbók á rússnesku, svo við ákváðum að skrifa þessa grein.

Leiðbeiningar: hvernig á að prófa hugsanleg hlutverk og finna út um vandamál fyrir framleiðslu

Molecule

Sameind - ramma til að hjálpa til við að prófa hugsanleg hlutverk.

Einföld lýsing: Sameindin býr til tilvik á vettvangnum sem þú tilgreinir (ský, sýndarvél, ílát; fyrir frekari upplýsingar, sjá kaflann Bílstjóri), keyrir hlutverkið þitt á því, keyrir síðan próf og eyðir tilvikinu. Ef bilun verður á einu af þrepunum mun sameindin upplýsa þig um það.

Núna meira.

Smá kenning

Skoðum tvær lykileiningar sameindarinnar: atburðarás og ökumaður.

Atburðarás

Handritið inniheldur lýsingu á því hvað, hvar, hvernig og í hvaða röð verður flutt. Eitt hlutverk getur haft nokkur handrit og hvert er skrá meðfram leiðinni <role>/molecule/<scenario>, sem inniheldur lýsingar á þeim aðgerðum sem krafist er fyrir prófið. Handrit þarf að fylgja með default, sem verður sjálfkrafa til ef þú frumstillir hlutverkið með sameind. Nöfn eftirfarandi handrita eru undir þér komið.

Röð prófunaraðgerða í handriti er kölluð fylki, og sjálfgefið er það:

(Skref merkt ?, sleppt sjálfgefið ef það er ekki tilgreint af notanda)

  • lint - hlaupandi linters. Sjálfgefið er notað yamllint и flake8,
  • destroy - eyða tilvikum frá síðustu kynningu á sameindinni (ef einhver er),
  • dependency? — uppsetning á hugsanlegri ósjálfstæði prófunarhlutverksins,
  • syntax - athuga setningafræði hlutverksins með því að nota ansible-playbook --syntax-check,
  • create - búa til dæmi,
  • prepare? — undirbúningur dæmisins; td athuga/setja upp python2
  • converge — kynning á leikbókinni sem verið er að prófa,
  • idempotence - endurræsa leikbókina fyrir getuleysisprófið,
  • side_effect? - aðgerðir sem tengjast ekki hlutverkinu beint, en nauðsynlegar fyrir próf,
  • verify - keyra prófanir á stillingum sem myndast með því að nota testinfra(sjálfgefið) /goss/inspec,
  • cleanup? - (í nýjum útgáfum) - í grófum dráttum, að "hreinsa" ytri innviði sem verða fyrir áhrifum af sameindinni,
  • destroy - Eyðir tilviki.

Þessi röð nær yfir flest tilvik, en hægt er að breyta henni ef þörf krefur.

Hægt er að keyra hvert af ofangreindum skrefum sérstaklega með molecule <command>. En það ætti að skilja að fyrir hverja slíka cli-skipun getur verið eigin röð aðgerða, sem þú getur fundið út með því að framkvæma molecule matrix <command>. Til dæmis þegar skipunin er keyrð converge (að keyra leikbókina sem er í prófun), verða eftirfarandi aðgerðir gerðar:

$ molecule matrix converge
...
└── default         # название сценария
    ├── dependency  # установка зависимостей
    ├── create      # создание инстанса
    ├── prepare     # преднастройка инстанса
    └── converge    # прогон плейбука

Hægt er að breyta röð þessara aðgerða. Ef eitthvað af listanum er þegar gert verður því sleppt. Núverandi ástand, sem og stillingar tilvikanna, geymir sameindin í möppunni $TMPDIR/molecule/<role>/<scenario>.

Bættu skrefum við ? þú getur lýst þeim aðgerðum sem óskað er eftir á ansible-playbook sniðinu og búið til skráarnafnið í samræmi við skrefið: prepare.yml/side_effect.yml. Búast við þessum skrám. Sameindin verður í script möppunni.

Bílstjóri

Ökumaður er eining þar sem prófunartilvik eru búin til.
Listinn yfir staðlaða rekla sem Molecule hefur sniðmát tilbúin fyrir er sem hér segir: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Í flestum tilfellum eru sniðmát skrár create.yml и destroy.yml í forskriftarmöppunni sem lýsir stofnun og eyðingu tilviks, í sömu röð.
Undantekningarnar eru Docker og Vagrant, þar sem samskipti við einingar þeirra geta átt sér stað án fyrrnefndra skráa.

Það er þess virði að leggja áherslu á Delegated driverinn, þar sem ef hann er notaður í skránum til að búa til og eyða tilviki er aðeins vinnu með uppsetningu tilvika lýst, afganginum ætti verkfræðingur að lýsa.

Sjálfgefinn bílstjóri er Docker.

Nú skulum við halda áfram að æfa okkur og íhuga frekari eiginleika þar.

getting Started

Sem „halló heimur“ skulum við prófa einfalt nginx uppsetningarhlutverk. Við skulum velja docker sem driver - ég held að flestir séu með hann uppsettan (og mundu að docker er sjálfgefinn bílstjóri).

Undirbúa virtualenv og settu í hann molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule установит ansible как зависимость; docker для драйвера

Næsta skref er að frumstilla nýja hlutverkið.
Frumstilling á nýju hlutverki, sem og nýju handriti, er framkvæmd með skipuninni 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

Það reyndist dæmigert ansible-hlutverk. Ennfremur eru öll samskipti við CLI sameindir gerð út frá rót hlutverksins.

Við skulum sjá hvað er í hlutverkaskránni:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-шаблон для Dockerfile
├── INSTALL.rst.   # Немного информации об установке зависимостей сценария
├── molecule.yml   # Файл конфигурации
├── playbook.yml   # Плейбук запуска роли
└── tests          # Директория с тестами стадии verify
    └── test_default.py

1 directory, 6 files

Við skulum greina stillingarnar molecule/default/molecule.yml (skipta aðeins út bryggjumynd):

---
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: flake8

ósjálfstæði

Þessi hluti lýsir uppruna ósjálfstæðis.

Mögulegir valkostir: Galaxy, gylltur, skel.

Skel er bara stjórnskel sem er notuð ef vetrarbraut og gylltur dekka ekki þarfir þínar.

Ég ætla ekki að dvelja hér lengi, það er nóg lýst í skjöl.

bílstjóri

Nafn ökumanns. Okkar er hafnarverkamaður.

The linter er yamllint.

Gagnlegir valkostir í þessum hluta stillingarinnar eru hæfileikinn til að tilgreina stillingarskrá fyrir yamllint, framsenda umhverfisbreytur eða slökkva á linter:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

umhverfi

Lýsir uppsetningu tilvikanna.
Ef um er að ræða docker sem ökumann er sameindin endurtekin yfir þennan hluta og hver þáttur listans er fáanlegur í Dockerfile.j2 sem breyta item.

Ef um er að ræða ökumann sem krefst create.yml и destroy.yml, hlutinn er fáanlegur í þeim sem molecule_yml.platforms, og endurtekningum yfir það er þegar lýst í þessum skrám.

Þar sem sameindin veitir stjórn á tilvikum til hugsanlegra eininga ætti einnig að leita að lista yfir mögulegar stillingar þar. Fyrir docker, til dæmis, er einingin notuð docker_container_module. Hvaða einingar eru notaðar í öðrum reklum má finna í skjöl.

Auk þess má finna dæmi um notkun ýmissa ökumanna í prófunum á sameindinni sjálfri.

Skiptu út hér centos: 7 á Ubuntu.

útvegsaðili

"Birgir" - aðili sem heldur utan um tilvik. Þegar um sameind er að ræða er þetta mögulegt, stuðningur við aðra er ekki fyrirhugaður, þannig að hægt er að kalla þennan hluta ansible útbreidda uppsetningu með fyrirvara.
Hér getur þú tilgreint margt, ég mun draga fram aðalatriðin, að mínu mati:

  • leikbækur: þú getur tilgreint hvaða leikrit á að nota á ákveðnum stigum.

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • Valkostir: Mögulegir valkostir og umhverfisbreytur

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

atburðarás

Nafn og lýsing á handritaröðum.
Þú getur breytt sjálfgefna aðgerðafylki hvaða skipunar sem er með því að bæta lyklinum við <command>_sequence og sem gildi fyrir það með því að skilgreina lista yfir skref sem við þurfum.
Segjum að við viljum breyta röð aðgerða þegar keyrt er playbook run skipunina: molecule converge

# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

sannprófandi

Að setja upp ramma fyrir prófanir og linter við það. Sjálfgefið linter er testinfra и flake8. Mögulegir valkostir eru þeir sömu og hér að ofan:

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: bar

Snúum okkur aftur að hlutverki okkar. Við skulum breyta skránni tasks/main.yml til þessa:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

Og bæta prófum við 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")

Búið, það er aðeins eftir að keyra (frá rót hlutverksins, minnir mig á):

> molecule test

Langur útblástur undir spoilernum:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

Einfalt hlutverk okkar var prófað án vandræða.
Það er þess virði að muna að ef það eru vandamál í vinnunni molecule test, þá ef þú breyttir ekki sjálfgefna röðinni mun sameindin eyða tilvikinu.

Eftirfarandi skipanir eru gagnlegar fyrir villuleit:

> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge          # Оставляет инстанс после прогона тестируемой роли.
> molecule login             # Зайти в созданный инстанс.
> molecule --help            # Полный список команд.

Núverandi hlutverk

Að bæta nýju handriti við núverandi hlutverk er úr hlutverkaskránni með eftirfarandi skipunum:

# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>

Ef þetta er fyrsta atburðarás í hlutverkinu, þá færibreytan -s hægt að sleppa því þar sem það mun búa til handrit default.

Ályktun

Eins og þú sérð er sameindin ekki mjög flókin og með því að nota þín eigin sniðmát er hægt að minnka uppsetningu nýs handrits í að breyta breytum í leikbókum til að búa til og eyða tilvikum. Sameindin fellur óaðfinnanlega að CI kerfum, sem gerir þér kleift að auka hraða þróunar með því að draga úr tíma fyrir handvirkar prófanir á leikbókum.

Takk fyrir athyglina. Ef þú hefur reynslu af því að prófa hugsanleg hlutverk og það tengist ekki sameindinni, segðu okkur frá því í athugasemdunum!

Heimild: www.habr.com

Bæta við athugasemd