{"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\/it\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Abbiamo gi\u00e0 parlato di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, che consente di sviluppare applicazioni distribuite e confezionarle. Ora rimane solo un passo: imparare a distribuire queste applicazioni e gestirle. Non preoccupatevi, abbiamo coperto tutto! Abbiamo raccolto tutte le best practices per lavorare con Tarantool Cartridge e scritto <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">ruolo-ansible<\/a><\/noindex>, che installer\u00e0 il pacchetto sui server, avvier\u00e0 le istanze, le unir\u00e0 in un cluster, configurer\u00e0 l'autenticazione, bootstrapper\u00e0 vshard, abiliter\u00e0 il failover automatico e aggiorner\u00e0 la configurazione del cluster.<\/p>\n<p><\/p>\n<p>Interessati? Allora venite a scoprire di pi\u00f9, vi racconteremo e mostreremo tutto.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Iniziamo con un esempio<\/h1>\n<p><\/p>\n<p>Considereremo solo una parte delle funzionalit\u00e0 del nostro ruolo. La descrizione completa di tutte le sue capacit\u00e0 e dei parametri di ingresso \u00e8 sempre disponibile in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">documentazione<\/a><\/noindex>. Ma \u00e8 meglio provare una volta piuttosto che vedere cento volte, quindi mettiamo in funzione una piccola applicazione.<\/p>\n<p><\/p>\n<p>Con Tarantool Cartridge ci sono <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> un modo per creare una piccola applicazione Cartridge che memorizza informazioni sui clienti di una banca e sui loro conti, e offre un'API per gestire i dati tramite HTTP. Per fare questo, nell'applicazione vengono descritte due possibili ruoli: <code>api<\/code> e <code>storage<\/code>, che possono essere assegnati alle istanze.<\/p>\n<p><\/p>\n<p>Il Cartridge in s\u00e9 non dice nulla su come avviare i processi, fornisce solo la possibilit\u00e0 di configurare le istanze gi\u00e0 avviate. Il resto deve essere fatto dall'utente: distribuire i file di configurazione, avviare i servizi e configurare la topologia. Ma non ci occupiamo noi di questo, lo far\u00e0 Ansible per noi.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">Passiamo ai fatti<\/h3>\n<p><\/p>\n<p>Quindi, distribuiamo la nostra applicazione su due macchine virtuali e configuriamo una semplice topologia:<\/p>\n<p><\/p>\n<ul>\n<li>ReplicaSet <code>app-1<\/code> implementer\u00e0 il ruolo <code>api<\/code>, che include il ruolo <code>vshard-router<\/code>. Qui ci sar\u00e0 solo un'istanza.<\/li>\n<li>ReplicaSet <code>storage-1<\/code> implementa il ruolo <code>storage<\/code> (e contemporaneamente <code>vshard-storage<\/code>), qui aggiungeremo due istanze da macchine diverse.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per avviare l'esempio avremo bisogno di <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (versioni 2.8 o superiori).<\/p>\n<p><\/p>\n<p>Il ruolo stesso si trova in <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. Questo \u00e8 un repository che consente di condividere le proprie esperienze e utilizzare ruoli gi\u00e0 pronti.<\/p>\n<p><\/p>\n<p>Cloniamo il repository con l'esempio:<\/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>Alziamo le macchine virtuali:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Installiamo il ruolo ansible 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>Eseguiamo il ruolo installato:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Aspettiamo il termine dell'esecuzione del playbook, poi passiamo a <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> e godiamo il risultato:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 possibile trasferire i dati. \u00c8 fantastico, vero?<\/p>\n<p><\/p>\n<p>Ora vediamo come lavorare su questo e aggiungiamo un altro replicaset alla topologia.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Iniziamo a capire<\/h3>\n<p><\/p>\n<p>Quindi, cosa \u00e8 successo?<\/p>\n<p><\/p>\n<p>Abbiamo avviato due macchine virtuali e lanciato un playbook Ansible che ha configurato il nostro cluster. Diamo un'occhiata al contenuto del file <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>Qui non succede niente di interessante, lanciamo il ruolo Ansible chiamato <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Tutto ci\u00f2 che \u00e8 importante (cio\u00e8 la configurazione del cluster) si trova nel <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-file <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>Tutto ci\u00f2 di cui abbiamo bisogno \u00e8 imparare a gestire le istanze e i replicaset, modificando il contenuto di questo file. In seguito aggiungeremo nuove sezioni. Per non confonderci su dove aggiungerle, puoi dare un'occhiata alla versione finale di questo file, <code>hosts.updated.yml<\/code>, che si trova nel repository di esempio.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Gestione delle istanze<\/h3>\n<p><\/p>\n<p>In termini di Ansible, ogni istanza \u00e8 un host (da non confondere con un server fisico), cio\u00e8 un nodo dell'infrastruttura che Ansible gestir\u00e0. Per ogni host possiamo specificare le opzioni di connessione (come ad esempio <code>ansible_host<\/code> e <code>ansible_user<\/code>), e la configurazione dell'istanza. La descrizione delle istanze si trova nella sezione <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Esaminiamo la configurazione dell'istanza <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # ISTANZE\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>Nella variabile <code>config<\/code> abbiamo specificato i parametri dell'istanza \u2014 <code>advertise URI<\/code> e <code>porta HTTP<\/code>.<br \/>\nDi seguito sono riportati i parametri delle istanze <code>app-1<\/code> e <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Dobbiamo comunicare ad Ansible i parametri di connessione per ogni istanza. \u00c8 logico raggruppare le istanze in base alle macchine virtuali. Per questo, le istanze sono state raggruppate in gruppi <code>host1<\/code> e <code>host2<\/code>, e in ogni gruppo nella sezione <code>vars<\/code> sono indicati i valori <code>ansible_host<\/code> e <code>ansible_user<\/code> per una virtual machine. E nella sezione <code>hosts<\/code> \u2014 i host (che sono anche istanze), che fanno parte di questo gruppo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # GRUPPA ISTANZE PER MACCHINE\n    host1:\n      vars:\n        # opzioni di connessione della prima macchina\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # istanze da avviare sulla prima macchina\n        storage-1:\n\n     host2:\n      vars:\n        # opzioni di connessione della seconda macchina\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # istanze da avviare sulla seconda macchina\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Iniziamo a modificare <code>hosts.yml<\/code>. Aggiungiamo altre due istanze, <code>storage-2-replica<\/code> sulla prima macchina virtuale e <code>storage-2<\/code> sulla seconda:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">all:\n  vars:\n    ...\n\n  # ISTANZE\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    # GRUPPA ISTANZE PER MACCHINE\n    host1:\n      vars:\n        ...\n      hosts:  # istanze da avviare sulla prima macchina\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # istanze da avviare sulla seconda macchina\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Avviamo il playbook di ansible:<\/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>Si noti l'opzione <code>--limit<\/code>. Poich\u00e9 ogni istanza del cluster \u00e8 un host in termini di Ansible, possiamo specificare esplicitamente quali istanze devono essere configurate durante l'esecuzione del playbook.<\/p>\n<p><\/p>\n<p>Rientriamo nell'interfaccia Web <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> e vediamo le nostre nuove istanze:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non ci fermeremo qui e impariamo a gestire la topologia.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Gestione della topologia<\/h3>\n<p><\/p>\n<p>Uniamo le nostre nuove istanze in un replicaset <code>storage-2<\/code>. Aggiungiamo un nuovo gruppo <code>replicaset_storage_2<\/code> e descriviamo nelle sue variabili i parametri del replicaset analogamente a <code>replicaset_storage_1<\/code>. Nella sezione <code>hosts<\/code> specificheremo quali istanze faranno parte di questo gruppo (cio\u00e8 il nostro replicaset):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # GRUPPARE LE ISTANZE PER SET DI REPLICA\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # configurazione del replicaset\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:   # istanze del replicaset\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Riavviamo il 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>Nel parametro <code>--limit<\/code> stavolta abbiamo passato il nome del gruppo, che corrisponde al nostro replicaset.<\/p>\n<p><\/p>\n<p>Consideriamo l'opzione <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Il nostro ruolo esegue sequenzialmente diverse attivit\u00e0, contrassegnate dai seguenti tag:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: gestione delle istanze (configurazione, connessione al membership);<\/li>\n<li><code>cartridge-replicasets<\/code>: gestione della topologia (gestire i replicaset e rimuovere in modo irrevocabile (expel) le istanze dal cluster);<\/li>\n<li><code>cartridge-config<\/code>: gestione degli altri parametri del cluster (vshard bootstrapping, modalit\u00e0 di failover automatico, parametri di autorizzazione e configurazione dell'applicazione).<\/li>\n<\/ul>\n<p><\/p>\n<p>Possiamo specificare chiaramente quale parte del lavoro vogliamo eseguire, quindi il ruolo salter\u00e0 l'esecuzione delle altre attivit\u00e0. Nel nostro caso vogliamo lavorare solo con la topologia, quindi abbiamo specificato <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Valutiamo il risultato dei nostri sforzi. Troviamo il nuovo replicaset su <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=\"Deployiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Evviva!<\/p>\n<p><\/p>\n<p>Sperimentate con la modifica della configurazione delle istanze e dei replicaset e osservate come cambia la topologia del cluster. Potete provare diversi scenari operativi, come ad esempio <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">rolling update<\/a><\/noindex> o l'aumento di <code>memtx_memory<\/code>. Il ruolo cercher\u00e0 di farlo senza riavviare l'istanza, per ridurre il possibile downtime della vostra applicazione.<\/p>\n<p><\/p>\n<p>Non dimenticate di eseguire <code>vagrant halt<\/code>, per fermare le macchine virtuali quando avete finito di lavorare con esse.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">E cosa c'\u00e8 sotto il cofano?<\/h1>\n<p><\/p>\n<p>Qui parler\u00f2 pi\u00f9 dettagliatamente di cosa \u00e8 accaduto sotto il cofano del ruolo ansible durante i nostri esperimenti.<\/p>\n<p><\/p>\n<p>Esaminiamo passo dopo passo il deploy dell'applicazione Cartridge.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Installazione del pacchetto e avvio delle istanze<\/h3>\n<p><\/p>\n<p>Prima di tutto, \u00e8 necessario trasferire il pacchetto sul server e installarlo. Ora il ruolo pu\u00f2 lavorare con pacchetti RPM e DEB.<\/p>\n<p><\/p>\n<p>Successivamente, avviamo le istanze. Qui tutto \u00e8 molto semplice: ogni istanza \u00e8 un singolo <code>systemd<\/code>-servizio. Lo spiego con un esempio:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ systemctl start myapp@storage-1<\/code><\/pre>\n<p><\/p>\n<p>Questo comando avvier\u00e0 l'istanza <code>storage-1<\/code> dell'applicazione <code>myapp<\/code>. L'istanza avviata cercher\u00e0 il suo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">configurazione<\/a><\/noindex> in <code>\/etc\/tarantool\/conf.d\/<\/code>. I log dell'istanza possono essere visualizzati usando <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>Il file Unit <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> per il servizio systemd sar\u00e0 fornito insieme al pacchetto.<\/p>\n<p><\/p>\n<p>In Ansible, ci sono moduli integrati per l'installazione di pacchetti e la gestione dei servizi systemd, non abbiamo inventato nulla di nuovo.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Configurazione della topologia del cluster<\/h3>\n<p><\/p>\n<p>Ma qui inizia la parte pi\u00f9 interessante. Sarebbe strano dedicarsi a un ruolo ansible speciale per installare pacchetti e avviare <code>systemd<\/code>-servizi.<\/p>\n<p><\/p>\n<p>Il cluster pu\u00f2 essere configurato manualmente:<\/p>\n<p><\/p>\n<ul>\n<li>Primo metodo: apriamo l'interfaccia Web e facciamo clic sui pulsanti. Per avviare un paio di istanze basta.<\/li>\n<li>Secondo metodo: possiamo utilizzare l'API GraphQl. Qui \u00e8 possibile automatizzare qualcosa, ad esempio scrivere uno script in Python.<\/li>\n<li>Terzo metodo (per i pi\u00f9 decisi): accediamo al server e ci connettiamo a una delle istanze tramite <code>tarantoolctl connect<\/code> ed effettuare tutte le manipolazioni necessarie con il modulo Lua <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>L'obiettivo principale della nostra invenzione \u00e8 fare proprio questa parte, la pi\u00f9 complessa del lavoro.<\/p>\n<p><\/p>\n<p>Ansible consente di scrivere il proprio modulo e utilizzarlo in un ruolo. Il nostro ruolo utilizza moduli di questo tipo per gestire vari componenti del cluster.<\/p>\n<p><\/p>\n<p>Come funziona? Descrivi lo stato desiderato del cluster in una configurazione dichiarativa, e il ruolo fornisce a ciascun modulo la sua sezione di configurazione. Il modulo riceve lo stato corrente del cluster e lo confronta con quello che ha ricevuto in ingresso. Dopodich\u00e9, attraverso il socket di una delle istanze, viene eseguito un codice che porta il cluster allo stato desiderato.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Conclusioni<\/h1>\n<p><\/p>\n<p>Oggi abbiamo raccontato e mostrato come distribuire la vostra applicazione su Tarantool Cartridge e configurare una semplice topologia. Per questo abbiamo utilizzato Ansible, uno strumento potente, caratterizzato da un uso semplice e che consente di configurare contemporaneamente molti nodi dell'infrastruttura (nel nostro caso, queste sono istanze del cluster).<\/p>\n<p><\/p>\n<p>In precedenza abbiamo esaminato uno dei numerosi modi per descrivere la configurazione del cluster attraverso Ansible. Non appena capirete di essere pronti per avanzare, approfondite <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">le best practice<\/a><\/noindex> per la scrittura di playbook. Potrebbe esservi pi\u00f9 comodo gestire la topologia utilizzando <code>group_vars<\/code> e <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Presto parleremo di come espellere definitivamente le istanze dalla topologia, bootstrap vshard, gestire la modalit\u00e0 di failover automatico, configurare l'autenticazione e patchare la configurazione del cluster. Nel frattempo, potete esplorare autonomamente. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">la documentazione<\/a><\/noindex> e sperimentare con le impostazioni del cluster.<\/p>\n<p><\/p>\n<p>Se qualcosa non funziona, assicurati di <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">comunicarci<\/a><\/noindex> il problema. Risolveremo tutto rapidamente!<\/p>\n<p>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Distribuiamo facilmente e senza sforzo applicazioni su Tarantool Cartridge (parte 1) | ProHoster","description":"Gi\u00e0 noi.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}