{"id":53611,"date":"2019-12-06T00:00:00","date_gmt":"2019-12-05T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1"},"modified":"2020-02-18T14:01:32","modified_gmt":"2020-02-18T11:01:32","slug":"legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ve\u0107 smo spomenuli <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, koji omogu\u0107uje razvoj distribuiranih aplikacija i njihovo pakiranje. Ostalo je samo da nau\u010dite kako implementirati te aplikacije i upravljati njima. Ne brinite, sve smo predvidjeli! Okupili smo najbolje prakse za rad s Tarantool Cartridge i napisali <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">ansible-rolu<\/a><\/noindex>, koja \u0107e rasporediti paket na servere, pokrenuti instance, povezati ih u klaster, postaviti autorizaciju, konfigurisati vshard, uklju\u010diti automatski failover i propisati klaster konfiguraciju.<\/p>\n<p><\/p>\n<p>Zanima vas? Onda vas pozivam ispod, sve \u0107emo objasniti i pokazati.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Po\u010dnimo s primjerom<\/h1>\n<p><\/p>\n<p>Razmotrit \u0107emo samo dio funkcionalnosti na\u0161e role. Potpuni opis svih mogu\u0107nosti i ulaznih parametara uvijek mo\u017eete prona\u0107i u <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentaciju<\/a><\/noindex>. No bolje je jednom probati nego sto puta vidjeti, pa hajde da implementiramo malu aplikaciju.<\/p>\n<p><\/p>\n<p>Tarantool Cartridge ima <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/cartridge-cli\/tree\/master\/examples\/getting-started-app#application-example-based-on-tarantool-cartridge\">tutorial<\/a><\/noindex> za izradu male Cartridge-aplikacije koja pohranjuje informacije o klijentima banke i njihovim ra\u010dunima, kao i pru\u017ea API za upravljanje podacima putem HTTP-a. Za to se u aplikaciji opisuju dvije mogu\u0107e uloge: <code>api<\/code> i <code>storage<\/code>, koje se mogu dodijeliti instancama.<\/p>\n<p><\/p>\n<p>Sam Cartridge ne govori ni\u0161ta o tome kako pokretati procese, ve\u0107 samo pru\u017ea mogu\u0107nost za konfiguraciju ve\u0107 pokrenutih instanci. Ostalo korisnik mora u\u010diniti sam: rasporediti konfiguracijske datoteke, pokrenuti servise i postaviti topologiju. No, ne\u0107emo se time zamarati, to \u0107e za nas u\u010diniti Ansible.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">Od rije\u010di do djela<\/h3>\n<p><\/p>\n<p>Dakle, implementirat \u0107emo na\u0161u aplikaciju na dva virtualna ra\u010dunala i postaviti jednostavnu topologiju:<\/p>\n<p><\/p>\n<ul>\n<li>Replikaset <code>app-1<\/code> \u0107e realizirati ulogu <code>api<\/code>, koja uklju\u010duje ulogu <code>vshard-router<\/code>. Ovdje \u0107e biti samo jedna instanca.<\/li>\n<li>Replikaset <code>storage-1<\/code> realizuje ulogu <code>storage<\/code> (i istovremeno <code>vshard-storage<\/code>), ovdje \u0107emo dodati dvije instance s razli\u010ditih ma\u0161ina.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za pokretanje primjera potrebni su nam <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (verzije 2.8 ili starije).<\/p>\n<p><\/p>\n<p>Sama uloga nalazi se u <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. To je skladi\u0161te koje omogu\u0107uje dijeljenje svojih radova i kori\u0161tenje gotovih uloga.<\/p>\n<p><\/p>\n<p>Kloni\u0107emo repozitorij s primjerom:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/dokshina\/deploy-tarantool-cartridge-app.git\n$ cd deploy-tarantool-cartridge-app &amp;&amp; git checkout 1.0.0<\/code><\/pre>\n<p><\/p>\n<p>Pokre\u0107emo virtualke:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Instaliramo ansible-rolu Tarantool Cartridge:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-galaxy install tarantool.cartridge,1.0.1<\/code><\/pre>\n<p><\/p>\n<p>Pokre\u0107emo instaliranu ulogu:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>\u010cekamo zavr\u0161etak izvr\u0161avanja playbook-a, prelazimo na <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> i u\u017eivamo u rezultatu:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mo\u017eemo unijeti podatke. Sjajno, zar ne?<\/p>\n<p><\/p>\n<p>Sada hajde da istra\u017eimo kako to raditi i dodajmo jo\u0161 jedan replicaset u topologiju.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Po\u010dnimo sa razumevanjem<\/h3>\n<p><\/p>\n<p>Dakle, \u0161ta se zapravo desilo?<\/p>\n<p><\/p>\n<p>Pokrenuli smo dve virtuelne ma\u0161ine i izvr\u0161ili ansible playbook, koji je konfigurisao na\u0161 klaster. Pogledajmo sadr\u017eaj datoteke <code>playbook.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Deploy my Tarantool Cartridge app\n  hosts: all\n  become: true\n  become_user: root\n  tasks:\n  - name: Import Tarantool Cartridge role\n    import_role:\n      name: tarantool.cartridge<\/code><\/pre>\n<p><\/p>\n<p>Ovde se ni\u0161ta posebno ne de\u0161ava, pokre\u0107emo ansible ulogu koja se zove <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Sve \u0161to je va\u017eno (a to je konfiguracija klastera) nalazi se u <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-datoteci <code>hosts.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    # common cluster variables\n    cartridge_app_name: getting-started-app\n    cartridge_package_path: .\/getting-started-app-1.0.0-0.rpm  # path to package\n\n    cartridge_cluster_cookie: app-default-cookie  # cluster cookie\n\n    # common ssh options\n    ansible_ssh_private_key_file: ~\/.vagrant.d\/insecure_private_key\n    ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=\/dev\/null -o StrictHostKeyChecking=no'\n\n  # INSTANCES\n  hosts:\n    storage-1:\n      config:\n        advertise_uri: '172.19.0.2:3301'\n        http_port: 8181\n\n    app-1:\n      config:\n        advertise_uri: '172.19.0.3:3301'\n        http_port: 8182\n\n    storage-1-replica:\n      config:\n        advertise_uri: '172.19.0.3:3302'\n        http_port: 8183\n\n  children:\n    # GROUP INSTANCES BY MACHINES\n    host1:\n      vars:\n        # first machine connection options\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n\n      hosts:  # instances to be started on the first machine\n        storage-1:\n\n    host2:\n      vars:\n        # second machine connection options\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n\n      hosts:  # instances to be started on the second machine\n        app-1:\n        storage-1-replica:\n\n    # GROUP INSTANCES BY REPLICA SETS\n    replicaset_app_1:\n      vars:  # replica set configuration\n        replicaset_alias: app-1\n        failover_priority:\n          - app-1  # leader\n        roles:\n          - 'api'\n\n      hosts:  # replica set instances\n        app-1:\n\n    replicaset_storage_1:\n      vars:  # replica set configuration\n        replicaset_alias: storage-1\n        weight: 3\n        failover_priority:\n          - storage-1  # leader\n          - storage-1-replica\n        roles:\n          - 'storage'\n\n      hosts:   # replica set instances\n        storage-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Sve \u0161to nam treba je da nau\u010dimo upravljati instancama i replicasetima, menjaju\u0107i sadr\u017eaj ove datoteke. U nastavku \u0107emo dodavati nove odeljke. Da se ne bismo zbunili gde ih dodavati, mo\u017eete pogledati kona\u010dnu verziju ove datoteke, <code>hosts.updated.yml<\/code>, koja se nalazi u repozitoriju sa primerom.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Upravljanje instancama<\/h3>\n<p><\/p>\n<p>U terminima Ansible, svaki instanc je host (ne mije\u0161ati s fizi\u010dkim serverom), tj. \u010dvor infrastrukture kojim \u0107e Ansible upravljati. Za svaki host mo\u017eemo odrediti parametre veze (kao \u0161to su <code>ansible_host<\/code> i <code>ansible_user<\/code>), kao i konfiguraciju instanca. Opis instanca nalazi se u odjeljku <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Pogledajmo konfiguraciju instance <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANCI\n  hosts:\n    storage-1:\n      config:\n        advertise_uri: '172.19.0.2:3301'\n        http_port: 8181\n\n  ...<\/code><\/pre>\n<p><\/p>\n<p>U varijabli <code>config<\/code> odredili smo parametre instance \u2014 <code>advertise URI<\/code> i <code>HTTP port<\/code>.<br \/>\nIspod se nalaze parametri instanci <code>app-1<\/code> i <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Moramo obavijestiti Ansible o parametrima veze za svaku instancu. \u010cini se logi\u010dnim grupirati instance prema virtualnim strojevima. U tu svrhu, instance su grupirane u grupe <code>host1<\/code> i <code>host2<\/code>, a u svakoj grupi u odjeljku <code>vars<\/code> navedene su vrijednosti <code>ansible_host<\/code> i <code>ansible_user<\/code> za jednu virtualku. A u odjeljku <code>hosts<\/code> \u2014 hostovi (tj. instance) koji su \u010dlanovi ove grupe:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # GRUPIRAJ INSTANCI PO STROJEVIMA\n    host1:\n      vars:\n        # opcije veze za prvu ma\u0161inu\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # instance koje \u0107e se pokrenuti na prvoj ma\u0161ini\n        storage-1:\n\n     host2:\n      vars:\n        # opcije veze za drugu ma\u0161inu\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # instance koje \u0107e se pokrenuti na drugoj ma\u0161ini\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Po\u010dinjemo s izmjenama <code>hosts.yml<\/code>. Dodajmo jo\u0161 dvije instance, <code>storage-2-replica<\/code> na prvoj virtualki i <code>storage-2<\/code> na drugoj:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANCI\n  hosts:\n    ...\n    storage-2:  # &lt;==\n      config:\n        advertise_uri: &#039;172.19.0.3:3303&#039;\n        http_port: 8184\n\n    storage-2-replica:  # &lt;==\n      config:\n        advertise_uri: &#039;172.19.0.2:3302&#039;\n        http_port: 8185\n\n  children:\n    # GRUPIRAJ INSTANCI PO STROJEVIMA\n    host1:\n      vars:\n        ...\n      hosts:  # instance koje \u0107e se pokrenuti na prvoj ma\u0161ini\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # instance koje \u0107e se pokrenuti na drugoj ma\u0161ini\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Pokre\u0107emo ansible playbook:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml \n                   --limit storage-2,storage-2-replica \n                   playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Obratite pa\u017enju na opciju <code>--limit<\/code>. Budu\u0107i da je svaka instanca klastera host u terminima Ansible, mo\u017eemo izri\u010dito odrediti koje instance trebaju biti konfigurirane prilikom izvo\u0111enja playbooka.<\/p>\n<p><\/p>\n<p>Ponovo ulazimo u Web UI <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> i promatramo na\u0161e nove instance:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne\u0107emo stati na postignutom i ovladat \u0107emo upravljanjem topologijom.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Upravljenje topologijom<\/h3>\n<p><\/p>\n<p>Spojit \u0107emo na\u0161e nove instance u replikacijski set <code>storage-2<\/code>. Dodajmo novu grupu <code>replicaset_storage_2<\/code> i opisat \u0107emo u njenim varijablama parametre replikacijskog seta po analogiji s <code>replicaset_storage_1<\/code>. U odjeljku <code>hosts<\/code> navest \u0107emo koje \u0107e instance biti uklju\u010dene u ovu grupu (tj. na\u0161 replikacijski set):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # GRUPOVANJE INSTANCA PREMA REPLIKACIJSKIM SETOVIMA\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # konfiguracija replikacijskog seta\n        replicaset_alias: storage-2\n        weight: 2\n        failover_priority:\n          - storage-2\n          - storage-2-replica\n        roles:\n          - 'storage'\n\n      hosts:   # instance replikacijskog seta\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Ponovno pokre\u0107emo playbook:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml \n                   --limit replicaset_storage_2 \n                   --tags cartridge-replicasets \n                   playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>U parametru <code>--limit<\/code> ovoga puta prenijeli smo ime grupe koja odgovara na\u0161em replikacijskom setu.<\/p>\n<p><\/p>\n<p>Razmotrimo opciju <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Na\u0161a uloga postupno izvr\u0161ava razli\u010dite zadatke koji su ozna\u010deni sljede\u0107im oznakama:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: upravljanje instancama (konfiguracija, povezivanje s \u010dlanstvom);<\/li>\n<li><code>cartridge-replicasets<\/code>: upravljanje topologijom (upravljanje replikacijskim skupovima i nepopravljivo uklanjanje (expel) instanci iz klastera);<\/li>\n<li><code>cartridge-config<\/code>: upravljanje ostalim parametrima klastera (vshard bootstrapping, na\u010din automatskog failover-a, parametri autorizacije i konfiguracija aplikacije).<\/li>\n<\/ul>\n<p><\/p>\n<p>Mo\u017eemo izri\u010dito navesti koju dio posla \u017eelimo obaviti, tada \u0107e uloga presko\u010diti izvr\u0161enje preostalih zadataka. U na\u0161em slu\u010daju \u017eelimo raditi samo s topologijom, stoga smo naveli <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Ocijenimo rezultat na\u0161ih napora. Pronalazimo novi replikacijski set na <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Lako i neprimjetno deployamo aplikacije na Tarantool Cartridge (dio 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ura!<\/p>\n<p><\/p>\n<p>Istra\u017eujte promjene konfiguracije instanci i replikacijskih setova i promatrajte kako se topologija klastera mijenja. Mo\u017eete isprobati razli\u010dite operativne scenarije, na primjer, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">rolling update<\/a><\/noindex> ili pove\u0107anje <code>memtx_memory<\/code>. Uloga \u0107e poku\u0161ati to u\u010diniti bez ponovnog pokretanja instance, kako bi smanjila mogu\u0107e vrijeme zastoja va\u0161e aplikacije.<\/p>\n<p><\/p>\n<p>Ne zaboravite pokrenuti <code>vagrant halt<\/code>, kako biste zaustavili virtualne ma\u0161ine kada zavr\u0161ite s njima.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">A \u0161to je ispod haube?<\/h1>\n<p><\/p>\n<p>Ovde \u0107u detaljnije opisati \u0161to se doga\u0111a ispod haube ansible-rolije tokom na\u0161ih eksperimenata.<\/p>\n<p><\/p>\n<p>Razmotrimo korake implementacije Cartridge-aplikacije.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Instalacija paketa i pokretanje instanci<\/h3>\n<p><\/p>\n<p>Prvo je potrebno dostaviti paket na server i instalirati ga. Sada uloga mo\u017ee raditi s RPM- i DEB-paketima.<\/p>\n<p><\/p>\n<p>Zatim pokre\u0107emo instance. Sve je vrlo jednostavno: svaka instanca je zaseban <code>systemd<\/code>-servis. Obja\u0161njavam na primjeru:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ systemctl start myapp@storage-1<\/code><\/pre>\n<p><\/p>\n<p>Ova komanda \u0107e pokrenuti instancu <code>storage-1<\/code> aplikacije <code>myapp<\/code>. Pokrenuta instanca \u0107e tra\u017eiti svoju <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">konfiguraciju<\/a><\/noindex> u <code>\/etc\/tarantool\/conf.d\/<\/code>. Zapisnici instance mogu se pregledati pomo\u0107u <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>Jedini\u010dni datoteka <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> za systemd uslugu bit \u0107e dostavljen zajedno s paketom.<\/p>\n<p><\/p>\n<p>Ansible sadr\u017ei ugra\u0111ene module za instalaciju paketa i upravljanje systemd uslugama, ovdje nismo smislili ni\u0161ta novo.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Postavljanje topologije klastera<\/h3>\n<p><\/p>\n<p>A ovdje po\u010dinje najzanimljivije. Sla\u017eete se, bilo bi \u010dudno zamarati se posebnim ansible-rolom za instalaciju paketa i pokretanje <code>systemd<\/code>-usluga.<\/p>\n<p><\/p>\n<p>Klaster se mo\u017ee postaviti ru\u010dno:<\/p>\n<p><\/p>\n<ul>\n<li>Prva opcija: otvaramo Web UI i pritiskamo gumbe. Za jednokratno pokretanje nekoliko instanci, to je sasvim dovoljno.<\/li>\n<li>Druga opcija: mo\u017eemo iskoristiti GraphQl API. Ovdje ve\u0107 mo\u017eemo automatizirati ne\u0161to, na primjer, napisati skriptu na Pythonu.<\/li>\n<li>Tre\u0107a opcija (za duhovno jake): ulazimo na poslu\u017eitelj, povezujemo se s jednom od instanci pomo\u0107u <code>tarantoolctl connect<\/code> i izvr\u0161avamo sve potrebne manipulacije s Lua modulom <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Glavni cilj na\u0161eg izuma je obaviti upravo ovaj, najte\u017ei dio posla umjesto vas.<\/p>\n<p><\/p>\n<p>Ansible omogu\u0107uje da napi\u0161ete svoj modul i koristite ga u roli. Na\u0161a uloga koristi takve module za upravljanje razli\u010ditim komponentama klastera.<\/p>\n<p><\/p>\n<p>Kako to radi? Opisujete po\u017eeljno stanje klastera u deklarativnoj konfiguraciji, a uloga daje svakom modulu njegovu sekciju konfiguracije. Modul dobiva trenutno stanje klastera i uspore\u0111uje ga s onim \u0161to je primio. Zatim kroz socket jedne od instanci pokre\u0107e se kod koji dovodi klaster u \u017eeljeno stanje.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Zaklju\u010dci<\/h1>\n<p><\/p>\n<p>Danas smo objasnili i pokazali kako implementirati va\u0161u aplikaciju na Tarantool Cartridge i postaviti jednostavnu topologiju. U tu svrhu koristili smo Ansible \u2014 mo\u0107an alat koji se odlikuje jednostavno\u0161\u0107u upotrebe i omogu\u0107uje istovremeno postavljanje mnogih \u010dvorova infrastrukture (u na\u0161em slu\u010daju to su instance klastera).<\/p>\n<p><\/p>\n<p>Gore smo se bavili jednim od mnogih na\u010dina opisivanja konfiguracije klastera pomo\u0107u Ansibla. \u010cim shvatite da ste spremni i\u0107i dalje, prou\u010dite <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">najbolje prakse<\/a><\/noindex> za pisanje playbooka. Mo\u017eda \u0107e vam biti zgodnije upravljati topologijom pomo\u0107u <code>group_vars<\/code> i <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Uskoro \u0107emo objasniti kako trajno ukloniti (expel) instance iz topologije, bootstrapovati vshard, upravljati re\u017eimom automatskog failover-a, pode\u0161avati autorizaciju i patchovati konfiguraciju klastera. A do tada, mo\u017eete samostalno istra\u017eivati <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentaciju<\/a><\/noindex> i eksperimentirati s promjenom parametara klastera.<\/p>\n<p><\/p>\n<p>Ako ne\u0161to ne radi, obavezno <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">javite<\/a><\/noindex> nam o problemu. Brzo \u0107emo sve rije\u0161iti!<\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478710\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043f\u0440\u043e Tarantool Cartridge, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0438\u0445. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e: \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438. \u041d\u0435 \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0439\u0442\u0435\u0441\u044c, \u043c\u044b \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438! \u041c\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432\u0441\u0435 best practices \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Tarantool Cartridge \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 ansible-\u0440\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442 \u0438\u0445 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53611","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0443\u0436\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Tarantool Cartridge (\u0447\u0430\u0441\u0442\u044c 1) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0443\u0436\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-05T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Lako i opu\u0161teno deployamo aplikacije na Tarantool Cartridge (dio 1) | ProHoster","description":"Ve\u0107 radimo.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Tarantool Cartridge (\u0447\u0430\u0441\u0442\u044c 1) | ProHoster","og:description":"\u041c\u044b \u0443\u0436\u0435.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-05T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53611","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 08:06:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:22:49","updated":"2026-01-24 08:06:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}