Umarnin: yadda za a gwada m matsayin da kuma gano game da matsaloli kafin samarwa

Hello kowa da kowa!

Ina aiki a matsayin injiniyan DevOps a sabis na yin ajiyar otal. Ostrovok.ru. A cikin wannan labarin, ina so in yi magana game da kwarewarmu wajen gwada ayyuka masu yiwuwa.

A Ostrovok.ru, muna amfani da mai yiwuwa azaman mai sarrafa sanyi. Kwanan nan, mun zo da bukatar gwada ayyuka, amma kamar yadda ya juya, babu kayan aiki da yawa don wannan - mafi mashahuri, watakila, shine tsarin Molecule, don haka mun yanke shawarar yin amfani da shi. Amma ya zamana cewa takardunsa sun yi shiru game da ramummuka da yawa. Ba za mu iya samun isassun cikakken littafin jagora cikin Rashanci ba, don haka mun yanke shawarar rubuta wannan labarin.

Umarnin: yadda za a gwada m matsayin da kuma gano game da matsaloli kafin samarwa

kwayoyin

Kwayoyin halitta - tsarin da zai taimaka gwada iya aiki.

Bayanin Sauƙaƙe: Kwayoyin halitta suna ƙirƙirar misali akan dandamalin da kuka ƙayyade (girgije, injin kama-da-wane, akwati; don ƙarin cikakkun bayanai, duba sashin Direba), gudanar da aikin ku a kai, sannan gudanar da gwaje-gwaje kuma ya goge misalin. Idan rashin nasara akan ɗayan matakan, Molecule zai sanar da ku game da shi.

Yanzu ƙari.

A bit of ka'idar

Yi la'akari da maɓalli biyu masu mahimmanci na Kwayoyin: Scenario da Driver.

Tarihin

Rubutun ya ƙunshi bayanin menene, a ina, ta yaya kuma a wane jeri za a yi. Ɗayan rawar zai iya samun rubutun da yawa, kuma kowane kundin adireshi ne a kan hanya <role>/molecule/<scenario>, wanda ya ƙunshi bayanin ayyukan da ake buƙata don gwajin. Dole ne a haɗa rubutun default, wanda za a ƙirƙira ta atomatik idan kun fara aikin da Molecule. Sunayen rubutun masu zuwa ya rage naku.

Ana kiran jerin ayyukan gwaji a cikin rubutun matrix, kuma ta hanyar tsoho shine:

