Maelekezo: jinsi ya kupima majukumu yanayofaa na kujua kuhusu matatizo kabla ya uzalishaji

Hello kila mtu!

Ninafanya kazi kama mhandisi wa DevOps kwa huduma ya kuweka nafasi kwenye hoteli. Ostrovok.ru. Katika makala hii nataka kuzungumza juu ya uzoefu wetu katika kupima majukumu Ansible.

Katika Ostrovok.ru tunatumia ansible kama meneja wa usanidi. Hivi majuzi tulikuja kwa hitaji la kujaribu majukumu, lakini, kama ilivyotokea, hakuna zana nyingi za hii - maarufu zaidi, labda, ni mfumo wa Molekuli, kwa hivyo tuliamua kuitumia. Lakini ikawa kwamba nyaraka zake haziko kimya juu ya mitego mingi. Hatukuweza kupata mwongozo wa kina wa kutosha kwa Kirusi, kwa hiyo tuliamua kuandika makala hii.

Maelekezo: jinsi ya kupima majukumu yanayofaa na kujua kuhusu matatizo kabla ya uzalishaji

molekuli

Molekuli - mfumo wa kusaidia kupima majukumu yanayofaa.

Maelezo yaliyorahisishwa: Molekuli huunda mfano kwenye jukwaa unalobainisha (wingu, mashine pepe, chombo; kwa maelezo zaidi, angalia sehemu. Dereva), huendesha jukumu lako juu yake, kisha huendesha majaribio na kufuta mfano. Ikiwa kuna kutofaulu katika moja ya hatua, Molekuli itakuarifu kuihusu.

Sasa zaidi.

Nadharia kidogo

Hebu tuzingatie vyombo viwili muhimu vya Molekuli: Igizo na Dereva.

Hali

Hati ina maelezo ya nini, wapi, jinsi gani na katika mlolongo gani utafanywa. Jukumu moja linaweza kuwa na maandishi kadhaa, na kila moja ni saraka kando ya njia <role>/molecule/<scenario>, iliyo na maelezo ya vitendo vinavyohitajika kwa mtihani. Lazima kuwe na hati default, ambayo itaundwa kiotomatiki ikiwa utaanzisha jukumu kwa kutumia Molekuli. Majina ya hati zifuatazo yako kwa hiari yako.

Mlolongo wa vitendo vya upimaji katika hati huitwa tumbo, na kwa chaguo-msingi ni kama hii:

(Hatua zilizowekwa alama ?, kurukwa kwa chaguo-msingi ikiwa haijabainishwa na mtumiaji)

  • lint - linters zinazoendesha. Kwa chaguo-msingi yamllint и flake8,
  • destroy - kufuta matukio kutoka kwa uzinduzi wa mwisho wa Molekuli (ikiwa itasalia),
  • dependency? - kusanikisha utegemezi unaowezekana wa jukumu lililojaribiwa,
  • syntax - kuangalia sintaksia ya jukumu kwa kutumia ansible-playbook --syntax-check,
  • create - kuunda mfano,
  • prepare? - kuandaa mfano; kwa mfano kuangalia/kusakinisha python2
  • converge - kuzindua kitabu cha kucheza kilichojaribiwa,
  • idempotence - endesha tena kitabu cha kucheza kwa mtihani wa kutokuwa na uwezo,
  • side_effect? - vitendo ambavyo havihusiani moja kwa moja na jukumu, lakini ni muhimu kwa vipimo;
  • verify — inaendesha majaribio ya usanidi unaotokana kwa kutumia testinfra(chaguo-msingi) /goss/inspec,
  • cleanup? - (katika matoleo mapya) - kwa kusema, "kusafisha" miundombinu ya nje iliyoathiriwa na Molekuli,
  • destroy - kufuta mfano.

Mlolongo huu unashughulikia kesi nyingi, lakini unaweza kurekebishwa ikiwa ni lazima.

