Mirayiridzo: maitiro ekuedza mabasa anonzwisisika uye nekuziva nezvematambudziko asati agadzirwa

Hello vose!

Ini ndinoshanda sainjiniya weDevOps mubasa rekubhuka hotera. Ostrovok.ru. Muchikamu chino, ndinoda kutaura nezve ruzivo rwedu mukuyedza mabasa anonzwisisika.

PaOstrovok.ru, tinoshandisa ansible semaneja wekugadzirisa. Munguva ichangopfuura, takasvika pakudiwa kwekuedza mabasa, asi sezvazvakazoitika, hapana maturusi akawanda eizvi - inonyanya kufarirwa, zvichida, ndiyo Molecule framework, saka takasarudza kuishandisa. Asi zvakazoitika kuti zvinyorwa zvake hazvina kunyarara nezvematambudziko mazhinji. Hatina kuwana bhuku rakakwana rakakwana muRussia, saka takasarudza kunyora chinyorwa ichi.

Mirayiridzo: maitiro ekuedza mabasa anonzwisisika uye nekuziva nezvematambudziko asati agadzirwa

molecule

Molecule - hurongwa hwekubatsira kuyedza mabasa anonzwisisika.

Tsanangudzo yakapfava: Iyo molecule inogadzira muenzaniso pachikuva chaunotsanangura (gore, virtual muchina, mudziyo; kuti uwane rumwe ruzivo, ona chikamu mutyairi), inoita basa rako pairi, wobva wamhanyisa bvunzo uye unodzima muenzaniso. Kana ukatadza pane imwe yematanho, iyo Molecule inokuzivisa iwe nezvazvo.

Zvino zvakawanda.

Chimwe chezvinyorwa

Funga nezvezvinhu zviviri zvakakosha zveMolecule: Scenario uye Driver.

Mamiriro ezvinhu

Chinyorwa chine tsananguro yekuti chii, kupi, sei uye munhevedzano ipi ichaitwa. Basa rimwe rinogona kuva nezvinyorwa zvakawanda, uye imwe neimwe idhairekitori munzira <role>/molecule/<scenario>, iyo ine tsananguro dzezviito zvinodiwa pakuedzwa. Script inofanira kuiswa default, iyo inozogadzirwa otomatiki kana iwe ukatanga basa neMolecule. Mazita ezvinyorwa zvinotevera zviri kwauri.

Kutevedzana kwezviito zvekuyedza mune script kunonzi matrix, uye nekusarudzika ndizvo:

(Matanho akanyorwa ?, yakarukwa nekukasira kana isina kutaurwa nemushandisi)

  • lint - kumhanya linters. By default anoshandiswa yamllint и flake8,
  • destroy - kudzima zviitiko kubva pakuvhurwa kwekupedzisira kweMolecule (kana iripo),
  • dependency? - kuisirwa kweanogoneka kutsamira kwebasa rakaedzwa,
  • syntax - kutarisa syntax yebasa uchishandisa ansible-playbook --syntax-check,
  • create - kugadzira muenzaniso,
  • prepare? - kugadzirira chiitiko; semuenzaniso cheki/kuisa python2
  • converge - kutangwa kwebhuku rekutamba riri kuedzwa,
  • idempotence - kutangazve bhuku rekutamba rekuyedza idempotency,
  • side_effect? - zviito zvisingaenderane zvakananga nebasa, asi zvakakosha kune bvunzo,
  • verify -kumhanyisa bvunzo dzezvakagadziriswa kumisikidzwa uchishandisa testinfra(default) /goss/inspec,
  • cleanup? - (mune shanduro itsva) - kutaura, "kuchenesa" zvivakwa zvekunze zvakakanganiswa neMolecule,
  • destroy - Kudzima muenzaniso.

Kutevedzana uku kunobata zviitiko zvakawanda, asi kunogona kuchinjwa kana zvichidikanwa.

