Tilmaamaha: sida loo tijaabiyo doorarka macquulka ah iyo in la ogaado dhibaatooyinka ka hor wax soo saarka

Hello qof walba!

Waxaan u shaqeeyaa sidii Injineer DevOps ah oo ku jira adeegga ballansashada hudheelka. Ostrovok.ru. Maqaalkan, waxaan rabaa inaan ka hadlo khibradeena tijaabinta doorarka macquulka ah.

At Ostrovok.ru, waxaan u isticmaalnaa macquul maareeye qaabeynta. Dhawaan, waxaan u nimid baahida loo qabo in la tijaabiyo doorarka, laakiin sida ay soo baxday, ma jiraan qalab aad u badan oo tan ah - kan ugu caansan, laga yaabee, waa qaabka Molecule, sidaas darteed waxaan go'aansanay inaan isticmaalno. Laakiin waxaa soo baxday in dukumeentigiisu uu ka aamusan yahay godad badan. Ma helin buug-gacmeed faahfaahsan oo ku filan oo Ruush ah, markaa waxaan go'aansannay inaan qorno maqaalkan.

Tilmaamaha: sida loo tijaabiyo doorarka macquulka ah iyo in la ogaado dhibaatooyinka ka hor wax soo saarka

Britain

Molecule - qaab-dhismeed ka caawinaya tijaabinta doorarka macquulka ah.

Sharaxaadda la fududeeyay: Moleekule-ku waxa uu tusaale ka abuuraa goobta aad ku qeexday (daruur, mashiinka farsamada, weel; faahfaahin dheeraad ah, eeg qaybta Driver), ku socodsiiya doorkaaga, ka dibna tijaabi tijaabooyin oo tirtiraya tusaalaha. Haddii ay dhacdo guuldarro mid ka mid ah tillaabooyinka, Molecule ayaa ku wargelin doona arrintaas.

Hadda ka badan.

Qeyb ka mid ah aragti

Tixgeli labada qaybood ee muhiimka ah ee Molecule: Scenario iyo Driver.

Muuqaal

Qoraalku waxa uu ka kooban yahay sharaxaad waxa, meesha, sida iyo sida isku xigxiga la samayn doono. Hal door ayaa yeelan kara qoraallo badan, mid walbana waa hage ku yaal waddada <role>/molecule/<scenario>, kaas oo ka kooban sharaxaadaha ficilada looga baahan yahay imtixaanka. Qoraalka waa in lagu daraa default, kaas oo si toos ah loo abuuri doono haddii aad doorka ku bilawdo Molecule. Magacyada qoraallada soo socda adiga ayay kugu xiran tahay.

Tixraaca tallaabooyinka tijaabada ee qoraalka ayaa loo yaqaan Matrix, oo asal ahaan waa:

(Tallaabooyin lagu calaamadeeyay ?, si toos ah looga booday haddii uusan isticmaaluhu cayimin)

  • lint - orodka linters. Sida caadiga ah ayaa loo isticmaalaa yamllint и flake8,
  • destroy - Tirtirida tusaalooyinka bilawgii ugu dambeeyay ee Molecule (haddii ay jiraan),
  • dependency? - rakibidda ku-tiirsanaanta suurtagalka ah ee doorka la tijaabiyay,
  • syntax - hubinta syntax ee doorka isticmaalaya ansible-playbook --syntax-check,
  • create - abuurista tusaale,
  • prepare? - diyaarinta tusaale ahaan; tusaale, hubi/ku rakib Python2
  • converge - daah-furka buugga-ciyaaraha ee la tijaabinayo,
  • idempotence - dib u bilaabida buuga-ciyaaraha ee tijaabada arapotency,
  • side_effect? - falalka aan si toos ah ula xiriirin doorka, laakiin lagama maarmaanka u ah imtixaannada;
  • verify - socodsiinta tijaabooyinka qaabeynta natiijada iyadoo la adeegsanayo testinfra(default) /goss/inspec,
  • cleanup? - (noocyo cusub) - qiyaas ahaan, "nadiifinta" kaabayaasha dibadda ee uu saameeyay Molecule,
  • destroy - Tirtir tusaale

Taxanahan ayaa daboolaya inta badan kiisaska, laakiin waa la bedeli karaa haddii loo baahdo.

