Cyfarwyddiadau: sut i brofi rolau synhwyrol a chael gwybod am broblemau cyn cynhyrchu

Helo bawb!

Rwy'n gweithio fel peiriannydd DevOps mewn gwasanaeth archebu gwesty. Ostrovok.ru. Yn yr erthygl hon, rwyf am siarad am ein profiad o brofi rolau asible.

Yn Ostrovok.ru, rydym yn defnyddio ansible fel rheolwr cyfluniad. Yn ddiweddar, daethom at yr angen i brofi rolau, ond fel y digwyddodd, nid oes cymaint o offer ar gyfer hyn - y mwyaf poblogaidd, efallai, yw'r fframwaith Moleciwl, felly fe benderfynon ni ei ddefnyddio. Ond mae'n troi allan bod ei ddogfennaeth yn dawel am lawer o beryglon. Ni allem ddod o hyd i lawlyfr digon manwl yn Rwsieg, felly penderfynasom ysgrifennu'r erthygl hon.

Cyfarwyddiadau: sut i brofi rolau synhwyrol a chael gwybod am broblemau cyn cynhyrchu

Moleciwlaidd

Moleciwl - fframwaith i helpu i brofi rolau anible.

Disgrifiad symlach: Mae'r moleciwl yn creu enghraifft ar y platfform rydych chi'n ei nodi (cwmwl, peiriant rhithwir, cynhwysydd; am ragor o fanylion, gweler yr adran gyrrwr), yn rhedeg eich rôl arno, yna'n rhedeg profion ac yn dileu'r enghraifft. Mewn achos o fethiant ar un o'r camau, bydd y Moleciwl yn eich hysbysu amdano.

Nawr mwy.

Darn o theori

Ystyriwch ddau endid allweddol yn y Moleciwl: Senario a Driver.

Senario

Mae'r sgript yn cynnwys disgrifiad o beth, ble, sut ac ym mha ddilyniant fydd yn cael ei berfformio. Gall un rôl gael sawl sgript, ac mae pob un yn gyfeiriadur ar hyd y llwybr <role>/molecule/<scenario>, sy'n cynnwys disgrifiadau o'r camau gweithredu sy'n ofynnol ar gyfer y prawf. Rhaid cynnwys y sgript default, a fydd yn cael ei greu yn awtomatig os byddwch yn cychwyn y rôl gyda Moleciwl. Chi sydd i benderfynu ar enwau'r sgriptiau canlynol.

Gelwir y dilyniant o weithredoedd profi mewn sgript matrics, ac yn ddiofyn dyma yw:

(Camau wedi'u labelu ?, wedi'i hepgor yn ddiofyn os na chaiff ei nodi gan y defnyddiwr)

  • lint - linters rhedeg. Yn ddiofyn yn cael eu defnyddio yamllint и flake8,
  • destroy - dileu enghreifftiau o lansiad diwethaf y Moleciwl (os o gwbl),
  • dependency? — gosod dibyniaeth aswy y rôl a brofwyd,
  • syntax - gwirio cystrawen y rôl gan ddefnyddio ansible-playbook --syntax-check,
  • create - creu enghraifft,
  • prepare? — paratoi'r enghraifft; e.e. gwirio/gosod python2
  • converge — lansiad y llyfr chwarae sy'n cael ei brofi,
  • idempotence - ailgychwyn y llyfr chwarae ar gyfer y prawf analluedd,
  • side_effect? - gweithredoedd nad ydynt yn uniongyrchol gysylltiedig â'r rôl, ond sy'n angenrheidiol ar gyfer profion,
  • verify - rhedeg profion y cyfluniad canlyniadol gan ddefnyddio testinfra(diofyn) /goss/inspec,
  • cleanup? - (mewn fersiynau newydd) - yn fras, "glanhau" y seilwaith allanol y mae'r Moleciwl yn effeithio arno,
  • destroy - Dileu enghraifft.

Mae'r dilyniant hwn yn cwmpasu'r rhan fwyaf o achosion, ond gellir ei newid os oes angen.

