Hemûyan re merheba!
Ez wekî endezyarek DevOps di karûbarek veqetandina otêlê de dixebitim. . 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.

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 ), 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înyamllintи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îneansible-playbook --syntax-check,create- afirandina mînakek,prepare? - amadekirina nimûne; Mînak python2 kontrol bike/saz bikeconverge- 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înintestinfra(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 fileEv 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 filesKa 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: flake8girêdayî
Ev beş çavkaniya girêdanan diyar dike.
Vebijarkên gengaz: , , şê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 .
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: Falseplatforman
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 . Kîjan modul di ajokarên din de têne bikar anîn dikarin tê de werin dîtin .
Her weha mînakên karanîna ajokarên cihêreng têne dîtin .
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- config_options:
provisioner:
name: ansible
config_options:
defaults:
fact_caching: jsonfile
ssh_connection:
scp_if_ssh: True- girêdan_vebijarkên: vebijêrk
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: BARsenaryoya
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
- convergekontrol
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: barWerin 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 testExoza 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