Imwe neimwe yematanho ari pamusoro inogona kumhanya yakaparadzana nayo molecule <command>. Asi zvinofanirwa kunzwisiswa kuti kune yega yega cli-command panogona kunge paine kutevedzana kwayo kwezviito, izvo zvaunogona kuziva nekuita. molecule matrix <command>. Semuenzaniso, paunenge uchimhanyisa kuraira converge (kumhanyisa bhuku rekutamba pasi pekuyedzwa), zvinotevera zviito zvichaitwa:

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

Kutevedzana kwezviito izvi kunogona kugadziriswa. Kana chimwe chinhu kubva pakurongwa chatoitwa, chinodarika. Iyo yazvino mamiriro, pamwe neiyo config yezviitiko, iyo Molecule inochengeta mudhairekitori $TMPDIR/molecule/<role>/<scenario>.

Wedzera matanho ne ? iwe unogona kutsanangura zviito zvaunoda mune ansible-playbook fomati, uye gadzira zita refaira zvinoenderana nedanho: prepare.yml/side_effect.yml. Tarisira aya mafaera Iyo morekuru ichange iri mugwaro folda.

mutyairi

Mutyairi inhengo inogadzirwa bvunzo zviitiko.
Rondedzero yemadhiraivha akajairwa ayo Molecule ane matemplate akagadzirira ndeaya: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Muzviitiko zvakawanda, ma templates mafaira create.yml и destroy.yml mune script folda inotsanangura kusikwa uye kudzima kwechiitiko, zvichiteerana.
Izvo zvinosiya Docker uye Vagrant, sekudyidzana nemamodule avo kunogona kuitika pasina mafaera ambotaurwa.

Zvakakodzera kujekesa Mutyairi Akatumirwa, sezvo kana ikashandiswa mumafaira ekugadzira nekudzima chiitiko, shanda chete nekugadziriswa kwezviitiko zvinotsanangurwa, zvimwe zvose zvinofanira kutsanangurwa nejinjiniya.

Mutyairi wakasarudzika ndiDocker.

Zvino ngatienderere mberi tichidzidzira uye tifunge nezve mamwe maitiro ipapo.

kutanga

Se "mhoro nyika", ngatiedzei iri nyore yekuisa nginx basa. Ngatisarudzei docker semutyairi - ndinofunga vazhinji venyu vakaiisa (uye rangarirai kuti docker ndiye anodhiraivha).

Ngatigadzirirei virtualenv uye isa mariri molecule:

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

Nhanho inotevera ndeyekutanga basa idzva.
Kutanga kwebasa idzva, pamwe nerunyoro rutsva, rinoitwa uchishandisa murairo 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

Zvakava zvakajairika ansible-basa. Kupfuurirazve, kudyidzana kwese neCLI Molecules inogadzirwa kubva pamudzi webasa.

Ngationei zviri mugwaro rebasa:

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

1 directory, 6 files

Ngationgororei config molecule/default/molecule.yml (chinja chete docker mufananidzo):

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

kutsamira

Ichi chikamu chinotsanangura kunobva kutsamira.

Zvimwe zvingasarudzwa: renyeredzi, chakagadzirwa, goko.

Shell ingori goko rekuraira rinoshandiswa kana galaxy uye gilt isingavhare zvaunoda.

Ini handisi kuzogara pano kwenguva yakareba, zvakakwana zvinotsanangurwa mukati zvinyorwa.

mutyairi

Zita remutyairi. Yedu ndeye docker.

rika

Iyo linter ndeye yamllint.

Sarudzo dzinobatsira muchikamu chino chegadziriso kugona kutsanangura faira yekumisikidza yeyamllint, kumberi nharaunda zvinosiyana, kana kudzima linter:

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

Mapuratifomu

Inotsanangura magadzirirwo ezviitiko.
Kana iri docker semutyairi, iyo Molecule inodzokororwa pamusoro pechikamu ichi, uye chimwe nechimwe chinhu cherondedzero chinowanikwa mukati. Dockerfile.j2 as a variable item.