Kila moja ya hatua zilizo hapo juu zinaweza kuendeshwa tofauti kwa kutumia molecule <command>. Lakini unapaswa kuelewa kuwa kwa kila amri kama hiyo kunaweza kuwa na mlolongo wake wa vitendo, ambao unaweza kujua kwa kukimbia. molecule matrix <command>. Kwa mfano, wakati wa kuendesha amri converge (kuendesha kitabu cha kucheza kilichojaribiwa) vitendo vifuatavyo vitafanywa:

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

Mlolongo wa vitendo hivi unaweza kuhaririwa. Ikiwa kitu kutoka kwenye orodha tayari kimekamilika, kitarukwa. Hali ya sasa, pamoja na usanidi wa mfano, huhifadhiwa kwenye saraka ya Molekuli $TMPDIR/molecule/<role>/<scenario>.

Ongeza hatua na ? Unaweza kuelezea vitendo unavyotaka katika umbizo la kitabu cha kucheza cha Ansible, na utengeneze jina la faili kulingana na hatua: prepare.yml/side_effect.yml. Tarajia faili hizi za Molekuli kuwa kwenye folda ya hati.

Dereva

Dereva ni huluki ambapo matukio ya majaribio yanaundwa.
Orodha ya viendeshi vya kawaida ambavyo Molekuli ina violezo vilivyotengenezwa tayari ni: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Katika hali nyingi, templates ni faili create.yml и destroy.yml kwenye folda ya maandishi, ambayo inaelezea uundaji na ufutaji wa mfano, mtawaliwa.
Isipokuwa ni Docker na Vagrant, kwani mwingiliano na moduli zao unaweza kutokea bila faili zilizo hapo juu.

Inafaa kuangazia dereva aliyekabidhiwa, kwani ikiwa inatumiwa, ni kazi tu iliyo na usanidi wa mfano inavyoelezewa katika mfano wa uundaji na faili za kufuta; iliyobaki inapaswa kuelezewa na mhandisi.

Dereva chaguo-msingi ni Docker.

Sasa hebu tuendelee kufanya mazoezi na kuzingatia vipengele zaidi hapo.

Anza

Kama "ulimwengu wa habari" tutajaribu jukumu rahisi la usakinishaji wa nginx. Wacha tuchague kizimbani kama dereva - nadhani wengi wako wameisakinisha (na kumbuka kuwa kizimbani ndio kiendesha chaguo-msingi).

RџRѕRґRіRѕS, RѕRІReRј virtualenv na usakinishe ndani yake molecule:

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

Hatua inayofuata ni kuanzisha jukumu jipya.
Uanzishaji wa jukumu jipya, pamoja na hati mpya, unafanywa kwa kutumia amri 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

Matokeo yake ni jukumu la kawaida linalofaa. Zaidi ya hayo, mwingiliano wote na Molekuli CLI hufanywa kutoka kwa mzizi wa jukumu.

Wacha tuone ni nini kwenye saraka ya jukumu:

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

1 directory, 6 files

Wacha tuangalie usanidi molecule/default/molecule.yml (tutabadilisha tu picha ya kizimbani):

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

utegemezi

Sehemu hii inaelezea chanzo cha utegemezi.

Chaguzi zinazowezekana: galaxy, inatumika, ganda.

Shell ni ganda la amri la kutumia ikiwa galaksi na gilt haitoi mahitaji yako.

Sitakaa hapa kwa muda mrefu, imeelezewa vya kutosha ndani nyaraka.

dereva

Jina la dereva. Kwa sisi hii ni docker.

taa

Yamllint hutumiwa kama kitambaa.

Chaguzi muhimu katika sehemu hii ya usanidi ni uwezo wa kubainisha faili ya usanidi ya yamllint, vigezo vya mazingira ya mbele, au kulemaza linter:

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

majukwaa

Inaelezea usanidi wa matukio.
Katika kesi ya docker kama dereva, Molekuli inasisitiza juu ya sehemu hii, na kila kipengele cha orodha kinapatikana katika Dockerfile.j2 kama kigeugeu item.

