{"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\/da\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi har allerede fortalt om <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, som muligg\u00f8r udvikling af distribuerede applikationer og pakning af dem. Der er kun en lille ting tilbage: at l\u00e6re at deployere disse applikationer og styre dem. Frygt ikke, vi har t\u00e6nkt p\u00e5 alt! Vi har samlet alle bedste praksis for arbejde med Tarantool Cartridge og skrevet <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">ansible-rolle<\/a><\/noindex>, der vil installere pakken p\u00e5 serverne, starte instanserne, samle dem i et cluster, konfigurere autorisation, bootstrappe vshard, aktivere automatisk failover og patcher clusterkonfigurationen.<\/p>\n<p><\/p>\n<p>Interesseret? S\u00e5 f\u00f8lg med, vi vil fort\u00e6lle og vise alt.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Lad os starte med et eksempel<\/h1>\n<p><\/p>\n<p>Vi vil kun gennemg\u00e5 en del af funktionaliteten af vores rolle. Den fulde beskrivelse af alle dens muligheder og indgangsparametre kan du altid finde i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentationen<\/a><\/noindex>. Men det er bedre at pr\u00f8ve \u00e9n gang end at se hundrede gange, s\u00e5 lad os deployere en lille applikation.<\/p>\n<p><\/p>\n<p>Tarantool Cartridge har <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> til at oprette en lille Cartridge-applikation, som gemmer oplysninger om bankens kunder og deres konti, samt giver en API til at administrere data via HTTP. I denne applikation beskrives to mulige roller: <code>api<\/code> og <code>storage<\/code>, der kan tildeles instanser.<\/p>\n<p><\/p>\n<p>Selve Cartridge siger ikke noget om, hvordan man k\u00f8rer processer, den giver kun mulighed for at konfigurere allerede k\u00f8rte instanser. Resten skal brugeren selv g\u00f8re: placere konfigurationsfiler, starte tjenester og konfigurere topologien. Men vi vil ikke g\u00f8re alt dette, det vil Ansible g\u00f8re for os.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">Fra ord til handling<\/h3>\n<p><\/p>\n<p>Lad os deployere vores applikation p\u00e5 to virtuelle maskiner og konfigurere en simpel topologi:<\/p>\n<p><\/p>\n<ul>\n<li>Replicaset <code>app-1<\/code> vil implementere rollen <code>api<\/code>, som inkluderer rollen <code>vshard-router<\/code>. Her vil der kun v\u00e6re \u00e9n instans.<\/li>\n<li>Replicaset <code>storage-1<\/code> implementerer rollen <code>storage<\/code> (og samtidig <code>vshard-storage<\/code>), her tilf\u00f8jer vi to instanser fra forskellige maskiner.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Til at k\u00f8re eksemplet har vi brug for <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (version 2.8 eller \u00e6ldre).<\/p>\n<p><\/p>\n<p>Selve rollen findes i <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. Det er et s\u00e5dant lager, der giver mulighed for at dele sine v\u00e6rker og bruge f\u00e6rdige roller.<\/p>\n<p><\/p>\n<p>Vi kloner repositoriet med eksemplet:<\/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>Vi starter de virtuelle maskiner:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Installerer ansible-rollen 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>K\u00f8rer den installerede rolle:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Vi venter p\u00e5, at playbook'en afsluttes, og g\u00e5r videre til <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> og nyder resultatet:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi kan begynde at indtaste data. Ret fedt, ikke?<\/p>\n<p><\/p>\n<p>Lad os nu se p\u00e5, hvordan vi arbejder med dette, og samtidig tilf\u00f8jer vi endnu et replikas\u00e6t til topologien.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Lad os begynde at unders\u00f8ge<\/h3>\n<p><\/p>\n<p>S\u00e5 hvad skete der?<\/p>\n<p><\/p>\n<p>Vi har oprettet to virtuelle maskiner og k\u00f8rt en ansible-playbook, der har konfigureret vores cluster. Lad os se indholdet af filen <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>Der sker ikke noget interessant her, vi k\u00f8rer ansible-rollen, der hedder <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Alt det vigtigste (specifikt, konfigurationen af clusteret) er i <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-filen <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>Alt, hvad vi beh\u00f8ver, er at l\u00e6re at styre instanser og replikas\u00e6t ved at \u00e6ndre indholdet af denne fil. Vi vil derefter tilf\u00f8je nye sektioner til den. For at undg\u00e5 forvirring om, hvor de skal tilf\u00f8jes, kan du tage et kig p\u00e5 den afsluttede version af denne fil, <code>hosts.updated.yml<\/code>, som findes i eksempeldatabasen.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">H\u00e5ndtering af instanser<\/h3>\n<p><\/p>\n<p>I Ansible-termer er hver instans en v\u00e6rt (ikke at forveksle med en fysisk server), dvs. en infrastruktursknude, som Ansible vil styre. For hver v\u00e6rt kan vi angive forbindelsesparametre (s\u00e5som <code>ansible_host<\/code> og <code>ansible_user<\/code>), samt konfigurationen af instansen. Beskrivelsen af instanserne findes i sektionen <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Lad os se p\u00e5 konfigurationen af instansen <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANSE\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>I variablen <code>config<\/code> har vi angivet parametrene for instansen \u2014 <code>advertise URI<\/code> og <code>HTTP port<\/code>.<br \/>\nNedenfor er parametrene for instanserne <code>app-1<\/code> og <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Vi skal informere Ansible om forbindelsesparametrene for hver instans. Det virker logisk at gruppere instanserne efter virtuelle maskiner. Derfor er instanserne grupperet i grupper <code>host1<\/code> og <code>host2<\/code>, og i hver gruppe i sektionen <code>vars<\/code> er angivet v\u00e6rdier <code>ansible_host<\/code> og <code>ansible_user<\/code> for en enkelt virtuel maskine. Og i sektionen <code>hosts<\/code> \u2014 v\u00e6rter (de samme er instanser), som tilh\u00f8rer denne gruppe:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # GRUPPER INSTANSER EFTER MASKINER\n    host1:\n      vars:\n        # forbindelsesmuligheder for f\u00f8rste maskine\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # instanser der skal startes p\u00e5 f\u00f8rste maskine\n        storage-1:\n\n     host2:\n      vars:\n        # forbindelsesmuligheder for anden maskine\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # instanser der skal startes p\u00e5 anden maskine\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Vi begynder at \u00e6ndre <code>hosts.yml<\/code>. Vi tilf\u00f8jer yderligere to instanser, <code>storage-2-replica<\/code> p\u00e5 den f\u00f8rste virtuelle maskine og <code>storage-2<\/code> p\u00e5 den anden:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # INSTANSE\n  hosts:\n    ...\n    storage-2:  # &lt;==\n      config:\n        advertise_uri: '172.19.0.3:3303'\n        http_port: 8184\n\n    storage-2-replica:  # &lt;==\n      config:\n        advertise_uri: '172.19.0.2:3302'\n        http_port: 8185\n\n  children:\n    # GRUPPER INSTANSER EFTER MASKINER\n    host1:\n      vars:\n        ...\n      hosts:  # instanser der skal startes p\u00e5 f\u00f8rste maskine\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # instanser der skal startes p\u00e5 anden maskine\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Vi k\u00f8rer 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>L\u00e6g m\u00e6rke til indstillingen <code>--limit<\/code>. Da hver instans i klyngen er en v\u00e6rt i Ansible-termer, kan vi specifikt angive, hvilke instanser der skal konfigureres, n\u00e5r playbooken k\u00f8res.<\/p>\n<p><\/p>\n<p>Vi logger ind i Web UI <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> og ser vores nye instanser:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lad os ikke stoppe her og mestre styring af topologi.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Topology Management<\/h3>\n<p><\/p>\n<p>Lad os samle vores nye instanser i et replicaset <code>storage-2<\/code>. Vi tilf\u00f8jer en ny gruppe <code>replicaset_storage_2<\/code> og beskriver dens variabler med parametrene for replicaset i lighed med <code>replicaset_storage_1<\/code>. I sektionen <code>hosts<\/code> angiver vi, hvilke instanser der vil v\u00e6re en del af denne gruppe (dvs. vores replicaset):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # GRUPPER INSTANSSER EFTER REPLIKA S\u00c6T\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # replicaset konfiguration\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:   # replicaset instanser\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Vi k\u00f8rer playbook'en igen:<\/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>I parameteren <code>--limit<\/code> har vi denne gang givet navnet p\u00e5 gruppen, der svarer til vores replicaset.<\/p>\n<p><\/p>\n<p>Lad os se p\u00e5 indstillingen <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Vores rolle udf\u00f8rer sekventielt forskellige opgaver, der er markeret med f\u00f8lgende tags:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: administration af instanser (ops\u00e6tning, forbindelse til medlemskab);<\/li>\n<li><code>cartridge-replicasets<\/code>: administration af topologien (styring af replicats\u00e6t og uigenkaldelig fjernelse (expel) af instanser fra klyngen);<\/li>\n<li><code>cartridge-config<\/code>: administration af andre parametre i klyngen (vshard bootstrapping, automatisk failover tilstand, autorisationsparametre og applikationskonfiguration).<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kan eksplicit angive, hvilken del af arbejdet vi \u00f8nsker at udf\u00f8re, s\u00e5 rollen vil springe de \u00f8vrige opgaver over. I vores tilf\u00e6lde \u00f8nsker vi kun at arbejde med topologien, derfor angav vi <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Lad os vurdere resultatet af vores anstrengelser. Vi finder det nye replicaset p\u00e5 <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=\"Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hurra!<\/p>\n<p><\/p>\n<p>Eksperiment\u00e9r med at \u00e6ndre konfigurationen af instanser og replicats\u00e6t og se, hvordan topologien i klyngen \u00e6ndrer sig. Du kan pr\u00f8ve forskellige driftscenarier, for eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">rolling update<\/a><\/noindex> eller stigning af <code>memtx_memory<\/code>. Rollen vil fors\u00f8ge at udf\u00f8re dette uden at genstarte instansen for at minimere mulig nedetid for din applikation.<\/p>\n<p><\/p>\n<p>Glem ikke at k\u00f8re <code>vagrant halt<\/code>, for at stoppe virtuelbokse, n\u00e5r du er f\u00e6rdig med at arbejde med dem.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">Og hvad sker der bag kulisserne?<\/h1>\n<p><\/p>\n<p>Her vil jeg forklare n\u00e6rmere, hvad der skete bag kulisserne i ansible-rollen under vores eksperimenter.<\/p>\n<p><\/p>\n<p>Lad os se p\u00e5 trin for trin deployment af Cartridge-applikationen.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Installation af pakken og opstart af instanser<\/h3>\n<p><\/p>\n<p>F\u00f8rst skal du levere pakken til serveren og installere den. I \u00f8jeblikket kan rollen arbejde med RPM- og DEB-pakker.<\/p>\n<p><\/p>\n<p>Derefter starter vi instanserne. Her er det meget enkelt: hver instans er en separat <code>systemd<\/code>-tjeneste. Jeg forklarer med et eksempel:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ systemctl start myapp@storage-1<\/code><\/pre>\n<p><\/p>\n<p>Denne kommando vil starte instansen <code>storage-1<\/code> applikation <code>myapp<\/code>. Den k\u00f8rende instans vil s\u00f8ge efter sin <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">konfigurationen<\/a><\/noindex> i <code>\/etc\/tarantool\/conf.d\/<\/code>. Loggene for instansen kan ses med <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>Unit-fil <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> for systemd-tjenesten leveres sammen med pakken.<\/p>\n<p><\/p>\n<p>I Ansible er der indbyggede moduler til installation af pakker og styring af systemd-tjenester, s\u00e5 her har vi ikke opfundet noget nyt.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Ops\u00e6tning af klyngens topologi<\/h3>\n<p><\/p>\n<p>Og her begynder det sp\u00e6ndende. Enig, det ville v\u00e6re m\u00e6rkeligt at bruge tid p\u00e5 en speciel ansible-rolle til installation af pakker og opstart <code>systemd<\/code>-tjenester.<\/p>\n<p><\/p>\n<p>Du kan konfigurere klyngen manuelt:<\/p>\n<p><\/p>\n<ul>\n<li>F\u00f8rste mulighed: \u00e5bner Web UI og trykker p\u00e5 knapperne. Til engangsopstart af flere instanser er det ganske passende.<\/li>\n<li>Anden mulighed: du kan bruge GraphQl API. Her kan du allerede automatisere noget, for eksempel skrive et script i Python.<\/li>\n<li>Tredje mulighed (til de st\u00e6rke af sind): vi logger ind p\u00e5 serveren, forbinder til en af instanserne ved hj\u00e6lp af <code>tarantoolctl connect<\/code> og udf\u00f8rer alle n\u00f8dvendige manipulationer med Lua-modulet <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>Den prim\u00e6re opgave med vores opfindelse er at udf\u00f8re denne mest komplekse del af arbejdet for dig.<\/p>\n<p><\/p>\n<p>Ansible g\u00f8r det muligt at skrive din egen modul og bruge den i en rolle. Vores rolle bruger s\u00e5danne moduler til at styre forskellige komponenter i klyngen.<\/p>\n<p><\/p>\n<p>Hvordan virker det? Du beskriver den \u00f8nskede tilstand af klyngen i en deklarativ konfiguration, og rollen giver hver modul sin konfigurationssektion. Modulet f\u00e5r den nuv\u00e6rende tilstand af klyngen og sammenligner det med det, der kommer ind. Herefter k\u00f8rer koden via socketen af en af instanserne, hvilket f\u00e5r klyngen til at n\u00e5 den \u00f8nskede tilstand.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Resum\u00e9<\/h1>\n<p><\/p>\n<p>I dag har vi fortalt og vist, hvordan man deployer din applikation p\u00e5 Tarantool Cartridge og konfigurerer en simpel topologi. Til dette har vi brugt Ansible \u2014 et kraftfuldt v\u00e6rkt\u00f8j, der adskiller sig ved sin brugervenlighed og muligheden for samtidig at konfigurere mange infrastruktur-noder (i vores tilf\u00e6lde er det instanser af klyngen).<\/p>\n<p><\/p>\n<p>Ovenfor har vi forst\u00e5et en af de mange m\u00e5der at beskrive konfigurationen af klyngen ved hj\u00e6lp af Ansible. S\u00e5 snart du f\u00f8ler dig klar til at g\u00e5 videre, skal du studere <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">best practices<\/a><\/noindex> for at skrive playbooks. Det kan v\u00e6re, du vil finde det nemmere at styre topologien ved hj\u00e6lp af <code>group_vars<\/code> og <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Meget snart vil vi fort\u00e6lle, hvordan man uigenkaldeligt fjerner (expel) instanser fra topologien, bootstrapper vshard, styrer den automatiske failover-tilstand, konfigurerer godkendelse og patcher den klynge konfiguration. Indtil da kan du selv udforske. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">dokumentationen<\/a><\/noindex> og og eksperimentere med at \u00e6ndre klyngeparametrene.<\/p>\n<p><\/p>\n<p>Hvis noget ikke fungerer, s\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">giv os besked<\/a><\/noindex> om problemet. Vi l\u00f8ser det hurtigt!<\/p>\n<p>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Let og ubesv\u00e6ret deployer vi applikationer p\u00e5 Tarantool Cartridge (del 1) | ProHoster","description":"Vi allerede.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}