{"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\/pt\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J\u00e1 falamos sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, que permite desenvolver aplicativos distribu\u00eddos e empacot\u00e1-los. Agora, s\u00f3 falta uma coisa: aprender a implantar esses aplicativos e gerenci\u00e1-los. N\u00e3o se preocupe, n\u00f3s previmos tudo! Reunimos todas as melhores pr\u00e1ticas para trabalhar com Tarantool Cartridge e escrevemos <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">um papel ansible<\/a><\/noindex>, que ir\u00e1 distribuir o pacote nos servidores, iniciar as inst\u00e2ncias, agrup\u00e1-las em um cluster, configurar a autoriza\u00e7\u00e3o, inicializar vshard, ativar a recupera\u00e7\u00e3o autom\u00e1tica e atualizar a configura\u00e7\u00e3o do cluster.<\/p>\n<p><\/p>\n<p>Interessado? Ent\u00e3o, venha conosco, contaremos e mostraremos tudo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Come\u00e7aremos com um exemplo<\/h1>\n<p><\/p>\n<p>Vamos considerar apenas uma parte da funcionalidade do nosso papel. A descri\u00e7\u00e3o completa de todas as suas capacidades e par\u00e2metros de entrada est\u00e1 sempre dispon\u00edvel em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">documenta\u00e7\u00e3o<\/a><\/noindex>. Mas \u00e9 melhor experimentar uma vez do que ver cem vezes, ent\u00e3o vamos implantar um pequeno aplicativo.<\/p>\n<p><\/p>\n<p>O Tarantool Cartridge possui <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> para criar um pequeno aplicativo Cartridge que armazena informa\u00e7\u00f5es sobre clientes de um banco e suas contas, al\u00e9m de fornecer uma API para gerenciar dados via HTTP. Para isso, no aplicativo s\u00e3o descritas duas fun\u00e7\u00f5es poss\u00edveis: <code>api<\/code> e <code>storage<\/code>, que podem ser atribu\u00eddas \u00e0s inst\u00e2ncias.<\/p>\n<p><\/p>\n<p>O pr\u00f3prio Cartridge n\u00e3o diz nada sobre como iniciar processos, apenas fornece a capacidade de configurar inst\u00e2ncias j\u00e1 em execu\u00e7\u00e3o. O restante o usu\u00e1rio deve fazer por conta pr\u00f3pria: distribuir arquivos de configura\u00e7\u00e3o, iniciar servi\u00e7os e configurar a topologia. Mas n\u00e3o vamos nos preocupar com isso, o Ansible far\u00e1 isso por n\u00f3s.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">Vamos ao trabalho<\/h3>\n<p><\/p>\n<p>Vamos implantar nosso aplicativo em duas m\u00e1quinas virtuais e configurar uma topologia simples:<\/p>\n<p><\/p>\n<ul>\n<li>Replicaset <code>app-1<\/code> realizar\u00e1 o papel <code>api<\/code>, que inclui o papel <code>vshard-router<\/code>. Aqui haver\u00e1 apenas uma inst\u00e2ncia.<\/li>\n<li>O replicaset <code>storage-1<\/code> implementa o papel <code>storage<\/code> (e simultaneamente <code>vshard-storage<\/code>), aqui adicionaremos duas inst\u00e2ncias de m\u00e1quinas diferentes.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para executar o exemplo, precisaremos de <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> (vers\u00f5es 2.8 ou superiores).<\/p>\n<p><\/p>\n<p>O papel em si est\u00e1 em <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. \u00c9 um reposit\u00f3rio que permite compartilhar seus desenvolvimentos e usar pap\u00e9is prontos.<\/p>\n<p><\/p>\n<p>Vamos clonar o reposit\u00f3rio do exemplo:<\/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>Subindo as m\u00e1quinas virtuais:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Instalando o papel ansible do 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>Executando o papel instalado:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Aguardando a conclus\u00e3o da execu\u00e7\u00e3o do playbook, vamos para <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> e aproveitamos o resultado:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podemos enviar dados. Legal, n\u00e9?<\/p>\n<p><\/p>\n<p>Agora vamos entender como trabalhar com isso e, ao mesmo tempo, adicionar mais um replicaset \u00e0 topologia.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Vamos come\u00e7ar a entender<\/h3>\n<p><\/p>\n<p>Ent\u00e3o, o que aconteceu?<\/p>\n<p><\/p>\n<p>Subimos duas m\u00e1quinas virtuais e executamos um playbook do Ansible que configurou nosso cluster. Vamos dar uma olhada no conte\u00fado do arquivo <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>Nada interessante acontece aqui, estamos executando uma role do Ansible chamada <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Tudo que \u00e9 importante (ou seja, a configura\u00e7\u00e3o do cluster) est\u00e1 no <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">inventory<\/a><\/noindex>-arquivo <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    # GRUPAR INST\u00c2NCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        # op\u00e7\u00f5es de conex\u00e3o da primeira m\u00e1quina\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n\n      hosts:  # inst\u00e2ncias a serem iniciadas na primeira m\u00e1quina\n        storage-1:\n\n    host2:\n      vars:\n        # op\u00e7\u00f5es de conex\u00e3o da segunda m\u00e1quina\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n\n      hosts:  # inst\u00e2ncias a serem iniciadas na segunda m\u00e1quina\n        app-1:\n        storage-1-replica:\n\n    # GRUPAR INST\u00c2NCIAS POR REPLICA SETS\n    replicaset_app_1:\n      vars:  # configura\u00e7\u00e3o do replicaset\n        replicaset_alias: app-1\n        failover_priority:\n          - app-1  # l\u00edder\n        roles:\n          - 'api'\n\n      hosts:  # inst\u00e2ncias do replicaset\n        app-1:\n\n    replicaset_storage_1:\n      vars:  # configura\u00e7\u00e3o do replicaset\n        replicaset_alias: storage-1\n        weight: 3\n        failover_priority:\n          - storage-1  # l\u00edder\n          - storage-1-replica\n        roles:\n          - 'storage'\n\n      hosts:   # inst\u00e2ncias do replicaset\n        storage-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Tudo que precisamos \u00e9 aprender a gerenciar inst\u00e2ncias e replicaset, alterando o conte\u00fado deste arquivo. A seguir, vamos adicionar novas se\u00e7\u00f5es a ele. Para n\u00e3o se perder, voc\u00ea pode dar uma olhada na vers\u00e3o final deste arquivo, <code>hosts.updated.yml<\/code>, que est\u00e1 no reposit\u00f3rio de exemplo.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Gerenciamento de inst\u00e2ncias<\/h3>\n<p><\/p>\n<p>Em termos do Ansible, cada inst\u00e2ncia \u00e9 um host (n\u00e3o confundir com um servidor f\u00edsico), ou seja, um n\u00f3 de infraestrutura que o Ansible ir\u00e1 gerenciar. Para cada host, podemos especificar os par\u00e2metros de conex\u00e3o (como <code>ansible_host<\/code> e <code>ansible_user<\/code>), e tamb\u00e9m a configura\u00e7\u00e3o da inst\u00e2ncia. A descri\u00e7\u00e3o das inst\u00e2ncias est\u00e1 na se\u00e7\u00e3o <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Vamos considerar a configura\u00e7\u00e3o da inst\u00e2ncia <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n\n  # INST\u00c2NCIAS\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>Na vari\u00e1vel <code>config<\/code> especificamos os par\u00e2metros da inst\u00e2ncia \u2014 <code>URI de an\u00fancio<\/code> e <code>Porta HTTP<\/code>.<br \/>\nAbaixo est\u00e3o os par\u00e2metros das inst\u00e2ncias <code>app-1<\/code> e <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Precisamos informar ao Ansible os par\u00e2metros de conex\u00e3o para cada inst\u00e2ncia. Faz sentido agrupar as inst\u00e2ncias em grupos de m\u00e1quinas virtuais. Para isso, as inst\u00e2ncias foram unidas em grupos <code>host1<\/code> e <code>host2<\/code>, e em cada grupo na se\u00e7\u00e3o <code>vars<\/code> est\u00e3o especificados os valores <code>ansible_host<\/code> e <code>ansible_user<\/code> para uma m\u00e1quina virtual. E na se\u00e7\u00e3o <code>hosts<\/code> \u2014 hosts (que s\u00e3o as inst\u00e2ncias) que pertencem a este grupo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n  hosts:\n    ...\n  crian\u00e7as:\n    # AGRUPAR INST\u00c2NCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        # op\u00e7\u00f5es de conex\u00e3o da primeira m\u00e1quina\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # inst\u00e2ncias a serem iniciadas na primeira m\u00e1quina\n        storage-1:\n\n     host2:\n      vars:\n        # op\u00e7\u00f5es de conex\u00e3o da segunda m\u00e1quina\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # inst\u00e2ncias a serem iniciadas na segunda m\u00e1quina\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Come\u00e7amos a modificar <code>hosts.yml<\/code>. Vamos adicionar mais duas inst\u00e2ncias, <code>storage-2-replica<\/code> na primeira m\u00e1quina virtual e <code>storage-2<\/code> na segunda:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n\n  # INST\u00c2NCIAS\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  crian\u00e7as:\n    # AGRUPAR INST\u00c2NCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        ...\n      hosts:  # inst\u00e2ncias a serem iniciadas na primeira m\u00e1quina\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # inst\u00e2ncias a serem iniciadas na segunda m\u00e1quina\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Executamos o playbook do 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>Observe a op\u00e7\u00e3o <code>--limit<\/code>. Como cada inst\u00e2ncia do cluster \u00e9 um host em termos do Ansible, podemos especificar claramente quais inst\u00e2ncias devem ser configuradas ao executar o playbook.<\/p>\n<p><\/p>\n<p>Novamente, acesse a interface Web <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> e veja nossas novas inst\u00e2ncias:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e3o vamos parar por aqui e vamos dominar o gerenciamento da topologia.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Gerenciamento de topologia<\/h3>\n<p><\/p>\n<p>Vamos agrupar nossas novas inst\u00e2ncias em um conjunto de r\u00e9plicas <code>storage-2<\/code>. Vamos adicionar um novo grupo <code>replicaset_storage_2<\/code> e descrever em suas vari\u00e1veis os par\u00e2metros do conjunto de r\u00e9plicas, assim como em <code>replicaset_storage_1<\/code>. Na se\u00e7\u00e3o <code>hosts<\/code> especificaremos quais inst\u00e2ncias far\u00e3o parte deste grupo (ou seja, nosso conjunto de r\u00e9plicas):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    ...\n    # AGRUPAR INST\u00c2NCIAS POR CONJUNTOS DE REPLICA\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # configura\u00e7\u00e3o do conjunto de replica\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:   # inst\u00e2ncias do conjunto de replica\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Iniciamos novamente o 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>No par\u00e2metro <code>--limit<\/code> desta vez passamos o nome do grupo que corresponde ao nosso conjunto de replica.<\/p>\n<p><\/p>\n<p>Vamos considerar a op\u00e7\u00e3o <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Nossa fun\u00e7\u00e3o executa diferentes tarefas em sequ\u00eancia, que est\u00e3o marcadas com as seguintes tags:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: gerenciamento de inst\u00e2ncias (configura\u00e7\u00e3o, conex\u00e3o ao membership);<\/li>\n<li><code>cartridge-replicasets<\/code>: gerenciamento de topologia (gerenciamento de conjuntos de replica e remo\u00e7\u00e3o n\u00e3o revers\u00edvel (expel) de inst\u00e2ncias do cluster);<\/li>\n<li><code>cartridge-config<\/code>: gerenciamento de outros par\u00e2metros do cluster (vshard bootstrapping, modo de failover autom\u00e1tico, par\u00e2metros de autoriza\u00e7\u00e3o e configura\u00e7\u00e3o do aplicativo).<\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos especificar claramente qual parte do trabalho queremos realizar, e ent\u00e3o a fun\u00e7\u00e3o ignorar\u00e1 a execu\u00e7\u00e3o das demais tarefas. No nosso caso, queremos trabalhar apenas com a topologia, por isso especificamos <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Vamos avaliar o resultado dos nossos esfor\u00e7os. Encontramos um novo conjunto de replica em <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=\"Implantando aplicativos no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1)\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uhul!<\/p>\n<p><\/p>\n<p>Experimente alterar a configura\u00e7\u00e3o das inst\u00e2ncias e dos conjuntos de replica e veja como a topologia do cluster muda. Voc\u00ea pode testar diferentes cen\u00e1rios operacionais, como <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">atualiza\u00e7\u00e3o gradual<\/a><\/noindex> ou aumento de <code>memtx_memory<\/code>. A fun\u00e7\u00e3o tentar\u00e1 fazer isso sem reiniciar a inst\u00e2ncia, para minimizar o poss\u00edvel tempo de inatividade do seu aplicativo.<\/p>\n<p><\/p>\n<p>N\u00e3o se esque\u00e7a de executar <code>vagrant halt<\/code>, para parar as m\u00e1quinas virtuais quando terminar de trabalhar com elas.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">E o que acontece por tr\u00e1s das cenas?<\/h1>\n<p><\/p>\n<p>Aqui eu explicarei em mais detalhes o que aconteceu sob o cap\u00f4 da fun\u00e7\u00e3o ansible durante nossos experimentos.<\/p>\n<p><\/p>\n<p>Consideremos passo a passo a implanta\u00e7\u00e3o do aplicativo Cartridge.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Instala\u00e7\u00e3o do pacote e in\u00edcio das inst\u00e2ncias<\/h3>\n<p><\/p>\n<p>Primeiro, \u00e9 necess\u00e1rio levar o pacote para o servidor e instal\u00e1-lo. Atualmente, a fun\u00e7\u00e3o consegue trabalhar com pacotes RPM e DEB.<\/p>\n<p><\/p>\n<p>Em seguida, iniciamos as inst\u00e2ncias. Aqui \u00e9 muito simples: cada inst\u00e2ncia \u00e9 um servi\u00e7o separado. Vou explicar com um exemplo: <code>systemd<\/code>$ systemctl start myapp@storage-1<\/p>\n<p><\/p>\n<pre><code class=\"bash\">Este comando iniciar\u00e1 a inst\u00e2ncia<\/code><\/pre>\n<p><\/p>\n<p>. A inst\u00e2ncia iniciada procurar\u00e1 seu <code>storage-1<\/code> da aplica\u00e7\u00e3o <code>myapp<\/code>. Os logs da inst\u00e2ncia podem ser visualizados com <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">configura\u00e7\u00e3o<\/a><\/noindex> em <code>\/etc\/tarantool\/conf.d\/<\/code>O arquivo de unidade <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>para o servi\u00e7o systemd ser\u00e1 entregue junto com o pacote. <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> para o servi\u00e7o systemd ser\u00e1 entregue juntamente com o pacote.<\/p>\n<p><\/p>\n<p>O Ansible possui m\u00f3dulos integrados para instala\u00e7\u00e3o de pacotes e gerenciamento de servi\u00e7os systemd, aqui n\u00e3o estamos inventando nada novo.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Configura\u00e7\u00e3o da topologia do cluster<\/h3>\n<p><\/p>\n<p>E aqui come\u00e7a a parte mais interessante. Concorda que seria estranho se preocupar com um papel ansible especial para instalar pacotes e iniciar <code>systemd<\/code>-servi\u00e7os.<\/p>\n<p><\/p>\n<p>\u00c9 poss\u00edvel configurar o cluster manualmente:<\/p>\n<p><\/p>\n<ul>\n<li>Primeira op\u00e7\u00e3o: abrimos a interface Web e clicamos nos bot\u00f5es. Para iniciar alguns instantes pontualmente, isso serve muito bem.<\/li>\n<li>Segunda op\u00e7\u00e3o: podemos usar a API GraphQl. Aqui j\u00e1 \u00e9 poss\u00edvel automatizar algo, por exemplo, escrever um script em Python.<\/li>\n<li>Terceira op\u00e7\u00e3o (para os fortes de esp\u00edrito): acessamos o servidor, conectamo-nos a um dos instantes usando <code>tarantoolctl connect<\/code> e fazemos todas as manipula\u00e7\u00f5es necess\u00e1rias com o m\u00f3dulo Lua <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>A principal tarefa da nossa inven\u00e7\u00e3o \u00e9 fazer por voc\u00ea exatamente essa parte, a mais dif\u00edcil do trabalho.<\/p>\n<p><\/p>\n<p>O Ansible permite que voc\u00ea escreva seu pr\u00f3prio m\u00f3dulo e o utilize em um papel. Nosso papel usa esses m\u00f3dulos para gerenciar v\u00e1rios componentes do cluster.<\/p>\n<p><\/p>\n<p>Como isso funciona? Voc\u00ea descreve o estado desejado do cluster em uma configura\u00e7\u00e3o declarativa, e o papel fornece a cada m\u00f3dulo sua se\u00e7\u00e3o de configura\u00e7\u00e3o. O m\u00f3dulo obt\u00e9m o estado atual do cluster e o compara com o que foi enviado. Em seguida, atrav\u00e9s do soquete de um dos instantes, o c\u00f3digo \u00e9 iniciado para levar o cluster ao estado necess\u00e1rio.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Resultados<\/h1>\n<p><\/p>\n<p>Hoje n\u00f3s explicamos e mostramos como implantar seu aplicativo no Tarantool Cartridge e configurar uma topologia simples. Para isso, usamos o Ansible \u2014 uma ferramenta poderosa que se destaca pela simplicidade de uso e permite configurar simultaneamente m\u00faltiplos n\u00f3s na infraestrutura (neste caso, os instantes do cluster).<\/p>\n<p><\/p>\n<p>Acima, entendemos um dos muitos modos de descrever a configura\u00e7\u00e3o do cluster usando o Ansible. Assim que voc\u00ea sentir que est\u00e1 pronto para avan\u00e7ar, estude <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">as melhores pr\u00e1ticas<\/a><\/noindex> para escrever playbooks. Talvez seja mais conveniente gerenciar a topologia atrav\u00e9s de <code>group_vars<\/code> e <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Em breve, vamos explicar como remover de forma irrevers\u00edvel (expel) instantes da topologia, iniciar o vshard, gerenciar o modo de failover autom\u00e1tico, configurar a autoriza\u00e7\u00e3o e corrigir a configura\u00e7\u00e3o do cluster. Mas, por enquanto, voc\u00ea pode estudar por conta pr\u00f3pria. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">documenta\u00e7\u00e3o<\/a><\/noindex> e experimentar com as configura\u00e7\u00f5es do cluster.<\/p>\n<p><\/p>\n<p>Se algo n\u00e3o estiver funcionando, por favor <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">nos avise<\/a><\/noindex> sobre o problema. Resolveremos tudo 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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Implantamos aplica\u00e7\u00f5es no Tarantool Cartridge de forma f\u00e1cil e descontra\u00edda (parte 1) | ProHoster","description":"J\u00e1 estamos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}