Panyaya yemutyairi zvinoda create.yml и destroy.yml, chikamu chinowanikwa mavari se molecule_yml.platforms, uye kudzokororwa pamusoro payo kwakatotsanangurwa mumafaira aya.

Sezvo iyo Molecule inopa kutonga kwezviitiko kune ansible modules, rondedzero yezvinogoneka marongero inofanirawo kutsvakwa ipapo. Kune docker, semuenzaniso, iyo module inoshandiswa docker_container_module. Ndeapi mamodule anoshandiswa mune mamwe madhiraivha anogona kuwanikwa mukati zvinyorwa.

Uyewo mienzaniso yekushandiswa kwevatyairi vakasiyana-siyana inogona kuwanikwa mumiedzo yeMorecule pachayo.

Tsiva pano masendi:7 pamusoro ubuntu.

provider

"Supplier" - sangano rinotarisira zviitiko. Panyaya yeMolecule, izvi zvinonzwisisika, kutsigirwa kwevamwe hakuna kurongwa, saka chikamu ichi chinogona kunzi ansible yakawedzerwa kurongeka ne caveat.
Pano iwe unogona kutsanangura zvinhu zvakawanda, ini ndichasimbisa pfungwa huru, mumaonero angu:

  • mabhuku ekutamba: unogona kutsanangura kuti ndeapi mabhuku ekutamba anofanirwa kushandiswa pane mamwe matanho.

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

  • connection_options: zvingasarudzwa kubatana

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

  • mikana: Ansible sarudzo uye nharaunda siyana

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

mamiriro ezvinhu

Zita uye tsananguro yezvinyorwa zvakatevedzana.
Iwe unogona kushandura iyo yekusarudzika chiito matrix yechero rairo nekuwedzera kiyi <command>_sequence uye sekukosha kwayo nekutsanangura rondedzero yematanho atinoda.
Ngatitii tinoda kushandura kutevedzana kwezviito kana uchimhanyisa playbook run command: molecule converge

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

cheki

Kugadzira chimiro chebvunzo uye linter kwairi. Iyo default linter ndeye testinfra и flake8. Sarudzo dzinogoneka dzakafanana nepamusoro:

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

Ngatidzokere pabasa redu. Ngatigadzirise faira tasks/main.yml kune rudzi urwu:

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

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

Uye wedzera bvunzo kune 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")

Zvaitwa, zvinongoramba zvichimhanya (kubva pamudzi webasa, rega ndikuyeuchidze):

> molecule test

Kupera kwenguva refu pasi pe 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

Basa redu riri nyore rakaedzwa pasina matambudziko.
Zvakakosha kuyeuka kuti kana pane matambudziko panguva yebasa molecule test, saka kana usina kushandura kutevedzana kwacho, iyo Molecule inodzima muenzaniso.

Iyi mirairo inotevera inobatsira pakugadzirisa:

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

Basa Riripo

Kuwedzera script nyowani kune iripo basa ndiko kubva mudhairekitori rebasa nemirairo inotevera:

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

Kana ichi ndicho chiitiko chekutanga mubasa, ipapo parameter -s inogona kusiiwa sezvo ichagadzira script default.

mhedziso

Sezvauri kuona, iyo Molecule haina kuomesesa, uye nekushandisa yako wega matemplate, kuendesa script nyowani kunogona kuderedzwa kusvika pakugadzirisa zvinosiyana mumuenzaniso wekugadzira uye kudzima mabhuku ekutamba. Iyo morekuru inosanganiswa isina musono neCI masisitimu, iyo inokutendera iwe kuti uwedzere kukurumidza kwekusimudzira nekudzikisa nguva yekuongororwa kwemanyorero emabhuku ekutamba.

Ndinokutendai nekuteerera kwenyu. Kana iwe uine ruzivo mukuyedza mabasa anonzwisisika, uye asina hukama neMolecule, tiudze nezvazvo mune zvakataurwa!

Source: www.habr.com

Voeg