Talîmat: Meriv çawa rolên berbiçav biceribîne û li ser pirsgirêkan berî hilberînê fêr bibe

Hemûyan re merheba!

Ez wekî endezyarek DevOps di karûbarek veqetandina otêlê de dixebitim. Ostrovok.ru. Di vê gotarê de, ez dixwazim li ser ezmûna me ya di ceribandina rolên berbiçav de biaxivim.

Li Ostrovok.ru, em ansible wekî rêveberê vesazkirinê bikar tînin. Di van demên dawî de, me pêdivî bi ceribandina rolan hat, lê wekî ku derket holê, ji bo vê yekê ne ewqas amûr hene - ya herî populer, dibe ku, çarçoweya Molekulê ye, ji ber vê yekê me biryar da ku em wê bikar bînin. Lê derket holê ku belgeyên wî li ser gelek xeletiyan bêdeng in. Me nikarî pirtûkek têra xwe berfireh bi rûsî bibînin, ji ber vê yekê me biryar da ku em vê gotarê binivîsin.

Talîmat: Meriv çawa rolên berbiçav biceribîne û li ser pirsgirêkan berî hilberînê fêr bibe

Molekul

Molekul - çarçoveyek ku ji bo ceribandina rolên berbiçav dibe alîkar.

Danasîna hêsan: Molekul li ser platforma ku hûn diyar dikin (ewr, makîneya virtual, konteynir; ji bo bêtir agahdarî, li beşê binêre) mînakek diafirîne Ajotvan), rola xwe li ser wê dimeşîne, dûv re ceribandinan dimeşîne û nimûneyê jê dike. Di rewşa têkçûna yek ji gavan de, Molekul dê we li ser wê agahdar bike.

Niha bêtir.

Hinek hestê

Du pêkhateyên sereke yên Molekulê binihêrin: Senaryo û Driver.

Serdestiyê

Di senaryoyê de ravekirinek heye ku dê çi, li ku, çawa û bi çi rêzê were çêkirin. Yek rol dikare çend skrîptan hebin, û her yek pelrêçek li ser rê ye <role>/molecule/<scenario>, ku ravekirina kiryarên ku ji bo ceribandinê hewce ne dihewîne. Skrîpt divê tê de hebe default, ya ku dê bixweber were afirandin heke hûn rola bi Molekulek dest pê bikin. Navên nivîsarên jêrîn li ser we ne.

Rêzeya çalakiyên ceribandinê di skrîptekê de tê gotin matrix, û bi xwerû ew e:

(Gavên binavkirî ?, heke ji hêla bikarhêner ve nehatibe diyar kirin, ji hêla xwerû ve hatî avêtin)

  • lint - lîberên diherike. Bi xwerû têne bikar anîn yamllint и flake8,
  • destroy - jêbirina mînakên ji destpêkirina paşîn a Molekulê (heke hebe),
  • dependency? - sazkirina girêdana berbiçav a rola ceribandin,
  • syntax - kontrolkirina hevoksaziya rola ku bikar tîne ansible-playbook --syntax-check,
  • create - afirandina mînakek,
  • prepare? - amadekirina nimûne; Mînak python2 kontrol bike/saz bike
  • converge - destpêkirina pirtûka lîstikê ya ku tê ceribandin,
  • idempotence - ji nû ve destpêkirina lîstikê ji bo ceribandina bêhêziyê,
  • side_effect? - kiryarên ku rasterast bi rolê ve ne girêdayî ne, lê ji bo ceribandinan hewce ne,
  • verify - ceribandinên veavakirina encam bi kar tînin testinfra(pêşbirk) /goss/inspec,
  • cleanup? - (di guhertoyên nû de) - bi gelemperî, "paqijkirina" binesaziya derveyî ya ku ji Molekulê bandor bûye,
  • destroy - Jêbirina mînakek.