Katika kesi ya dereva ambayo create.yml и destroy.yml, sehemu hiyo inapatikana ndani yao kama molecule_yml.platforms, na marudio juu yake tayari yameelezewa katika faili hizi.

Kwa kuwa Molekuli hutoa usimamizi wa mfano kwa moduli Ansible, unapaswa kutafuta orodha ya mipangilio inayowezekana hapo. Kwa Docker, kwa mfano, moduli hutumiwa moduli_ya_chombo. Ni moduli gani zinazotumiwa katika viendeshi vingine zinaweza kupatikana ndani nyaraka.

Unaweza pia kupata mifano ya kutumia madereva mbalimbali katika vipimo vya Molekuli yenyewe.

Hebu tubadilishe hapa senti:7 juu ya ubuntu.

mtoaji

"Mtoa huduma" ni huluki inayosimamia matukio. Kwa upande wa Molekuli, hii inastahili; usaidizi kwa wengine haujapangwa, kwa hivyo sehemu hii inaweza, kwa kuweka nafasi, kuitwa usanidi uliopanuliwa.
Kuna mengi unaweza kutaja hapa, lakini nitaangazia mambo makuu, kwa maoni yangu:

  • vitabu vya kucheza: Unaweza kubainisha ni vitabu vipi vya kucheza vinafaa kutumika katika hatua fulani.

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

  • chaguzi: Vigezo vinavyofaa na vigezo vya mazingira

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

scenario

Kichwa na maelezo ya mfuatano wa hati.
Unaweza kubadilisha matrix chaguo-msingi ya amri kwa kuongeza kitufe <command>_sequence na kama thamani yake, ikifafanua orodha ya hatua tunazohitaji.
Wacha tuseme tunataka kubadilisha mlolongo wa vitendo wakati wa kuendesha amri ya kukimbia ya kitabu cha kucheza: molecule converge

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

kuangalia

Kuweka mfumo wa vipimo na linter kwa ajili yake. Kwa default, linter hutumiwa testinfra и flake8. Chaguzi zinazowezekana ni sawa na hapo juu:

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

Turudi kwenye jukumu letu. Hebu tuhariri faili tasks/main.yml kwa mwonekano huu:

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

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

Na ongeza vipimo 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")

Imekamilika, kilichobaki ni kukimbia (kutoka kwa mzizi wa jukumu, wacha nikukumbushe):

> molecule test

Kutolea nje kwa muda mrefu chini ya spoiler:

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

Jukumu letu rahisi lilijaribiwa bila shida.
Inafaa kukumbuka kuwa ikiwa shida zinatokea wakati wa operesheni molecule test, basi ikiwa haukubadilisha mlolongo wa kawaida, Molekuli itafuta mfano.

Amri zifuatazo ni muhimu kwa utatuzi:

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

Jukumu lililopo

Kuongeza hati mpya kwa jukumu lililopo hutokea kutoka kwa saraka ya jukumu na amri zifuatazo:

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

Ikiwa hii ndiyo hati ya kwanza katika jukumu, basi parameta -s inaweza kuachwa kwani hati itaundwa default.

Hitimisho

Kama unavyoona, Molekuli sio ngumu sana, na unapotumia violezo vyako mwenyewe, unaweza kupunguza utumaji wa hati mpya ili kuhariri vijiti kwenye vitabu vya kucheza vya kuunda na kufuta matukio. Molekuli inaunganishwa bila mshono na mifumo ya CI, ambayo hukuruhusu kuongeza kasi ya ukuzaji kwa kupunguza muda wa majaribio ya mwongozo wa vitabu vya kucheza.

Asante kwa umakini wako. Ikiwa una uzoefu wa kupima majukumu yanayofaa, na haihusiani na Molekuli, tuambie kuhusu hilo kwenye maoni!

Chanzo: mapenzi.com

Kuongeza maoni