Gellir rhedeg pob un o'r camau uchod ar wahân gyda molecule <command>. Ond dylid deall y gall fod ei ddilyniant ei hun o gamau gweithredu ar gyfer pob cli-orchymyn o'r fath, y gallwch chi ei ddarganfod trwy weithredu molecule matrix <command>. Er enghraifft, wrth redeg y gorchymyn converge (gan redeg y llyfr chwarae dan brawf), bydd y gweithredoedd canlynol yn cael eu perfformio:

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

Gellir golygu dilyniant y gweithredoedd hyn. Os oes rhywbeth o'r rhestr eisoes wedi'i wneud, bydd yn cael ei hepgor. Y cyflwr presennol, yn ogystal â chyfluniad yr achosion, mae'r Molecule yn storio yn y cyfeiriadur $TMPDIR/molecule/<role>/<scenario>.

Ychwanegu camau gyda ? gallwch ddisgrifio'r gweithredoedd dymunol yn y fformat llyfr chwarae ansible, a gwneud enw'r ffeil yn ôl y cam: prepare.yml/side_effect.yml. Disgwyl y ffeiliau hyn Bydd y moleciwl yn y ffolder sgript.

gyrrwr

Mae gyrrwr yn endid lle mae achosion prawf yn cael eu creu.
Mae'r rhestr o yrwyr safonol y mae gan Molecule dempledi yn barod ar eu cyfer fel a ganlyn: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Dirprwyedig.

Yn y rhan fwyaf o achosion, mae templedi yn ffeiliau create.yml и destroy.yml yn y ffolder sgript sy'n disgrifio creu a dileu enghraifft, yn y drefn honno.
Yr eithriadau yw Docker a Vagrant, gan y gall rhyngweithio â'u modiwlau ddigwydd heb y ffeiliau a grybwyllwyd uchod.

Mae'n werth tynnu sylw at y gyrrwr dirprwyedig, oherwydd os caiff ei ddefnyddio yn y ffeiliau ar gyfer creu a dileu enghraifft, dim ond gwaith gyda chyfluniad achosion a ddisgrifir, dylai'r peiriannydd ddisgrifio'r gweddill.

Y gyrrwr diofyn yw Docker.

Nawr, gadewch i ni symud ymlaen i ymarfer ac ystyried nodweddion pellach yno.

Dechrau Arni

Fel "byd helo", gadewch i ni brofi rôl gosod nginx syml. Gadewch i ni ddewis docwr fel y gyrrwr - rwy'n credu bod y rhan fwyaf ohonoch wedi ei osod (a chofiwch mai docwr yw'r gyrrwr rhagosodedig).

Paratoi virtualenv a gosod ynddo molecule:

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

Y cam nesaf yw cychwyn y rôl newydd.
Mae cychwyn rôl newydd, yn ogystal â sgript newydd, yn cael ei berfformio gan ddefnyddio'r gorchymyn 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

Mae'n troi allan rôl arferol asible-. Ymhellach, mae pob rhyngweithiad â Moleciwlau CLI yn cael ei wneud o wraidd y rôl.

Gawn ni weld beth sydd yn y cyfeiriadur rôl:

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

1 directory, 6 files

Gadewch i ni ddadansoddi'r ffurfwedd molecule/default/molecule.yml (disodli delwedd docwr yn unig):

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

dibyniaeth

Mae'r adran hon yn disgrifio ffynhonnell dibyniaethau.

Opsiynau posib: galaeth, yn berthnasol, plisgyn.

Cragen orchymyn yn unig yw Shell a ddefnyddir rhag ofn na fydd galaeth a gilt yn diwallu'ch anghenion.

Ni fyddaf yn trigo yma am amser hir, mae'n ddigon a ddisgrifir yn dogfennaeth.

gyrrwr

Enw'r gyrrwr. Ein un ni yw docker.

lliain

Yamllint yw'r linter.

Opsiynau defnyddiol yn y rhan hon o'r ffurfweddiad yw'r gallu i nodi ffeil ffurfweddu ar gyfer yamllint, newidynnau amgylchedd ymlaen, neu analluogi'r linter:

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

llwyfannau

Yn disgrifio cyfluniad yr achosion.
Yn achos docwr fel gyrrwr, ailadroddir y Moleciwl dros yr adran hon, ac mae pob elfen o'r rhestr ar gael yn Dockerfile.j2 fel newidyn item.

