Imiyalelo: indlela yokuvavanya iindima ezifanelekileyo kwaye ufumane malunga neengxaki ngaphambi kokuveliswa

Sawubona wonke umntu!

Ndisebenza njengenjineli ye-DevOps kwinkonzo yokubhukisha ehotele. Kwingca.ru. Kweli nqaku, ndifuna ukuthetha ngamava ethu ekuvavanyeni iindima ezifanelekileyo.

Kwi-Ostrovok.ru, sisebenzisa i-ansible njengomphathi woqwalaselo. Kungekudala, siye safika kwisidingo sokuvavanya iindima, kodwa njengoko kwavela, akukho zixhobo ezininzi zolu hlobo-ezona zithandwa kakhulu, mhlawumbi, isakhelo seMolekyuli, ngoko sagqiba ekubeni siyisebenzise. Kodwa kuye kwavela ukuba amaxwebhu akhe athule malunga nemigibe emininzi. Asikwazanga ukufumana incwadana eneenkcukacha ngokwaneleyo ngesiRashiya, ngoko sagqiba ekubeni sibhale eli nqaku.

Imiyalelo: indlela yokuvavanya iindima ezifanelekileyo kwaye ufumane malunga neengxaki ngaphambi kokuveliswa

Imolekyuli

Imolekyuli - isakhelo sokunceda ukuvavanya iindima ezifanelekileyo.

Inkcazo eyenziwe lula: Imolekyuli yenza umzekelo kwiqonga olikhankanyayo (ilifu, umatshini wenyani, isikhongozeli; ukufumana iinkcukacha ezithe vetshe, bona icandelo. umqhubi), yenza indima yakho kuyo, emva koko iqhube iimvavanyo kwaye icime umzekelo. Kwimeko yokusilela kwelinye lamanyathelo, iMolekhyule iya kukwazisa ngayo.

Ngoku ngaphezulu.

Ingcamango ethile

Qwalasela izinto ezimbini eziphambili zeMolekyuli: Imeko kunye noMqhubi.

Isimo

Iscript siqulethe inkcazo yento, phi, njani kwaye ngoluphi ulandelelwano oluya kwenziwa. Indima enye inokuba nezikripti ezininzi, kwaye nganye yincwadi esecaleni kwendlela <role>/molecule/<scenario>, equlethe iinkcazo zezenzo ezifunekayo kuvavanyo. Iscript kufuneka sibandakanywe default, eya kwenziwa ngokuzenzekelayo ukuba uqalisa indima ngeMolekyu. Amagama ezi scripts zilandelayo axhomekeke kuwe.

Ukulandelelana kwezenzo zokuvavanya kwiskripthi kuthiwa Matrix, kwaye ngokungagqibekanga yile:

(Amanyathelo abhalwe ?, itsibe ngokungagqibekanga ukuba ayichazwanga ngumsebenzisi)

  • lint - ukubaleka iilinters. Ngokungagqibekanga zisetyenziswa yamllint и flake8,
  • destroy - ukucima iimeko kuphehlelelo lokugqibela lweMolekyuli (ukuba ikhona),
  • dependency? - ukufakwa kokuxhomekeka okufanelekileyo kwendima evavanyiweyo,
  • syntax - ukujonga isintaksi sendima esetyenziswayo ansible-playbook --syntax-check,
  • create - ukwenza umzekelo,
  • prepare? - ukulungiswa komzekelo; umz. khangela/faka ipython2
  • converge -ukusungulwa kwencwadi yokudlala evavanywayo,
  • idempotence -ukuqala kwakhona incwadi yokudlala yovavanyo lokungakwazi ukuphelelwa amandla,
  • side_effect? -izenzo ezingahambelani ngokuthe ngqo nendima, kodwa ziyimfuneko kuvavanyo,
  • verify -ukuqhuba iimvavanyo zesiphumo soqwalaselo usebenzisa testinfra(ehlala ikho) /goss/inspec,
  • cleanup? - (kwiinguqulelo ezintsha) - ukuthetha ngokuthe ngqo, "ukucoca" iziseko zangaphandle ezichatshazelwa yiMolekhyule,
  • destroy - Ukucima umzekelo.

Olu landelelwano luquka iimeko ezininzi, kodwa lunokutshintshwa ukuba kuyimfuneko.

