
Já apresentamos o 
Tarantool Cartridge que permite desenvolver e compactar aplicativos distribuídos. Agora vamos aprender como implantar e controlar esses aplicativos. Sem pânico, está tudo sob controle! Reunimos todas as melhores práticas de trabalho com o Tarantool Cartridge e escrevemos uma 
função Ansible , que implantará o pacote nos servidores, iniciará e ingressará instâncias em conjuntos de réplicas, configurará a autorização, iniciará o bootstrap vshard, habilitará a configuração automática de failover e cluster de patches.
Interessante, hein? Mergulhe, verifique os detalhes sob o corte.
Começando com uma amostra
Vamos orientá-lo através de apenas algumas das funções da função. Você sempre pode encontrar uma descrição completa de todos os seus recursos e parâmetros de entrada na 
documentação . No entanto, tentar uma vez é melhor do que vê-lo centenas de vezes, então vamos implantar um aplicativo pequeno.
O Tarantool Cartridge tem um 
tutorial para criar um pequeno aplicativo de cartucho que armazena informações sobre clientes bancários e suas contas, além de fornecer uma API para gerenciamento de dados via HTTP. Para esse fim, o aplicativo descreve duas funções possíveis que podem ser atribuídas às instâncias: 
api e 
storage .
O cartucho em si não diz nada sobre como iniciar processos - apenas fornece uma oportunidade para configurar as instâncias em execução. Portanto, o restante depende do usuário: distribuir arquivos de configuração, executar serviços e configurar topologia. Mas não vamos fazer tudo isso - o Ansible fará isso por nós.
Começando à ação
Primeiro, vamos implantar nosso aplicativo em duas máquinas virtuais e configurar uma topologia simples:
- O conjunto de réplicas app-1representará a função daapique contém a funçãovshard-router. Haverá apenas uma instância.
- O conjunto de réplicas storage-1representará a função destorage(incluindo a funçãovshard-storage) - aqui adicionaremos duas instâncias de máquinas diferentes.

Para executar a amostra, precisaremos do 
Vagrant e do 
Ansible (versão 2.8 ou superior).
A função em si é armazenada no 
Ansible Galaxy - um repositório que permite compartilhar seu trabalho e usar as funções prontas.
Agora clone o repositório de amostra:
 $ git clone https://github.com/dokshina/deploy-tarantool-cartridge-app.git $ cd deploy-tarantool-cartridge-app && git checkout 1.0.0 
Em seguida, implante as máquinas virtuais:
 $ vagrant up 
Depois disso, instale a função Ansible do cartucho Tarantool:
 $ ansible-galaxy install tarantool.cartridge,1.0.1 
E inicie a função instalada:
 $ ansible-playbook -i hosts.yml playbook.yml 
Agora aguarde até o processo do manual terminar, vá para 
http: // localhost: 8181 / admin / cluster / dashboard e aproveite os resultados:
Você pode fazer o upload dos dados agora. Incrível, não é?
Agora vamos descobrir como trabalhar com ele, e também podemos adicionar outro conjunto de réplicas à topologia.
Aprofundando-se nos detalhes
Então o que aconteceu?
Colocamos em funcionamento duas máquinas virtuais e lançamos o manual Ansible que configurou nosso cluster. Agora, vamos olhar dentro do arquivo 
playbook.yml :
 --- - name: Deploy my Tarantool Cartridge app hosts: all become: true become_user: root tasks: - name: Import Tarantool Cartridge role import_role: name: tarantool.cartridge 
Nada de interessante acontece aqui; vamos iniciar o papel 
tarantool.cartridge chamado 
tarantool.cartridge .
O mais importante (a configuração do cluster) está no arquivo de inventário 
hosts.yml :
 --- all: vars: # common cluster variables cartridge_app_name: getting-started-app cartridge_package_path: ./getting-started-app-1.0.0-0.rpm # path to package cartridge_cluster_cookie: app-default-cookie # cluster cookie # common ssh options ansible_ssh_private_key_file: ~/.vagrant.d/insecure_private_key ansible_ssh_common_args: '-o IdentitiesOnly=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 app-1: config: advertise_uri: '172.19.0.3:3301' http_port: 8182 storage-1-replica: config: advertise_uri: '172.19.0.3:3302' http_port: 8183 children: # GROUP INSTANCES BY MACHINES host1: vars: # first machine connection options ansible_host: 172.19.0.2 ansible_user: vagrant hosts: # instances to be started on the first machine storage-1: host2: vars: # second machine connection options ansible_host: 172.19.0.3 ansible_user: vagrant hosts: # instances to be started on the second machine app-1: storage-1-replica: # GROUP INSTANCES BY REPLICA SETS replicaset_app_1: vars: # replica set configuration replicaset_alias: app-1 failover_priority: - app-1 # leader roles: - 'api' hosts: # replica set instances app-1: replicaset_storage_1: vars: # replica set configuration replicaset_alias: storage-1 weight: 3 failover_priority: - storage-1 # leader - storage-1-replica roles: - 'storage' hosts: # replica set instances storage-1: storage-1-replica: 