Ev rêzik piraniya bûyeran vedihewîne, lê ger hewce be dikare were guheztin.

Her yek ji gavên jorîn dikare bi hev ve were meşandin molecule <command>. Lê divê were fêm kirin ku ji bo her klîk-fermanek wusa dibe ku rêza çalakiya xwe hebe, ku hûn dikarin bi darvekirinê fêr bibin. molecule matrix <command>. Mînakî, dema ku fermanê dimeşîne converge (di bin ceribandinê de pirtûka lîstikê dimeşîne), dê kiryarên jêrîn bêne kirin:

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

Rêzeya van çalakiyan dikare were sererast kirin. Ger tiştek ji navnîşê jixwe hatî kirin, ew ê were paşguh kirin. Rewşa heyî, û her weha konfigurasyona mînakan, Molekul di pelrêçê de hilîne $TMPDIR/molecule/<role>/<scenario>.

Pêngavên bi ? hûn dikarin, bi danasîna kiryarên xwestî yên di forma ansible-playbook de, û navê pelê li gorî gavê çêbikin: prepare.yml/side_effect.yml. Ji van pelan hêvî bikin Molekul dê di peldanka skrîptê de be.

Ajotvan

Ajokar saziyek e ku mînakên ceribandinê lê têne çêkirin.
Navnîşa ajokarên standard ên ku Molecule şablonên wan amade ne wiha ye: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Di pir rewşan de, şablon pelan in create.yml и destroy.yml di peldanka skrîptê de ku bi rêzê ve çêkirin û jêbirina nimûneyekê vedibêje.
Vebijêrk Docker û Vagrant ne, ji ber ku têkiliyên bi modulên wan re bêyî pelên jorîn dikarin çêbibin.

Hêjayî balkişandina ajokera Delegated e, ji ber ku heke ew di pelan de ji bo çêkirin û jêbirina mînakek were bikar anîn, tenê xebata bi veavakirina mînakan re tête diyar kirin, ya mayî divê ji hêla endezyar ve were vegotin.

Ajokarê xwerû Docker e.

Naha em biçin pratîkê û li wir taybetmendiyên din binirxînin.

Destpêkirin

Wekî "cîhanek silav", werin em rola sazkirina nginx a hêsan ceribandin. Werin em docker wekî ajoker hilbijêrin - Ez difikirim ku piraniya we ew saz kiriye (û ji bîr mekin ku docker ajokera xwerû ye).

Amade kirin virtualenv û tê de saz bikin molecule:

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

Pêngava din destpêkirina rola nû ye.
Destpêkirina rolek nû, û her weha skrîptek nû, bi karanîna fermanê tête kirin 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

Ev derkete holê ku rolek-anserî ya tîpîk. Zêdetir, hemî danûstendinên bi Molekulên CLI re ji koka rolê têne çêkirin.

Ka em bibînin ka di pelrêça rolê de çi ye:

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

1 directory, 6 files

Ka em konfigurasyonê analîz bikin molecule/default/molecule.yml (tenê wêneya dockerê biguhezîne):

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

girêdayî

Ev beş çavkaniya girêdanan diyar dike.

Vebijarkên gengaz: Galaxy, gilover kirin, şêl.

Shell tenê şêlek fermanî ye ku di doza ku galaxy û gilt hewcedariyên we nagirin tê bikar anîn.

Ez ê demek dirêj li vir nemînim, têra xwe tê vegotin belgekirin.

ajotvan

Navê ajovan. Ya me doker e.

zibil

Linter yamllint e.

Vebijarkên bikêr ên di vê beşa mîhengê de ev e ku meriv pelek vesazkirinê ji bo yamllint, guhêrbarên hawîrdorê pêşde were destnîşan kirin, an lînter neçalak bike:

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

platforman

Veavakirina mînakan vedibêje.
Di doza dockerê de wekî ajokar, Molekul li ser vê beşê tê dubare kirin, û her hêmanek navnîşê di nav de heye. Dockerfile.j2 wek guherbar item.