Yn achos gyrrwr sy'n gofyn create.yml и destroy.yml, y mae yr adran ar gael ynddynt fel molecule_yml.platforms, ac iteriadau drosto eisoes wedi'u disgrifio yn y ffeiliau hyn.

Gan fod y Moleciwl yn darparu rheolaeth ar achosion i fodiwlau asible, dylid edrych am y rhestr o leoliadau posibl yno hefyd. Ar gyfer docwr, er enghraifft, defnyddir y modiwl docker_container_modiwl. Gellir dod o hyd i ba fodiwlau a ddefnyddir mewn gyrwyr eraill dogfennaeth.

Yn ogystal ag enghreifftiau o'r defnydd o yrwyr amrywiol i'w gweld yn mhrofion y Moleciwl ei hun.

Amnewid yma centos: 7 ar ubuntu.

darparydd

"Cyflenwr" - endid sy'n rheoli achosion. Yn achos Moleciwl, mae hyn yn ansible, nid yw cefnogaeth i eraill wedi'i gynllunio, felly gellir galw'r adran hon yn gyfluniad estynedig ansible gyda chafeat.
Yma gallwch chi nodi llawer o bethau, byddaf yn tynnu sylw at y prif bwyntiau, yn fy marn i:

  • llyfrau chwarae: gallwch nodi pa lyfrau chwarae y dylid eu defnyddio ar adegau penodol.

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

  • cysylltiad_opsiynau: opsiynau cysylltu

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

  • opsiynau: Opsiynau asible a newidynnau amgylchedd

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

senario

Enw a disgrifiad o ddilyniannau sgript.
Gallwch newid matrics gweithredu diofyn unrhyw orchymyn trwy ychwanegu'r allwedd <command>_sequence ac fel gwerth iddo trwy ddiffinio'r rhestr o gamau sydd eu hangen arnom.
Gadewch i ni ddweud ein bod am newid y dilyniant o gamau gweithredu wrth redeg y gorchymyn rhedeg llyfr chwarae: molecule converge

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

dilyswr

Sefydlu fframwaith ar gyfer profion a leinin iddo. Y leinin rhagosodedig yw testinfra и flake8. Mae'r opsiynau posibl yr un fath â'r uchod:

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

Gadewch i ni ddychwelyd at ein rôl. Gadewch i ni olygu'r ffeil tasks/main.yml i'r math hwn:

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

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

Ac ychwanegu profion at 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")

Wedi'i wneud, dim ond i redeg y mae o hyd (o wraidd y rôl, gadewch imi eich atgoffa):

> molecule test

Ecsôsts hir o dan y sbwyliwr:

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

Profwyd ein rôl syml heb broblemau.
Mae'n werth cofio os oes problemau yn ystod y gwaith molecule test, yna os na wnaethoch chi newid y dilyniant rhagosodedig, bydd y Moleciwl yn dileu'r enghraifft.

Mae'r gorchmynion canlynol yn ddefnyddiol ar gyfer dadfygio:

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

Rôl Bresennol

Mae ychwanegu sgript newydd at rôl sy'n bodoli eisoes yn o'r cyfeiriadur rôl gyda'r gorchmynion canlynol:

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

Rhag ofn mai dyma'r senario cyntaf yn y rôl, yna'r paramedr -s gellir ei hepgor gan y bydd yn creu sgript default.

Casgliad

Fel y gallwch weld, nid yw'r Moleciwl yn gymhleth iawn, a thrwy ddefnyddio'ch templedi eich hun, gellir lleihau defnyddio sgript newydd i olygu newidynnau wrth greu a dileu llyfrau chwarae enghreifftiau. Mae'r moleciwl yn integreiddio'n ddi-dor â systemau CI, sy'n eich galluogi i gynyddu cyflymder datblygiad trwy leihau'r amser ar gyfer profi llyfrau chwarae â llaw.

Diolch am eich sylw. Os oes gennych brofiad o brofi rolau asible, ac nid yw'n gysylltiedig â'r Moleciwl, dywedwch wrthym amdano yn y sylwadau!

Ffynhonnell: hab.com

Ychwanegu sylw