{"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\/es\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","title":{"rendered":"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).\" src=\"\/wp-content\/uploads\/2019\/12\/0493b6c8d60253352bc971b216e9b63e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ya hemos hablado sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/465503\/\">Tarantool Cartridge<\/a><\/noindex>, que permite desarrollar aplicaciones distribuidas y empaquetarlas. Solo queda una cosa: aprender a desplegar estas aplicaciones y administrarlas. \u00a1No se preocupen, hemos pensado en todo! Hemos reunido todas las mejores pr\u00e1cticas para trabajar con Tarantool Cartridge y hemos escrito <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/tarantool\/cartridge\">un rol de ansible<\/a><\/noindex>, que desplegar\u00e1 el paquete en los servidores, iniciar\u00e1 las instancias, las unir\u00e1 en un cl\u00faster, configurar\u00e1 la autorizaci\u00f3n, will bootstrap vshard, habilitar\u00e1 el failover autom\u00e1tico y parchear\u00e1 la configuraci\u00f3n del cl\u00faster.<\/p>\n<p><\/p>\n<p>\u00bfInteresado? Entonces por favor, sigue leyendo, te contaremos y mostraremos todo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"nachnem-s-primera\">Comencemos con un ejemplo<\/h1>\n<p><\/p>\n<p>Solo veremos una parte de la funcionalidad de nuestro rol. Puedes encontrar la descripci\u00f3n completa de todas sus capacidades y par\u00e1metros de entrada en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">la documentaci\u00f3n<\/a><\/noindex>. Pero es mejor probar una vez que ver cien, as\u00ed que vamos a desplegar una peque\u00f1a aplicaci\u00f3n.<\/p>\n<p><\/p>\n<p>Tarantool Cartridge ofrece <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> la creaci\u00f3n de una peque\u00f1a aplicaci\u00f3n Cartridge que almacena informaci\u00f3n sobre los clientes del banco y sus cuentas, y tambi\u00e9n proporciona una API para gestionar datos a trav\u00e9s de HTTP. Para ello, el aplicativo describe dos roles posibles: <code>api<\/code> y <code>almacenamiento<\/code>, que pueden ser asignados a las instancias.<\/p>\n<p><\/p>\n<p>Cartridge no indica c\u00f3mo ejecutar procesos, solo proporciona la posibilidad de configurar las instancias ya iniciadas. El resto, el usuario tiene que hacerlo por s\u00ed mismo: desplegar archivos de configuraci\u00f3n, iniciar servicios y configurar la topolog\u00eda. Pero no haremos nada de esto, lo har\u00e1 Ansible por nosotros.<\/p>\n<p><\/p>\n<h3 id=\"ot-slov-k-delu\">De la palabra a la acci\u00f3n<\/h3>\n<p><\/p>\n<p>As\u00ed que desplegaremos nuestra aplicaci\u00f3n en dos m\u00e1quinas virtuales y configuraremos una topolog\u00eda simple:<\/p>\n<p><\/p>\n<ul>\n<li>El replicaset <code>app-1<\/code> implementar\u00e1 el rol <code>api<\/code>, que incluye el rol <code>vshard-router<\/code>. Aqu\u00ed solo habr\u00e1 una instancia.<\/li>\n<li>El replicaset <code>storage-1<\/code> implementa el rol <code>almacenamiento<\/code> (y al mismo tiempo <code>vshard-storage<\/code>), aqu\u00ed a\u00f1adiremos dos instancias desde diferentes m\u00e1quinas.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).\" src=\"\/wp-content\/uploads\/2019\/12\/62d20050e2d7a6358002ecd758222f1f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para ejecutar el ejemplo necesitaremos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ansible.com\">Ansible<\/a><\/noindex> (versi\u00f3n 2.8 o superior).<\/p>\n<p><\/p>\n<p>El rol mismo se encuentra en <noindex><a rel=\"nofollow\" href=\"https:\/\/galaxy.ansible.com\/docs\/\">Ansible Galaxy<\/a><\/noindex>. Este es un repositorio que permite compartir tus desarrollos y usar roles listos.<\/p>\n<p><\/p>\n<p>Clonemos el repositorio del ejemplo:<\/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>Levantamos las m\u00e1quinas virtuales:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ vagrant up<\/code><\/pre>\n<p><\/p>\n<p>Instalamos el rol de ansible de 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>Ejecutamos el rol instalado:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ ansible-playbook -i hosts.yml playbook.yml<\/code><\/pre>\n<p><\/p>\n<p>Esperamos a que termine la ejecuci\u00f3n del playbook, y pasamos a <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> y disfrutamos del resultado:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).\" src=\"\/wp-content\/uploads\/2019\/12\/6563ddf2f2bfc85714f327c8d6b2d1c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se pueden enviar datos. Genial, \u00bfverdad?<\/p>\n<p><\/p>\n<p>Ahora vamos a ver c\u00f3mo trabajar con esto, y tambi\u00e9n a\u00f1adiremos otro conjunto de r\u00e9plicas a la topolog\u00eda.<\/p>\n<p><\/p>\n<h3 id=\"nachinaem-razbiratsya\">Empezamos a investigar<\/h3>\n<p><\/p>\n<p>Entonces, \u00bfqu\u00e9 ha pasado?<\/p>\n<p><\/p>\n<p>Levantamos dos m\u00e1quinas virtuales y ejecutamos un playbook de ansible que configur\u00f3 nuestro cl\u00faster. Veamos el contenido del archivo <code>y probar a ejecutarlo:<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\n- name: Desplegar mi aplicaci\u00f3n Tarantool Cartridge\n  hosts: all\n  become: true\n  become_user: root\n  tasks:\n  - name: Importar el rol de Tarantool Cartridge\n    import_role:\n      name: tarantool.cartridge<\/code><\/pre>\n<p><\/p>\n<p>Aqu\u00ed no pasa nada interesante, solo ejecutamos el rol de ansible llamado <code>tarantool.cartridge<\/code>.<\/p>\n<p><\/p>\n<p>Lo m\u00e1s importante (es decir, la configuraci\u00f3n del cl\u00faster) se encuentra en <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/intro_inventory.html\">Podemos intentar ejecutar ansible con el archivo de inventario:<\/a><\/noindex>-el archivo <code>hosts.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">---\nall:\n  vars:\n    # variables comunes del cl\u00faster\n    cartridge_app_name: getting-started-app\n    cartridge_package_path: .\\\/getting-started-app-1.0.0-0.rpm  # ruta al paquete\n\n    cartridge_cluster_cookie: app-default-cookie  # cookie del cl\u00faster\n\n    # opciones comunes de ssh\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  # INSTANCIAS\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    # AGRUPAR INSTANCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        # opciones de conexi\u00f3n para la primera m\u00e1quina\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n\n      hosts:  # instancias que se iniciar\u00e1n en la primera m\u00e1quina\n        storage-1:\n\n    host2:\n      vars:\n        # opciones de conexi\u00f3n para la segunda m\u00e1quina\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n\n      hosts:  # instancias que se iniciar\u00e1n en la segunda m\u00e1quina\n        app-1:\n        storage-1-replica:\n\n    # AGRUPAR INSTANCIAS POR CONJUNTOS DE R\u00c9PLICAS\n    replicaset_app_1:\n      vars:  # configuraci\u00f3n del conjunto de r\u00e9plicas\n        replicaset_alias: app-1\n        failover_priority:\n          - app-1  # l\u00edder\n        roles:\n          - 'api'\n\n      hosts:  # instancias del conjunto de r\u00e9plicas\n        app-1:\n\n    replicaset_storage_1:\n      vars:  # configuraci\u00f3n del conjunto de r\u00e9plicas\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:   # instancias del conjunto de r\u00e9plicas\n        storage-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Todo lo que necesitamos es aprender a gestionar las instancias y los conjuntos de r\u00e9plicas, modificando el contenido de este archivo. M\u00e1s adelante, iremos a\u00f1adiendo nuevas secciones. Para no confundirse sobre d\u00f3nde a\u00f1adirlas, pueden consultar la versi\u00f3n final de este archivo, <code>hosts.updated.yml<\/code>, que se encuentra en el repositorio de ejemplos.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-instansami\">Gesti\u00f3n de instancias<\/h3>\n<p><\/p>\n<p>En t\u00e9rminos de Ansible, cada instancia es un host (no confundir con un servidor f\u00edsico), es decir, un nodo de infraestructura que Ansible gestionar\u00e1. Para cada host, podemos especificar par\u00e1metros de conexi\u00f3n (como <code>ansible_host<\/code> y <code>ansible_user<\/code>), as\u00ed como la configuraci\u00f3n de la instancia. La descripci\u00f3n de las instancias se encuentra en la secci\u00f3n <code>hosts<\/code>.<\/p>\n<p><\/p>\n<p>Consideremos la configuraci\u00f3n de la instancia <code>storage-1<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n\n  # INSTANCIAS\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>En la variable <code>config<\/code> hemos especificado los par\u00e1metros de la instancia \u2014 <code>URI de anuncio<\/code> y <code>Puerto HTTP<\/code>.<br \/>\nA continuaci\u00f3n se presentan los par\u00e1metros de las instancias <code>app-1<\/code> y <code>storage-1-replica<\/code>.<\/p>\n<p><\/p>\n<p>Necesitamos informar a Ansible los par\u00e1metros de conexi\u00f3n para cada instancia. Parece l\u00f3gico agrupar las instancias por m\u00e1quinas virtuales. Para ello, las instancias se agrupan en grupos <code>host1<\/code> y <code>host2<\/code>, y en cada grupo en la secci\u00f3n <code>vars<\/code> se indican los valores <code>ansible_host<\/code> y <code>ansible_user<\/code> para una sola m\u00e1quina virtual. Y en la secci\u00f3n <code>hosts<\/code> \u2014 hosts (tambi\u00e9n conocidos como instancias), que pertenecen a este grupo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n  hosts:\n    ...\n  children:\n    # AGRUPAR INSTANCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        # opciones de conexi\u00f3n de la primera m\u00e1quina\n        ansible_host: 172.19.0.2\n        ansible_user: vagrant\n       hosts:  # instancias a iniciarse en la primera m\u00e1quina\n        storage-1:\n\n     host2:\n      vars:\n        # opciones de conexi\u00f3n de la segunda m\u00e1quina\n        ansible_host: 172.19.0.3\n        ansible_user: vagrant\n       hosts:  # instancias a iniciarse en la segunda m\u00e1quina\n        app-1:\n        storage-1-replica:<\/code><\/pre>\n<p><\/p>\n<p>Comenzamos a modificar <code>hosts.yml<\/code>. Agregaremos otras dos instancias, <code>storage-2-replica<\/code> en la primera m\u00e1quina virtual y <code>storage-2<\/code> en la segunda:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">todos:\n  vars:\n    ...\n\n  # INSTANCIAS\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    # AGRUPAR INSTANCIAS POR M\u00c1QUINAS\n    host1:\n      vars:\n        ...\n      hosts:  # instancias a iniciarse en la primera m\u00e1quina\n        storage-1:\n        storage-2-replica:  # &lt;==\n\n    host2:\n      vars:\n        ...\n      hosts:  # instancias a iniciarse en la segunda m\u00e1quina\n        app-1:\n        storage-1-replica:\n        storage-2:  # &lt;==\n  ...<\/code><\/pre>\n<p><\/p>\n<p>Ejecutamos el playbook de 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>Tenga en cuenta la opci\u00f3n <code>--limit<\/code>. Dado que cada instancia del cl\u00faster es un host en t\u00e9rminos de Ansible, podemos especificar expl\u00edcitamente qu\u00e9 instancias deben configurarse al ejecutar el playbook.<\/p>\n<p><\/p>\n<p>Nuevamente accedemos a la interfaz web <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:8181\/admin\/cluster\/dashboard\">http:\/\/localhost:8181\/admin\/cluster\/dashboard<\/a><\/noindex> y observamos nuestras nuevas instancias:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).\" src=\"\/wp-content\/uploads\/2019\/12\/6181c359e4e5ec4adaee8737600a27e4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No nos detendremos aqu\u00ed y dominaremos la gesti\u00f3n de la topolog\u00eda.<\/p>\n<p><\/p>\n<h3 id=\"upravlenie-topologiey\">Gesti\u00f3n de la topolog\u00eda<\/h3>\n<p><\/p>\n<p>Uniremos nuestras nuevas instancias en un conjunto de r\u00e9plicas <code>storage-2<\/code>. Agregaremos un nuevo grupo <code>replicaset_storage_2<\/code> y describiremos en sus variables los par\u00e1metros del conjunto de r\u00e9plicas de manera similar a <code>replicaset_storage_1<\/code>. En la secci\u00f3n <code>hosts<\/code> especificaremos qu\u00e9 instancias formar\u00e1n parte de este grupo (es decir, nuestro 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 INSTANCIAS POR CONJUNTOS DE REPLICAS\n    ...\n    replicaset_storage_2:  # &lt;==\n      vars:  # configuraci\u00f3n del conjunto de replicas\n        replicaset_alias: storage-2\n        weight: 2\n        failover_priority:\n          - storage-2\n          - storage-2-replica\n        roles:\n          - &#039;storage&#039;\n\n      hosts:   # instancias del conjunto de replicas\n        storage-2:\n        storage-2-replica:<\/code><\/pre>\n<p><\/p>\n<p>Reiniciamos el 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>En el par\u00e1metro <code>--limit<\/code> esta vez hemos pasado el nombre del grupo que corresponde a nuestro conjunto de replicas.<\/p>\n<p><\/p>\n<p>Veamos la opci\u00f3n <code>tags<\/code>.<\/p>\n<p><\/p>\n<p>Nuestro rol ejecuta de manera secuencial varias tareas que est\u00e1n marcadas con las siguientes etiquetas:<\/p>\n<p><\/p>\n<ul>\n<li><code>cartridge-instances<\/code>: gesti\u00f3n de instancias (configuraci\u00f3n, conexi\u00f3n a membership);<\/li>\n<li><code>cartridge-replicasets<\/code>: gesti\u00f3n de la topolog\u00eda (gesti\u00f3n de conjuntos de replicas y expulsi\u00f3n irreversible de instancias del cl\u00faster);<\/li>\n<li><code>cartridge-config<\/code>: gesti\u00f3n de otros par\u00e1metros del cl\u00faster (vshard bootstrapping, modo de failover autom\u00e1tico, par\u00e1metros de autorizaci\u00f3n y configuraci\u00f3n de la aplicaci\u00f3n).<\/li>\n<\/ul>\n<p><\/p>\n<p>Podemos especificar expl\u00edcitamente qu\u00e9 parte del trabajo queremos realizar, entonces el rol omitir\u00e1 el resto de las tareas. En nuestro caso, queremos trabajar solo con la topolog\u00eda, por lo que hemos indicado <code>cartridge-replicasets<\/code>.<\/p>\n<p><\/p>\n<p>Evaluemos el resultado de nuestros esfuerzos. Encontramos un nuevo conjunto de replicas en <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=\"Desplegamos aplicaciones en Tarantool Cartridge de forma f\u00e1cil y sencilla (parte 1).\" src=\"\/wp-content\/uploads\/2019\/12\/20da99480df519b1ee239cd81f67b786.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00a1Hurra!<\/p>\n<p><\/p>\n<p>Experimente con cambios en la configuraci\u00f3n de instancias y conjuntos de replicas y observe c\u00f3mo cambia la topolog\u00eda del cl\u00faster. Puede probar diferentes escenarios operativos, como <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_delegation.html#rolling-update-batch-size\">actualizaci\u00f3n gradual<\/a><\/noindex> o aumento de <code>memtx_memory<\/code>. El rol intentar\u00e1 realizar esto sin reiniciar la instancia para reducir el posible tiempo de inactividad de su aplicaci\u00f3n.<\/p>\n<p><\/p>\n<p>No olvide ejecutar <code>vagrant halt<\/code>, para detener las m\u00e1quinas virtuales cuando termine de trabajar con ellas.<\/p>\n<p><\/p>\n<h1 id=\"a-chto-pod-kapotom\">\u00bfY qu\u00e9 hay bajo el cap\u00f3?<\/h1>\n<p><\/p>\n<p>Aqu\u00ed explicar\u00e9 en detalle lo que sucedi\u00f3 bajo el cap\u00f3 del rol de ansible durante nuestros experimentos.<\/p>\n<p><\/p>\n<p>Veamos paso a paso el despliegue de la aplicaci\u00f3n Cartridge.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-paketa-i-start-instansov\">Instalaci\u00f3n del paquete y arranque de instancias<\/h3>\n<p><\/p>\n<p>Primero, se debe entregar el paquete al servidor e instalarlo. Ahora el rol puede trabajar con paquetes RPM y DEB.<\/p>\n<p><\/p>\n<p>Luego, arrancamos las instancias. Aqu\u00ed todo es muy simple: cada instancia es un servicio separado. Lo explico con un ejemplo: <code>systemd<\/code>$ systemctl start myapp@storage-1<\/p>\n<p><\/p>\n<pre><code class=\"bash\">Este comando arrancar\u00e1 la instancia.<\/code><\/pre>\n<p><\/p>\n<p>La instancia arrancada buscar\u00e1 su <code>storage-1<\/code> aplicaci\u00f3n <code>myapp<\/code>configuraci\u00f3n. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.tarantool.io\/ru\/doc\/2.2\/book\/cartridge\/cartridge_dev\/#configuring-instances\">Los registros de la instancia se pueden ver mediante<\/a><\/noindex> en <code>\/etc\/tarantool\/conf.d\/<\/code>El archivo Unit <code>journald<\/code>.<\/p>\n<p><\/p>\n<p>para el servicio systemd se entregar\u00e1 junto con el paquete. <code>\/etc\/systemd\/system\/myapp@.sevice<\/code> para el servicio systemd se entregar\u00e1 junto con el paquete.<\/p>\n<p><\/p>\n<p>En Ansible hay m\u00f3dulos integrados para la instalaci\u00f3n de paquetes y la gesti\u00f3n de servicios systemd, aqu\u00ed no hemos inventado nada nuevo.<\/p>\n<p><\/p>\n<h3 id=\"nastroyka-topologii-klastera\">Configuraci\u00f3n de la topolog\u00eda del cl\u00faster<\/h3>\n<p><\/p>\n<p>Y aqu\u00ed es donde comienza lo m\u00e1s interesante. Admit\u00e1moslo, ser\u00eda extra\u00f1o complicarse con un rol especial de Ansible para la instalaci\u00f3n de paquetes y el inicio <code>systemd<\/code>-de servicios.<\/p>\n<p><\/p>\n<p>Se puede configurar el cl\u00faster manualmente:<\/p>\n<p><\/p>\n<ul>\n<li>Primera opci\u00f3n: abrimos la interfaz web y presionamos los botones. Para iniciar varios instancias una vez, es bastante adecuado.<\/li>\n<li>Segunda opci\u00f3n: se puede utilizar la API de GraphQL. Aqu\u00ed ya se puede automatizar algo, por ejemplo, escribir un script en Python.<\/li>\n<li>Tercera opci\u00f3n (para los valientes): entramos en el servidor, nos conectamos a una de las instancias usando <code>tarantoolctl connect<\/code> y realizamos todas las manipulaciones necesarias con el m\u00f3dulo Lua <code>cartridge<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<p>La tarea principal de nuestra invenci\u00f3n es hacer precisamente esta parte del trabajo, la m\u00e1s complicada, por ustedes.<\/p>\n<p><\/p>\n<p>Ansible permite escribir su propio m\u00f3dulo y usarlo en un rol. Nuestro rol utiliza estos m\u00f3dulos para gestionar varios componentes del cl\u00faster.<\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo funciona? Describen el estado deseado del cl\u00faster en una configuraci\u00f3n declarativa, y el rol provee a cada m\u00f3dulo su secci\u00f3n de configuraci\u00f3n. El m\u00f3dulo obtiene el estado actual del cl\u00faster y lo compara con lo que recibi\u00f3 como entrada. A continuaci\u00f3n, a trav\u00e9s del socket de una de las instancias, se ejecuta el c\u00f3digo que lleva el cl\u00faster al estado deseado.<\/p>\n<p><\/p>\n<h1 id=\"itogi\">Resultados<\/h1>\n<p><\/p>\n<p>Hoy les mostramos c\u00f3mo desplegar su aplicaci\u00f3n en Tarantool Cartridge y configurar una topolog\u00eda simple. Para ello usamos Ansible, una herramienta potente que se caracteriza por su facilidad de uso y permite configurar m\u00faltiples nodos de infraestructura simult\u00e1neamente (en nuestro caso, son instancias del cl\u00faster).<\/p>\n<p><\/p>\n<p>Arriba hemos explorado una de las muchas formas de describir la configuraci\u00f3n del cl\u00faster utilizando Ansible. Una vez que comprendan que est\u00e1n listos para avanzar, estudien <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html\">mejores pr\u00e1cticas<\/a><\/noindex> para escribir playbooks. Puede que les resulte m\u00e1s c\u00f3modo gestionar la topolog\u00eda usando <code>group_vars<\/code> y <code>host_vars<\/code>.<\/p>\n<p><\/p>\n<p>Pronto les contaremos c\u00f3mo eliminar de manera irreversible (expel) instancias de la topolog\u00eda, bootstrap vshard, gestionar el modo de failover autom\u00e1tico, configurar la autorizaci\u00f3n y parchear la configuraci\u00f3n del cl\u00faster. Mientras tanto, pueden seguir investigando por su cuenta. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge#ansible-role-tarantool-cartridge\">la documentaci\u00f3n<\/a><\/noindex> y experimentar con el cambio de los par\u00e1metros del cl\u00faster.<\/p>\n<p><\/p>\n<p>Si algo no funciona, aseg\u00farate de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/ansible-cartridge\/issues\/new\">informarnos<\/a><\/noindex> sobre el problema. \u00a1Lo resolveremos r\u00e1pidamente!<\/p>\n<p>Fuente: <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.2 - 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\/es\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Desplegamos aplicaciones en Tarantool Cartridge de manera f\u00e1cil y sin complicaciones (parte 1) | ProHoster","description":"Ya lo hemos hecho.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/legko-i-neprinuzhdenno-deploim-prilozheniya-na-tarantool-cartridge-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/53611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=53611"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/53611\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=53611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=53611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=53611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}