Di doza ajokerek ku hewce dike create.yml и destroy.yml, beş di wan de heye wek molecule_yml.platforms, û dubarekirinên li ser wê jixwe di van pelan de hatine diyar kirin.

Ji ber ku Molekul kontrolkirina nimûneyan ji modulên bêkêmasî re peyda dike, divê navnîşa mîhengên gengaz jî li wir were dîtin. Mînakî, ji bo docker, modul tê bikar anîn docker_container_module. Kîjan modul di ajokarên din de têne bikar anîn dikarin tê de werin dîtin belgekirin.

Her weha mînakên karanîna ajokarên cihêreng têne dîtin di testên Molekulê bixwe de.

Li vir veguherînin centos:7 li ser ubuntu.

dabînker

"Supplier" - saziyek ku mînakan birêve dibe. Di doza Molecule de, ev yek guncan e, piştgirî ji bo yên din nayê plansaz kirin, ji ber vê yekê ev beş dikare bi hişyariyek veavakirina dirêjkirî ya ansible were gotin.
Li vir hûn dikarin gelek tiştan diyar bikin, ez ê xalên sereke, bi dîtina min, destnîşan bikim:

  • pirtûkên lîstikê: hûn dikarin diyar bikin ka kîjan pirtûkên lîstikê divê di hin qonaxan de werin bikar anîn.

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

  • Vebijarkên: Vebijêrk û guhêrbarên hawirdorê yên berbiçav

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

senaryoya

Nav û şiroveya rêzikên nivîsê.
Hûn dikarin bi lê zêdekirina mifteyê matrixa çalakiya xwerû ya her fermanê biguhezînin <command>_sequence û wekî nirxek ji bo wê bi destnîşankirina navnîşa gavên ku em hewce ne.
Ka em bibêjin ku em dixwazin rêza çalakiyan biguhezînin dema ku emrê runbook-ê dimeşînin: molecule converge

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

kontrol

Sazkirina çarçoveyek ji bo ceribandinan û linterek jê re. Lintera xwerû ye testinfra и flake8. Vebijarkên mimkun wekî li jor in:

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

Werin em vegerin ser rola xwe. Ka em pelê biguherînin tasks/main.yml bi vî rengî:

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

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

Û testan lê zêde bike 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")

Kir, ew tenê dimîne (ji koka rolê, bila ez ji we re bi bîr bînim):

> molecule test

Exoza dirêj di bin spoilerê de:

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

Rola meya hêsan bê pirsgirêk hat ceribandin.
Hêjayî bîrxistinê ye ku heke di dema xebatê de pirsgirêk hebin molecule test, wê hingê heke we rêzika xwerû neguherand, Molekul dê mînakê jê bibe.

Fermanên jêrîn ji bo xeletkirinê bikêr in:

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

Rola heyî

Zêdekirina skrîpteke nû li roleke heyî ye ji pelrêça rola bi fermanên jêrîn:

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

Di rewşê de ku ev senaryoya yekem di rolê de ye, paşê parametre -s dikare were derxistin ji ber ku ew ê skrîptek çêbike default.

encamê

Wekî ku hûn dibînin, Molecule ne pir tevlihev e, û bi karanîna şablonên xwe ve, danîna skrîptek nû dikare bi guherbarên di pirtûkên lîstikên afirandin û jêbirina nimûneyê de were kêm kirin. Molekul bi pergalên CI-ê re yekgirtî tevdigere, ku dihêle hûn leza pêşkeftinê zêde bikin bi kêmkirina dema ceribandina destan a pirtûkên lîstikê.

Spas ji bo baldariya we. Ger ezmûna we di ceribandina rolên bêkêmasî de heye, û ew ne girêdayî Molekulê ye, di şîroveyan de ji me re bêje!

Source: www.habr.com

Add a comment