Stiùireadh: mar a nì thu deuchainn air dreuchdan iomchaidh agus faighinn a-mach mu dhuilgheadasan mus tèid a thoirt gu buil

Hello a h-uile duine!

Tha mi ag obair mar innleadair DevOps ann an seirbheis glèidhidh taigh-òsta. Ostrovok.ru. San artaigil seo, tha mi airson bruidhinn mun eòlas againn ann a bhith a’ dèanamh deuchainn air dreuchdan iomchaidh.

Aig Ostrovok.ru, bidh sinn a’ cleachdadh ansible mar mhanaidsear rèiteachaidh. O chionn ghoirid, thàinig sinn chun an fheum air dreuchdan deuchainn, ach mar a thionndaidh e a-mach, chan eil uimhir de dh ’innealan ann airson seo - am fear as mòr-chòrdte, is dòcha, is e am frèam Molecule, agus mar sin chuir sinn romhainn a chleachdadh. Ach thionndaidh e a-mach gu bheil na sgrìobhainnean aige sàmhach mu iomadh duilgheadas. Cha b 'urrainn dhuinn leabhar-làimhe mionaideach gu leòr a lorg ann an Ruiseanach, agus mar sin chuir sinn romhainn an artaigil seo a sgrìobhadh.

Stiùireadh: mar a nì thu deuchainn air dreuchdan iomchaidh agus faighinn a-mach mu dhuilgheadasan mus tèid a thoirt gu buil

Moileciuil

Molecule - frèam gus cuideachadh le bhith a’ dèanamh deuchainn air dreuchdan ciallach.

Tuairisgeul nas sìmplidhe: Bidh am moileciuil a’ cruthachadh eisimpleir air an àrd-ùrlar a shònraich thu (sgòth, inneal mas-fhìor, soitheach; airson tuilleadh fiosrachaidh, faic an earrann Driver), ruith do dhreuchd air, an uairsin ruith deuchainnean agus cuir às don eisimpleir. Ma dh'fhàilligeas air aon de na ceumannan, bheir am Molecul fios dhut mu dheidhinn.

A-nis barrachd.

Pàirt de theòiridh

Beachdaich air dà phrìomh bhuidheann den Molecule: Scenario agus Driver.

A ’chùis

Tha tuairisgeul anns an sgriobt air dè, càite, ciamar agus dè an t-sreath a thèid a choileanadh. Faodaidh grunn sgriobtaichean a bhith aig aon dreuchd, agus tha gach fear na eòlaire air an t-slighe <role>/molecule/<scenario>, anns a bheil tuairisgeul air na gnìomhan a dh’ fheumar airson an deuchainn. Feumaidh an sgriobt a bhith air a ghabhail a-steach default, a thèid a chruthachadh gu fèin-ghluasadach ma thòisicheas tu an dreuchd le Molecule. Tha ainmean nan sgriobtaichean a leanas an urra riut fhèin.

Canar sreath de ghnìomhan deuchainn ann an sgriobt Matrix, agus gu bunaiteach is e:

(Ceumannan air an ainmeachadh ?, air a leum gu bunaiteach mura h-eil an neach-cleachdaidh air a shònrachadh)

  • lint - a 'ruith lòchrain. Gu gnàthach gan cleachdadh yamllint и flake8,
  • destroy - cuir às do shuidheachaidhean bhon fhoillseachadh mu dheireadh den Molecule (ma tha sin ann),
  • dependency? - stàladh eisimeileachd iomchaidh an dreuchd a chaidh a dhearbhadh,
  • syntax - a 'sgrùdadh co-chòrdadh na dreuchd a' cleachdadh ansible-playbook --syntax-check,
  • create - a 'cruthachadh eisimpleir,
  • prepare? - ag ullachadh an eisimpleir; me sgrùdadh/stàlaich python2
  • converge - cur air bhog an leabhar-cluiche ga dheuchainn,
  • idempotence - ag ath-thòiseachadh an leabhar-cluiche airson an deuchainn iempotency,
  • side_effect? - gnìomhan nach eil ceangailte gu dìreach ris an dreuchd, ach a tha riatanach airson deuchainnean,
  • verify - deuchainnean ruith den rèiteachadh a thàinig às a sin a’ cleachdadh testinfra(àbhaisteach) /goss/inspec,
  • cleanup? - (ann an dreachan ùra) - gu ìre mhòr, “glanadh” a’ bhun-structair a-muigh air an tug am Molecule buaidh,
  • destroy - Sguab às eisimpleir.

Tha an sreath seo a’ còmhdach a’ mhòr-chuid de chùisean, ach faodar atharrachadh ma tha sin riatanach.