Mid kasta oo ka mid ah tillaabooyinka kore si gaar ah ayaa loo socodsiin karaa molecule <command>. Laakiin waa in la fahamsan yahay in amar kasta oo noocaas ah uu jiri karo ficilkiisa taxanaha ah, kaas oo aad ku ogaan karto adigoo fulinaya. molecule matrix <command>. Tusaale ahaan, marka la wado amarka converge (la socodsiinta buugga-ciyaaraha ee imtixaanka), tallaabooyinka soo socda ayaa la samayn doonaa:

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

Taxanaha falalkan waa la tifatiri karaa Haddii wax ka mid ah liiska hore loo sameeyay, waa laga boodi doonaa. Xaaladda hadda jirta, iyo sidoo kale habaynta tusaalooyinka, Moleculeku wuxuu ku kaydiyaa tusaha $TMPDIR/molecule/<role>/<scenario>.

Tallaabooyinka ku dar ? waxaad ku qeexi kartaa ficilada la rabo qaabka buug-ciyaareedka macquulka ah, oo samee magaca faylka si waafaqsan tillaabada: prepare.yml/side_effect.yml. Filo faylashan Moleekuleku wuxuu ku jiri doonaa galka qoraalka.

Driver

Darawalku waa koox lagu sameeyo tusaalooyin imtixaan.
Liistada darawallada caadiga ah ee Molecule ay u diyaarsan tahay qaab-dhismeedka waa sida soo socota: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Wakiil.

Inta badan, qaab-dhismeedka waa faylal create.yml и destroy.yml galka qoraalka ee qeexaya abuurista iyo tirtirka tusaale, siday u kala horreeyaan.
Waxyaabaha ka reeban waa Docker iyo Vagrant, maadaama isdhexgalka cutubyadoodu ay dhici karaan iyada oo aan la helin faylalka aan soo sheegnay.

Waxaa habboon in la muujiyo darawalka loo wakiishay, maadaama haddii loo isticmaalo faylalka abuurista iyo tirtirka tusaale ahaan, kaliya la shaqeynta qaabeynta xaaladaha ayaa lagu qeexay, inta soo hartay waa in lagu qeexaa injineerka.

Dareewalka caadiga ah waa Docker.

Hadda aynu u gudubno ku celcelinta oo aynu tixgalino sifooyin dheeraad ah halkaas.

Bilaabidda

Sida "adduunka hello", aan tijaabinno door rakibidda nginx fudud. Waxaan u dooran doonaa docker ka darawal ahaan - Waxaan u maleynayaa in badankiin aad rakibtay (oo xusuusnow in docker-ku yahay darawalka caadiga ah).

Diyaarso virtualenv oo ku rakib molecule:

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

Tallaabada xigta waa in la bilaabo doorka cusub.
Bilawga door cusub, iyo sidoo kale qoraal cusub, ayaa la sameeyaa iyadoo la adeegsanayo amarka 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

Waxay soo baxday door macquul ah oo caadi ah. Dheeraad ah, dhammaan isdhexgalka CLI Molecules waxaa laga sameeyay asalka doorka.

Aan aragno waxa ku jira hagaha doorka:

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

1 directory, 6 files

Aan falanqeyno qaabeynta molecule/default/molecule.yml (Beddel kaliya sawirka docker):

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

ku tiirsanaanta

Qaybtani waxay qeexaysaa isha ku tiirsanaanta.

Doorashooyinka suurtagalka ah: Galaxy, khuseysaa, qolof.

Shell waa kaliya qolof amar ah oo loo isticmaalo haddii ay galaxy iyo gilt dabooli waayaan baahiyahaaga.

Anigu halkan ma degi doono muddo dheer, waa ku filan tahay in lagu tilmaamo dukumentiyo.

wadaha

Magaca darawalka. Anaga ayaa docker ah.

marada

Linter waa yamllint.

Ikhtiyaarada waxtarka leh ee qaybtan qaabaynta ayaa ah awooda lagu qeexo faylka qaabaynta ee yamllint, doorsoomayaasha deegaanka ee hore u qaadida, ama curyaamin linter:

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

dhufto ee

Wuxuu qeexayaa habaynta tusaalooyinka.
Marka laga hadlayo docker ka darawal ahaan, Molecule ayaa lagu soo celceliyay qaybtan, iyo shay kasta oo liiska ka mid ah ayaa laga heli karaa Dockerfile.j2 doorsoome ahaan item.