Tudo o que precisamos fazer é aprender a gerenciar instâncias e conjuntos de réplicas modificando esse arquivo. Mais tarde, adicionaremos novas seções a ele. Para evitar confusão ao adicionar as seções, observe a versão final deste arquivo ou 
hosts.updated.yml , que está localizado no repositório de amostra.
Gerenciando as instâncias
Em termos Ansible, cada instância é um host (não deve ser confundido com um servidor físico), ou seja, o nó de infraestrutura que o Ansible gerenciará. Para cada host, podemos especificar parâmetros de conexão (como 
ansible_host e 
ansible_user ) e configuração da instância. A descrição da instância está na seção 
hosts .
Vamos examinar a configuração da instância 
storage-1 :
 all: vars: ... # INSTANCES hosts: storage-1: config: advertise_uri: '172.19.0.2:3301' http_port: 8181 ... 
Na variável de 
config , especificamos os parâmetros da instância: 
advertise URI e 
HTTP port .
Abaixo estão os parâmetros das instâncias 
app-1 e 
storage-1-replica .
Devemos fornecer ao Ansible parâmetros de conexão para cada instância. Parece razoável agrupar as instâncias por máquinas virtuais. Para esse propósito, as instâncias são agrupadas em 
host1 e 
host2 , e cada grupo na seção 
vars contém os valores de parâmetro 
ansible_user e 
ansible_user para uma única máquina virtual. E a seção 
hosts contém hosts (ou instâncias) incluídos neste grupo:
 all: vars: ... hosts: ... children: # GROUP INSTANCES BY MACHINES host1: vars: # first machine connection options ansible_host: 172.19.0.2 ansible_user: vagrant hosts: # instances to be started on the first machine storage-1: host2: vars: # second machine connection options ansible_host: 172.19.0.3 ansible_user: vagrant hosts: # instances to be started on the second machine app-1: storage-1-replica: 
Vamos começar a editar o 
hosts.yml . Agora, adicionamos mais duas instâncias: 
storage-2-replica na primeira máquina virtual e 
storage-2 na segunda:
 all: vars: ... # INSTANCES hosts: ... storage-2: # <== config: advertise_uri: '172.19.0.3:3303' http_port: 8184 storage-2-replica: # <== config: advertise_uri: '172.19.0.2:3302' http_port: 8185 children: # GROUP INSTANCES BY MACHINES host1: vars: ... hosts: # instances to be started on the first machine storage-1: storage-2-replica: # <== host2: vars: ... hosts: # instances to be started on the second machine app-1: storage-1-replica: storage-2: # <== ... 
Inicie o manual do Ansible:
 $ ansible-playbook -i hosts.yml \ --limit storage-2,storage-2-replica \ playbook.yml 
Observe a opção 
--limit . Como cada instância de cluster é um host em termos de Ansible, podemos especificar explicitamente quais instâncias devem ser configuradas ao executar o manual.
Então, voltamos à interface do usuário da web em 
http: // localhost: 8181 / admin / cluster / dashboard e examinamos nossas novas instâncias:
Em seguida, vamos dominar o gerenciamento de topologia.
Gerenciando a Topologia
Vamos agrupar nossas novas instâncias no conjunto de réplicas 
storage-2 , adicionar um novo grupo de 
replicaset_storage_2 e descrever os parâmetros do conjunto de réplicas nas variáveis, como fizemos para 
replicaset_storage_1 . Na seção 
hosts , especificamos quais instâncias devem ser incluídas neste grupo (ou seja, nosso conjunto de réplicas):
 --- all: vars: ... hosts: ... children: ... # GROUP INSTANCES BY REPLICA SETS ... replicaset_storage_2: # <== vars: # replicaset configuration replicaset_alias: storage-2 weight: 2 failover_priority: - storage-2 - storage-2-replica roles: - 'storage' hosts: # replicaset instances storage-2: storage-2-replica: 
Em seguida, executamos o manual novamente:
 $ ansible-playbook -i hosts.yml \ --limit replicaset_storage_2 \ --tags cartridge-replicasets \ playbook.yml 