Faodar gach aon de na ceumannan gu h-àrd a ruith air leth le molecule <command>. Ach bu chòir a thuigsinn gum faodadh sreath ghnìomhan fhèin a bhith ann airson gach àithne mar sin, a gheibh thu a-mach le bhith a’ cur an gnìomh molecule matrix <command>. Mar eisimpleir, nuair a ruith an àithne converge (a’ ruith an leabhar-cluiche fo dheuchainn), thèid na gnìomhan a leanas a choileanadh:

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

Faodar sreath nan gnìomhan sin a dheasachadh. Ma tha rudeigin bhon liosta air a dhèanamh mu thràth, thèid a leigeil seachad. An staid làithreach, a bharrachd air rèiteachadh nan suidheachaidhean, bidh am Molecule a’ stòradh san eòlaire $TMPDIR/molecule/<role>/<scenario>.

Cuir ceumannan le ? faodaidh tu cunntas a thoirt air na gnìomhan a tha thu ag iarraidh ann an cruth leabhar-cluiche iomchaidh, agus ainm an fhaidhle a dhèanamh a rèir a’ cheum: prepare.yml/side_effect.yml. An dùil na faidhlichean seo Bidh am moileciuil sa phasgan sgriobt.

Driver

Is e eintiteas a th’ ann an draibhear far a bheilear a’ cruthachadh eisimpleirean deuchainn.
Tha an liosta de dhraibhearan àbhaisteach aig a bheil teamplaidean deiseil aig Molecule mar a leanas: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Tiomnaichte.

Anns a 'mhòr-chuid de chùisean, tha teamplaidean nam faidhlichean create.yml и destroy.yml sa phasgan sgriobt a bheir cunntas air cruthachadh agus cuir às do eisimpleir, fa leth.
Is e na h-eisgeadan Docker and Vagrant, oir faodaidh eadar-obrachadh leis na modalan aca tachairt às aonais na faidhlichean a chaidh ainmeachadh.

Is fhiach cuideam a chuir air an draibhear tiomnaichte, oir ma thèid a chleachdadh anns na faidhlichean airson eisimpleir a chruthachadh agus a dhubhadh às, chan eil ach obrachadh le rèiteachadh nan suidheachaidhean air a mhìneachadh, bu chòir don innleadair an còrr a mhìneachadh.

Is e Docker an draibhear bunaiteach.

A-nis gluaisidh sinn air adhart gu bhith a 'cleachdadh agus a' beachdachadh air feartan eile an sin.

Getting Started

Mar “saoghal hello”, leig dhuinn deuchainn a dhèanamh air àite stàlaidh nginx sìmplidh. Taghaidh sinn docker mar an draibhear - tha mi a ’smaoineachadh gu bheil a’ mhòr-chuid agaibh air a chuir a-steach (agus cuimhnich gur e docker an draibhear bunaiteach).

Dèanamaid ullachadh virtualenv agus stàlaich e ann molecule:

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

Is e an ath cheum an dreuchd ùr a thòiseachadh.
Bithear a’ tòiseachadh dreuchd ùr, a bharrachd air sgriobt ùr, a’ cleachdadh an àithne 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

Thionndaidh e a-mach dreuchd àbhaisteach neo-chomasach. A bharrachd air an sin, tha a h-uile eadar-obrachadh le CLI Molecules air a dhèanamh bho bhunait na dreuchd.

Chì sinn dè a tha anns an eòlaire dreuchd:

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

1 directory, 6 files