Xaaladda darawalka u baahan create.yml и destroy.yml, qaybta waxaa laga heli karaa iyaga sida molecule_yml.platforms, iyo ku celcelintiisa ayaa horeba loogu sifeeyay faylalkan.

Maadaama Molecule-ku uu bixiyo kontoroolka tusaalooyinka cutubyada macquulka ah, liiska goobaha suurtagalka ah waa in sidoo kale halkaas laga raadiyaa. Docker, tusaale ahaan, moduleka ayaa la isticmaalaa docker_container_module. Qaybaha loo isticmaalo darawalada kale ayaa laga heli karaa dukumentiyo.

Iyo sidoo kale tusaalooyin isticmaalka darawallada kala duwan ayaa laga heli karaa imtixaanada Molecule laftiisa.

Halkan ku bedel senti:7 on ubuntu.

bixiye

"Alaab-qeybiye" - waa hay'ad maamusha tusaalooyinka. Xaaladda Molecule, tani waa mid macquul ah, taageerada kuwa kale looma qorsheyn, sidaas darteed qaybtan waxaa loogu yeeri karaa qaabeynta la kordhin karo oo la heli karo oo leh digniin.
Halkan waxaad ku qeexi kartaa waxyaabo badan, waxaan iftiimin doonaa qodobada ugu muhiimsan, fikradayda:

  • buugaagta ciyaarta: waxaad qeexi kartaa buugaagta ciyaarta ee ay tahay in la isticmaalo marxaladaha qaarkood.

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

  • fursadahaXulasho macquul ah iyo doorsoomayaasha deegaanka

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

dhacdo

Magaca iyo sharaxaadda taxanaha qoraalka.
Waxaad bedeli kartaa jaantuska ficilka caadiga ah ee amar kasta adiga oo ku daraya furaha <command>_sequence iyo qiimo ahaan iyada oo la qeexayo liiska tillaabooyinka aan u baahanahay.
Aynu nidhaahno waxaanu rabnaa inaanu bedelno talaabooyinka isku xigxiga marka aanu wadno amarka orodka buugga-ciyaaraha: molecule converge

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

hubin

Dejinta qaab-dhismeedka imtixaanada iyo tilmaanta. Linter default waa testinfra и flake8. Ikhtiyaarada suurtagalka ah waa kuwan sare:

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

Aan u soo noqono doorkeena. Aan wax ka beddelno faylka tasks/main.yml noocaan:

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

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

Oo ku dar imtixaanada 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")

La sameeyay, waxa ay hadhaysaa oo kaliya in la ordo (laga bilaabo xididka doorka, aan ku xasuusiyo):

> molecule test

qiiqa dheer ee hoostiisa:

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

Doorkeena fudud waxaa lagu tijaabiyay dhibaato la'aan.
Waxaa habboon in la xasuusto haddii ay jiraan dhibaatooyin inta lagu jiro shaqada molecule test, ka dib haddii aadan bedelin taxanaha caadiga ah, Molecule ayaa tirtiri doona tusaale ahaan.

Amarradan soo socda ayaa faa'iido u leh cilladaha:

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

Doorka jira

Ku darista qoraal cusub door jira waa ka tusaha doorka oo wata amarada soo socda:

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

Haddii tani ay tahay dhacdada ugu horreysa ee doorka, ka dibna cabbirka -s waa laga tagi karaa maadaama ay abuuri doonto qoraal default.

gunaanad

Sida aad arki karto, Molecule ma aha mid aad u adag, oo adiga oo isticmaalaya jaantusyadaada, geynta qoraal cusub waxaa lagu yarayn karaa tafatirka doorsoomayaasha tusaale ahaan abuurista iyo tirtirida buugaagta ciyaarta. Unugyadu waxay si aan kala go 'lahayn ula midoobaan nidaamyada CI, kaas oo kuu ogolaanaya inaad kordhiso xawaaraha horumarka adoo yaraynaya wakhtiga tijaabada gacanta ee buugaagta ciyaarta.

Waad ku mahadsan tahay dareenkaaga. Haddii aad khibrad u leedahay tijaabinta doorarka macquulka ah, oo aysan la xiriirin Molecule, nooga sheeg faallooyinka!

Source: www.habr.com

Add a comment