Inyathelo ngalinye kula angasentla lingaqhutywa ngokwahlukeneyo nge molecule <command>. Kodwa kufuneka kuqondwe ukuba kwi-cli-command nganye kunokubakho ukulandelelana kwayo kwezenzo, onokuzifumana ngokwenza. molecule matrix <command>. Umzekelo, xa uqhuba umyalelo converge (usebenzisa incwadi yokudlala phantsi kovavanyo), kuya kwenziwa la manyathelo alandelayo:

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

Ukulandelelana kwezi zenzo kunokuhlelwa. Ukuba into esuka kuluhlu sele yenziwe, iya kutsitywa. Ubume bangoku, kunye noqwalaselo lwemizekelo, iMolecule igcina kulawulo $TMPDIR/molecule/<role>/<scenario>.

Yongeza amanyathelo nge ? ungachaza izenzo ezifunwayo kwifomati yencwadi yokudlala, kwaye wenze igama lefayile ngokwenyathelo: prepare.yml/side_effect.yml. Lindela ezi fayile I-molecule iya kuba kwifolda yescript.

umqhubi

Umqhubi liqumrhu apho iimeko zovavanyo zenziwe.
Uluhlu lwabaqhubi abasemgangathweni apho i-Molecule ineetemplates ezilungeleyo ngolu hlobo lulandelayo: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Kwiimeko ezininzi, iitemplates ziifayile create.yml и destroy.yml kwisiqulathi seefayili esichaza ukuyilwa kunye nokucinywa komzekelo, ngokulandelelanayo.
Okungaphandle yiDocker kunye neVagrant, njengoko unxibelelwano kunye neemodyuli zabo zinokwenzeka ngaphandle kweefayile ezikhankanywe ngasentla.

Kuyafaneleka ukugqamisa umqhubi oThunyiweyo, ekubeni ukuba isetyenziswe kwiifayile zokudala kunye nokucima umzekelo, umsebenzi kuphela kunye noqwalaselo lweemeko ezichazwe, ezinye kufuneka zichazwe yinjineli.

Umqhubi omiselweyo yiDocker.

Ngoku masiqhubele phambili siziqhelanise kwaye siqwalasele ezinye iinkalo apho.

Qalisa

Njengelizwe "Molo", masivavanye indima elula yokufaka i-nginx. Masikhethe idocker njengomqhubi-ndicinga ukuba uninzi lwakho luyifakile (kwaye khumbula ukuba idocker ngumqhubi ongagqibekanga).

Masilungiselele virtualenv kwaye ufake kuyo molecule:

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

Inyathelo elilandelayo kukuqalisa indima entsha.
Ukuqaliswa kwendima entsha, kunye neskripthi esitsha, kwenziwa ngokusebenzisa umyalelo 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

Kwaba yindima eqhelekileyo. Ngapha koko, lonke unxibelelwano kunye neeMolekyu ze-CLI zenziwa kwingcambu yendima.

Makhe sibone ukuba yintoni ekuluhlu lwendima:

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

1 directory, 6 files

Makhe sihlalutye i-config molecule/default/molecule.yml (buyisela umfanekiso wedokhi kuphela):

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

ukuxhomekeka

Eli candelo lichaza imvelaphi yokuxhomekeka.

Ukukhetha okunokwenzeka: Galaxy, isilwanyana, iqokobhe.

I-Shell liqokobhe lomyalelo elisetyenziswa kwimeko ye-galaxy kunye ne-gilt ayiquki iimfuno zakho.

Andizukuhlala apha ixesha elide, kwanele ngoku kuchazwe kuyo amaxwebhu.

umqhubi

Igama lomqhubi. Owethu yidocker.

ilint

I-linter yi-yamllint.

Iinketho eziluncedo kule ndawo yoqwalaselo kukukwazi ukukhankanya ifayile yoqwalaselo yeyamllint, eyaphambili iimeko-bume eziguquguqukayo, okanye khubaza i-linter:

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

Maqonga

Ichaza ubumbeko lwemizekelo.
Kwimeko yedocker njengomqhubi, iMolekyuli iphinda-phindwe ngaphezulu kweli candelo, kwaye into nganye yoluhlu iyafumaneka kwi. Dockerfile.j2 njengento eguquguqukayo item.