Nì sinn mion-sgrùdadh air an config molecule/default/molecule.yml (cuir an àite dìreach dealbh 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

eisimeileachd

Tha an earrann seo a’ toirt cunntas air tùs nan eisimeileachd.

Roghainnean a dh'fhaodadh a bhith ann: galaxy, buntainn, slige.

Is e dìreach slige àithne a th’ ann an Shell a thathas a’ cleachdadh air eagal ‘s nach bi galaxy agus gilt a’ còmhdach na feumalachdan agad.

Cha bhith mi a’ fuireach an seo airson ùine mhòr, tha e gu leòr air a mhìneachadh ann an sgrìobhainnean.

dràibhear

Ainm an driver. 'S e docker a th' annainn.

lìon

Tha yamllint air an lionn.

Is e roghainnean feumail anns a’ phàirt seo den config an comas faidhle rèiteachaidh a shònrachadh airson yamllint, caochladairean àrainneachd air adhart, no an loidhne-lìn a dhì-cheadachadh:

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

àrd-ùrlair

A 'toirt cunntas air suidheachadh nan suidheachaidhean.
A thaobh docker mar dhràibhear, tha am Moilecule air aithris thairis air an roinn seo, agus tha gach eileamaid den liosta ri fhaighinn ann an Dockerfile.j2 mar chaochladair item.

Ann an cùis dràibhear a tha a dhìth create.yml и destroy.yml, tha an earrann ri fhaotainn annta mar molecule_yml.platforms, agus tha aithrisean thairis air air a mhìneachadh anns na faidhlichean seo mu thràth.

Leis gu bheil am Moilecule a’ toirt smachd air cùisean do mhodalan iomchaidh, bu chòir coimhead air an liosta de shuidheachaidhean a dh’ fhaodadh a bhith ann an sin cuideachd. Airson docker, mar eisimpleir, tha am modal air a chleachdadh docker_container_module. Gheibhear na modalan a thathas a’ cleachdadh ann an draibhearan eile ann sgrìobhainnean.

A bharrachd air eisimpleirean de chleachdadh diofar dhraibhearan a gheibhear ann an deuchainnean a' Mhoileciuil fein.

Cuir na àite an seo ceud: 7 air Ubuntu.

neach-solair

"Solaraiche" - buidheann a bhios a 'stiùireadh shuidheachaidhean. A thaobh Molecule, tha seo cunntachail, chan eil taic do dhaoine eile air a phlanadh, agus mar sin faodar an roinn seo ainmeachadh mar rèiteachadh leudaichte neo-chomasach le caveat.
An seo faodaidh tu tòrr rudan a shònrachadh, comharraichidh mi na prìomh phuingean, nam bheachd-sa:

  • leabhraichean-cluiche: faodaidh tu sònrachadh dè na leabhraichean cluiche a bu chòir a chleachdadh aig ìrean sònraichte.

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

  • roghainnean: Roghainnean iomchaidh agus caochladairean àrainneachd

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

suidheachadh

Ainm agus tuairisgeul sreath sgriobtaichean.
Faodaidh tu matrix gnìomh bunaiteach àithne sam bith atharrachadh le bhith a’ cur an iuchair ris <command>_sequence agus mar luach air a shon le bhith a’ mìneachadh liosta nan ceumannan a dh’ fheumas sinn.
Canaidh sinn gu bheil sinn airson sreath nan gnìomhan atharrachadh nuair a bhios sinn a’ ruith an àithne ruith leabhar-cluiche: molecule converge

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

sùil

Stèidhich frèam airson deuchainnean agus loidhne ris. Tha an loidhne àbhaisteach testinfra и flake8. Tha na roghainnean a dh'fhaodadh a bhith mar an ceudna mar a tha gu h-àrd:

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

Tillidh sinn chun na dreuchd againn. Deasaich sinn am faidhle tasks/main.yml dhan t-seòrsa seo:

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

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

Agus cuir deuchainnean ris 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")

Air a dhèanamh, chan eil air fhàgail ach airson ruith (bho fhreumh na dreuchd, leig dhomh do chuimhneachadh):

> molecule test

Teasachadh fada fon 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

Chaidh ar dleastanas sìmplidh a dhearbhadh gun duilgheadasan.
Is fhiach cuimhneachadh ma tha duilgheadasan ann rè an obair molecule test, an uairsin mura do dh'atharraich thu an t-sreath bunaiteach, sguabaidh am Molecul às an eisimpleir.

Tha na h-òrdughan a leanas feumail airson debugging:

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

Dreuchd a tha ann mar-thà

Tha e a’ cur sgriobt ùr ri dreuchd a tha ann mu thràth bhon eòlaire dreuchd leis na h-òrdughan a leanas:

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

Mas e seo a’ chiad suidheachadh san dreuchd, an uairsin am paramadair -s faodar a fàgail air falbh oir cruthaichidh e sgriobt default.

co-dhùnadh

Mar a chì thu, chan eil am Molecule gu math toinnte, agus le bhith a’ cleachdadh na teamplaidean agad fhèin, faodar cleachdadh sgriobt ùr a lughdachadh gu bhith a’ deasachadh caochladairean ann an cruthachadh agus cuir às do leabhraichean cluiche. Bidh am moileciuil a’ fighe a-steach gu sgiobalta le siostaman CI, a leigeas leat astar an leasachaidh àrdachadh le bhith a’ lughdachadh na h-ùine airson deuchainn làimhe air leabhraichean-cluiche.

Tapadh leibh airson an aire agad. Ma tha eòlas agad ann a bhith a’ dèanamh deuchainn air dreuchdan iomchaidh, agus nach eil e co-cheangailte ris a’ Mhoilecule, innis dhuinn mu dheidhinn anns na beachdan!

Source: www.habr.com

Cuir beachd ann