Desta vez, passamos o nome do grupo correspondente à nossa réplica definida no parâmetro 
--limit .
Vamos olhar para a opção de 
tags .
Nossa função executa sucessivamente várias tarefas marcadas com as seguintes tags:
- cartridge-instances: gerenciamento de instância (configuração, associação);
- cartridge-replicasets: gerenciamento de topologia (gerenciamento de conjunto de réplicas e remoção permanente (expulsão) de instâncias do cluster);
- cartridge-config: controle de outros parâmetros do cluster (inicialização vshard, failover automático, parâmetros de autorização e configuração do aplicativo).
Podemos especificar explicitamente que parte do trabalho queremos fazer - e a função pulará o restante das tarefas. Nesse caso, queremos apenas trabalhar com topologia, por isso especificamos conjuntos 
cartridge-replicasets .
Vamos avaliar o resultado de nossos esforços. Localize o novo conjunto de réplicas em 
http: // localhost: 8181 / admin / cluster / dashboard .
Yay
Tente alterar a configuração das instâncias e conjuntos de réplicas e veja como a topologia do cluster é alterada. Você pode tentar diferentes casos de uso, como 
atualização sem memtx_memory ou aumento do 
memtx_memory . A função tentaria fazer isso sem reiniciar a instância para reduzir o possível tempo de inatividade do seu aplicativo.
Não se esqueça de 
vagrant halt a interrupção das máquinas virtuais quando terminar com elas.
O que tem dentro?
Aqui vou contar mais sobre o que aconteceu sob o capô do papel Ansible durante nossos testes.
Vamos considerar as etapas de implantação de um aplicativo de cartucho.
Instalando o Pacote e Iniciando as Instâncias
A primeira coisa a fazer é entregar o pacote no servidor e instalá-lo. Agora, a função pode trabalhar com pacotes RPM e pacotes DEB.
Em seguida, lançamos as instâncias. É muito simples: cada instância é um serviço 
systemd separado. Por exemplo:
 $ systemctl start myapp@storage-1 
Este comando inicia a instância 
storage-1 do 
myappaplicação. A instância em execução procura sua 
configuração em 
/etc/tarantool/conf.d/ . Você pode visualizar os logs da instância usando o 
journald .
O arquivo da unidade 
/etc/systemd/systemd/myapp@.sevice para o serviço systemd é entregue com o pacote.
O Ansible possui módulos internos para instalação de pacotes e gerenciamento de serviços systemd; portanto, não inventamos nada de novo aqui.
Configurando a Topologia de Cluster
As coisas mais emocionantes acontecem aqui. Tenho certeza que você concorda que é estranho se preocupar com uma função Ansible especial para instalar pacotes e executar serviços 
systemd .
Você pode configurar o cluster manualmente:
- A primeira opção é abrir a interface do usuário da Web e clicar nos botões. É bastante adequado para uma inicialização única de várias instâncias.
- A segunda opção é usar a API GraphQL. Aqui você já pode automatizar algo, por exemplo, escrever um script em Python.
- A terceira opção é para os corajosos: vá ao servidor, conecte-se a uma das instâncias com a ajuda do tarantoolctl connecte execute todas as ações necessárias com o módulo Lua docartridge.
A principal tarefa de nossa invenção é fazer essa parte mais difícil do trabalho para você.
O Ansible permite que você escreva seu próprio módulo e use-o em sua função. Nossa função usa esses módulos para gerenciar os vários componentes do cluster.
Como isso funciona? Você descreve o estado desejado do cluster em uma configuração declarativa e a função fornece a cada módulo sua própria seção de configuração como entrada. O módulo recebe o estado atual do cluster e o compara com a entrada. Em seguida, o código para o estado de cluster necessário é iniciado usando o soquete de uma das instâncias.
Resultados
Hoje, mostramos como implantar seu aplicativo Tarantool Cartridge e configurar uma topologia simples. Para fazer isso, usamos o Ansible, uma ferramenta poderosa que é fácil de usar e permite configurar vários nós de infraestrutura ao mesmo tempo (no nosso caso, as instâncias do cluster).
Acima, examinamos uma das muitas maneiras de descrever a configuração do cluster por meio do Ansible. Depois de sentir que está pronto para mais, aprenda as 
melhores práticas para escrever playbooks. Você pode achar mais fácil gerenciar a topologia com 
group_vars e 
host_vars .
Em breve, mostraremos como remover permanentemente (expulsar) instâncias da topologia, inicializar vshard, gerenciar failover automático, configurar autorização e configurar o cluster de patches. Enquanto isso, você pode revisar a 
documentação e tentar alterar as configurações do cluster.
Se algo der errado, 
informe-nos sobre o problema. Faremos o nosso melhor para resolver qualquer problema!