Kwimeko yomqhubi ofuna create.yml и destroy.yml, icandelo liyafumaneka kuzo njenge molecule_yml.platforms, kwaye uphindaphindo phezu kwayo sele ichaziwe kwezi fayile.

Kuba iMolekyuli ibonelela ngolawulo lwemizekelo kwiimodyuli ezifanelekileyo, uluhlu lwezicwangciso ezinokwenzeka kufuneka zikhangelwe apho. Kwi-docker, umzekelo, imodyuli iyasetyenziswa docker_container_modyuli. Zeziphi iimodyuli ezisetyenziswa kwabanye abaqhubi ezinokufumaneka amaxwebhu.

Kwakunye nemizekelo yokusetyenziswa kwabaqhubi abahlukeneyo inokufumaneka kwiimvavanyo zeMolekyuli ngokwayo.

Faka enye indawo apha isenti:7 phezu ubun-.

umboneleli

"Umthengisi" - iziko elilawula iimeko. Kwimeko yeMolekyuli, oku kuyaqondakala, inkxaso yabanye ayicwangciswanga, ngoko eli candelo linokuthiwa uqwalaselo olwandisiweyo olufanelekileyo kunye ne-caveat.
Apha ungakhankanya izinto ezininzi, ndiza kugxininisa iingongoma eziphambili, ngokoluvo lwam:

  • iincwadi zokudlala: ungacacisa ukuba zeziphi iincwadi zokudlala ekufuneka zisetyenziswe kumanqanaba athile.

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

  • iinketho: Iinketho ezibambekayo kunye nezinto eziguquguqukayo zokusingqongileyo

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

zihambe

Igama kunye nenkcazo yolandelelwano lwescript.
Ungatshintsha i-matrix yesenzo esingagqibekanga sawo nawuphi na umyalelo ngokudibanisa isitshixo <command>_sequence kwaye njengexabiso layo ngokuchaza uluhlu lwamanyathelo esiwafunayo.
Masithi sifuna ukutshintsha ulandelelwano lwezenzo xa usebenzisa incwadi yokudlala sebenzisa umyalelo: molecule converge

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

isiqinisekisi

Ukumisela isakhelo sovavanyo kunye ne-linter kuyo. I-linter ehlala ikho yi testinfra и flake8. Iinketho ezinokwenzeka ziyafana nezingasentla:

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

Masibuyele kwindima yethu. Masihlele ifayile tasks/main.yml kolu hlobo:

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

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

Kwaye ungeze iimvavanyo 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")

Kwenziwe, kushiyeke kuphela ukubaleka (ukusuka kwingcambu yendima, mandikukhumbuze):

> molecule test

Ukukhupha ixesha elide phantsi kwe-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

Indima yethu elula yavavanywa ngaphandle kweengxaki.
Kufanelekile ukukhumbula ukuba kukho iingxaki ngexesha lomsebenzi molecule test, ke ukuba awutshintshanga ulandelelwano olungagqibekanga, iMolekyuli iya kuwucima umzekelo.

Le miyalelo ilandelayo iluncedo ukulungisa ingxaki:

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

Indima ekhoyo

Ukongeza iskripthi esitsha kwindima ekhoyo kuluhlu lwendima ngale miyalelo ilandelayo:

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

Kwimeko apho le yimeko yokuqala kwindima, emva koko iparameter -s ingashiywa njengoko izakudala umbhalo default.

isiphelo

Njengoko ubona, iMolekhyule ayintsonkothanga kakhulu, kwaye ngokusebenzisa iitemplates zakho, ukuhambisa iskripthi esitsha kunokuncitshiswa kuhlengahlengiso lokuhlela kwimeko yokudala kunye nokucima iincwadi zokudlala. Imolekyuli idibanisa ngaphandle komthungo kunye neenkqubo zeCI, ekuvumela ukuba unyuse isantya sophuhliso ngokunciphisa ixesha lokuvavanya iincwadi zokudlala ngesandla.

Enkosi ngosinaka kwakho. Ukuba unamava ekuvavanyeni iindima ezifanelekileyo, kwaye ayihambelani neMolekyuli, sixelele ngayo kwizimvo!

umthombo: www.habr.com

Yongeza izimvo