(Mataki masu alama ?, an tsallake ta ta tsohuwa idan mai amfani bai bayyana shi ba)

  • lint - Gudun linters. Ana amfani da ta tsohuwa yamllint и flake8,
  • destroy - share lokuta daga ƙaddamar da Molecule na ƙarshe (idan akwai),
  • dependency? - shigarwa na abin dogara mai yiwuwa na aikin da aka gwada,
  • syntax - duba juzu'i na rawar ta amfani da ansible-playbook --syntax-check,
  • create - samar da misali,
  • prepare? - shirye-shiryen misali; misali duba/saka Python2
  • converge - ƙaddamar da littafin wasan kwaikwayo da ake gwadawa,
  • idempotence - sake kunna littafin wasan don gwajin idempotency,
  • side_effect? - ayyukan da ba su da alaƙa kai tsaye da rawar, amma wajibi ne don gwaje-gwaje;
  • verify - Gudun gwaje-gwaje na sakamakon sanyi ta amfani da testinfra(default) /goss/inspec,
  • cleanup? - (a cikin sabbin nau'ikan) - kusan magana, "tsaftacewa" abubuwan more rayuwa na waje da kwayoyin halitta suka shafa,
  • destroy - Share misali.

Wannan jeri yana ɗaukar mafi yawan lokuta, amma ana iya canzawa idan ya cancanta.

Ana iya gudanar da kowane matakan da ke sama daban tare da molecule <command>. Amma ya kamata a fahimci cewa kowane irin wannan umarni na iya samun jerin ayyukansa, wanda zaku iya ganowa ta hanyar aiwatarwa. molecule matrix <command>. Misali, lokacin gudanar da umarni converge (Gudanar da littafin wasan a ƙarƙashin gwaji), za a aiwatar da ayyuka masu zuwa:

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

Za a iya gyara jerin waɗannan ayyukan. Idan an riga an yi wani abu daga lissafin, za a tsallake shi. Halin halin yanzu, da kuma tsarin yanayin, Molecule yana adanawa a cikin kundin adireshi $TMPDIR/molecule/<role>/<scenario>.

Ƙara matakai tare da ? Kuna iya kwatanta ayyukan da ake so a cikin tsarin littafin-playbook, kuma ku sanya sunan fayil bisa ga mataki: prepare.yml/side_effect.yml. Yi tsammanin waɗannan fayilolin Kwayoyin za su kasance a cikin babban fayil ɗin rubutun.

Direba

Direba wata ƙungiya ce inda aka ƙirƙiri misalin gwaji.
Jerin daidaitattun direbobi waɗanda Molecule ke da shirye-shiryen samfuri sune kamar haka: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Wakili.

A mafi yawan lokuta, samfura fayiloli ne create.yml и destroy.yml a cikin babban fayil ɗin rubutun da ke bayyana ƙirƙira da gogewa na misali, bi da bi.
Keɓancewar Docker da Vagrant, kamar yadda hulɗa tare da tsarin su na iya faruwa ba tare da fayilolin da aka ambata ba.

Yana da daraja a yi la'akari da Delegate direban, tun da idan aka yi amfani da shi a cikin fayiloli don ƙirƙirar da share misali, kawai aiki tare da daidaitawa na lokuta da aka bayyana, sauran ya kamata a bayyana ta injiniya.

Tsohuwar direba shine Docker.

Yanzu bari mu ci gaba don yin aiki kuma muyi la'akari da ƙarin fasali a wurin.

FarawaEND_LINK

A matsayin "sannu duniya", bari mu gwada aikin shigarwa na nginx mai sauƙi. Bari mu zaɓi docker a matsayin direba - Ina tsammanin yawancin ku an shigar da shi (kuma ku tuna cewa docker shine direban tsoho).

Shirya virtualenv kuma shigar a ciki molecule:

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

Mataki na gaba shine fara sabon aikin.
Ƙaddamar da sabon matsayi, da kuma sabon rubutun, ana yin ta ta amfani da umarnin 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

Ya zama babban rawar da za ta iya takawa. Bugu da ari, duk hulɗa tare da CLI Molecules an yi su ne daga tushen rawar.

Bari mu ga abin da ke cikin kundin jagora:

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

1 directory, 6 files

Bari mu bincika saitin molecule/default/molecule.yml (maye gurbin hoton docker kawai):

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

dogaro

Wannan sashe yana bayyana tushen abin dogaro.

Zaɓuɓɓuka masu yuwuwa: galaxy, amfani, harsashi.

Shell wani harsashi ne kawai wanda ake amfani dashi idan galaxy da gilt basu cika bukatunku ba.

Ba zan daɗe a nan ba, ya isa ya bayyana a ciki takardun.

direba

Sunan direban. Namu docker.

kanti

Linter yamllint.

Zaɓuɓɓuka masu fa'ida a cikin wannan ɓangaren saitin shine ikon tantance fayil ɗin daidaitawa don yamllint, masu canjin yanayi, ko musaki linter:

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

dandamali

Yana bayyana tsarin yanayin.
A cikin yanayin docker a matsayin direba, Molecule an ƙirƙira shi akan wannan sashe, kuma kowane ɓangaren jerin yana samuwa a ciki. Dockerfile.j2 a matsayin m item.

A wajen direban da ke bukata create.yml и destroy.yml, sashen yana samuwa a cikinsu kamar haka molecule_yml.platforms, kuma an riga an siffanta maimaitawa akansa a cikin waɗannan fayilolin.

Tun da Molecule yana ba da ikon sarrafa al'amura zuwa nau'ikan iyawa, jerin saitunan da za a iya kuma ya kamata a nemi a can. Don docker, alal misali, ana amfani da module docker_container_module. Wadanne modules ake amfani da su a wasu direbobi za a iya samu a ciki takardun.

Hakanan ana iya samun misalan amfani da direbobi daban-daban a cikin gwaje-gwajen Kwayoyin da kansa.

Sauya nan cen:7 a kan Ubuntu.

mai bayarwa

"Mai bayarwa" - wani mahaluži da ke kula da lokuta. A cikin yanayin Molecule, wannan yana yiwuwa, ba a shirya tallafi ga wasu ba, don haka ana iya kiran wannan sashe mai tsawaita tsawaitawa tare da faɗakarwa.
Anan za ku iya tantance abubuwa da yawa, zan haskaka mahimman batutuwa, a ra'ayi na:

  • littattafan wasa: za ka iya tantance waɗanne littattafan wasan kwaikwayo ya kamata a yi amfani da su a wasu matakai.

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

  • haɗi_zaɓi: zažužžukan haɗi

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

  • zažužžukanZaɓuɓɓuka masu yiwuwa da masu canjin yanayi

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

labari

Suna da bayanin jerin rubutun.
Kuna iya canza matrix ɗin aikin tsoho na kowane umarni ta ƙara maɓallin <command>_sequence kuma a matsayin darajarta ta hanyar ayyana jerin matakan da muke buƙata.
Bari mu ce muna son canza jerin ayyuka yayin gudanar da umarnin gudu na littafin wasan: molecule converge

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

duba

Ƙirƙirar tsarin gwaje-gwaje da linter zuwa gare shi. Tsohuwar linter shine testinfra и flake8. Zaɓuɓɓuka masu yuwuwa iri ɗaya ne kamar na sama:

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

Mu dawo kan aikinmu. Bari mu gyara fayil ɗin tasks/main.yml ga irin wannan:

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

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

Kuma ƙara gwaje-gwaje zuwa 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")

Anyi, ya rage kawai don gudu (daga tushen rawar, bari in tunatar da ku):

> molecule test

Dogon shaye-shaye a ƙarƙashin mai ɓarna:

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

An gwada aikinmu mai sauƙi ba tare da matsala ba.
Ya kamata a tuna cewa idan akwai matsaloli a lokacin aikin molecule test, to, idan ba ku canza tsarin tsoho ba, Molecule zai share misalin.

Umurnai masu zuwa suna da amfani don gyara kuskure:

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

Matsayin da yake wanzu

Ƙara sabon rubutun zuwa aikin da ake da shi shine daga cikin directory directory tare da umarni masu zuwa:

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

Idan wannan shine yanayin farko a cikin rawar, sai siga -s za a iya tsallake kamar yadda zai haifar da rubutun default.

ƙarshe

Kamar yadda kuke gani, Molecule ɗin ba ya da sarƙaƙiya sosai, kuma ta amfani da samfuran ku, ƙaddamar da sabon rubutun za a iya rage shi zuwa gyara masu canji a cikin ƙirƙira da share littattafan wasan kwaikwayo. Kwayoyin halitta suna haɗuwa da juna tare da tsarin CI, wanda ke ba ku damar haɓaka saurin ci gaba ta hanyar rage lokacin gwajin littafin wasan kwaikwayo.

Na gode da kulawar ku. Idan kuna da gogewa wajen gwada ayyuka masu yiwuwa, kuma ba shi da alaƙa da Molecule, gaya mana game da shi a cikin sharhin!

source: www.habr.com

Add a comment