Mina: Implante em várias caixas simultaneamente

Criado em 12 jun. 2012  ·  52Comentários  ·  Fonte: mina-deploy/mina

Se não me engano é possível implantar apenas em uma única caixa. Ou seja, se eu tiver um monte de caixas idênticas, tenho que implantar em cada uma delas especificando explicitamente em qual caixa devo implantar. Algo assim:

mina deploy to=prodbox1 && mina deploy to=prodbox2 && mina deploy to=prodbox3

A implantação paralela está planejada em breve?

Comentários muito úteis

Usei uma solução semelhante a @sarguru, mas precisava adicionar o bloco isolate . Sem ele, cada chamada para invoke no loop basicamente duplica a implantação. O segundo host é implantado duas vezes, o terceiro host é implantado três vezes, etc. Aqui está o código:

set :domains, %w[host1 host2 host3]

desc "Deploy to all servers"
task :deploy_all do
  isolate do
    domains.each do |domain|
      set :domain, domain
      invoke :deploy
      run!
    end
  end
end

Embora essa abordagem implante em vários hosts, ela o faz um de cada vez, o que pode ser um problema para implantações mais longas. Seria bom ver uma abordagem de implantação paralela com suporte nativo em algum ponto.

Todos 52 comentários

Eu também estaria interessado na resposta a isso.

Sim, eu gostaria de ver isso antes de 1.0 eu mesmo. Discussões: https://trello.com/c/cukv1ztZ

conjunto: domínios, ['test.deeptest.in,' test1.deeptest.in ']
tarefa: multi_deploy do
domínios.each do | domínio |
definir: domínio, domínio
invoke: deploy
corre!
fim
fim

Isso funciona para mim. Alguma estratégia melhor que alguém está usando?

Usei uma solução semelhante a @sarguru, mas precisava adicionar o bloco isolate . Sem ele, cada chamada para invoke no loop basicamente duplica a implantação. O segundo host é implantado duas vezes, o terceiro host é implantado três vezes, etc. Aqui está o código:

set :domains, %w[host1 host2 host3]

desc "Deploy to all servers"
task :deploy_all do
  isolate do
    domains.each do |domain|
      set :domain, domain
      invoke :deploy
      run!
    end
  end
end

Embora essa abordagem implante em vários hosts, ela o faz um de cada vez, o que pode ser um problema para implantações mais longas. Seria bom ver uma abordagem de implantação paralela com suporte nativo em algum ponto.

chances de que a implantação paralela esteja se tornando realidade ...?

esbarrando nesta questão. a abordagem recomendada por @sarguru e @phlipper é a solução oficial ou há um plano para adicionar suporte de implantação paralela diretamente no mina?

fyi, mina é uma ótima ferramenta - um trabalho fantástico.

1 para este problema. Isso é a única coisa que me impede de mudar totalmente de Capistrano.

O truque de @phlipper funciona, mas acho um pouco perigoso implantar em sequência - por exemplo, o que acontece quando o último servidor em que você está implantando falha? - então ainda estou esperando por uma implementação paralela.

Continue com o bom trabalho @rstacruz!

Eu concordo - esta é uma excelente pergunta, e uma boa abordagem foi proposta ...

Idealmente, uma segmentação entre "build" e "release / symlinking to current";

isto é ... construir em todos os servidores em paralelo e esperar pela confirmação (sem erros) ... se confirmado, então "libere e reinicie"

Eu sei que isso é um pouco complicado com a estratégia "1 script de shell para governar todos", mas acho que é um recurso / abordagem excelente e algo que vale a pena considerar.

Não tenho certeza se esse problema está próximo o suficiente de suporte a vários estágios para justificar um novo problema. Apenas adicionar minha voz para dizer que a implantação em vários estágios seria ótimo.

+1!

Eu considerei esse recurso um dado adquirido ao migrar para longe de Capistrano. +1

a solução acima não funcionou para mim ...

Minha solução é encapsular o comando mina com grunhido; e usar o loop de implantação de vários servidores com grunt.js

module.exports = function (grunt) {

// Project configuration.
grunt.initConfig({
    exec: {
        mina: {
            cmd: function(action, server, key) {
                var mina_command = 'mina ' + action + ' key=' + key + ' server=' + server + ' --verbose  ' ;
                grunt.log.write(mina_command).ok();

                return  mina_command;
            }
        },
        pwd : {

            cmd: 'pwd'
        }
    }

});

 // -----------------// -----------------// -----------------// -----------------
 // HELPER FUNCTIONS
 // -----------------// -----------------// -----------------// -----------------

// mina is used for SSH client for server deployements and configuration management
// configuration for mina is under /config/deploy.rb
// here is the function for wrapping mina functionality for our purposes

var runMina= function (action, server_type,user,branch) {

    // import list of servers
    var servers= grunt.file.readJSON('config/servers/'+ server_type+'.json');

    grunt.log.write('Setting up '+server_type+' servers...').ok();

    var key='';
    if (server_type=='production') key= '---- your pem here ------- '; else key= '---- your pem here -------';

    for (var server in servers) {
        grunt.task.run('exec:pwd');
        grunt.task.run('exec:mina:'+action+':'+user+'@'+servers[server]+':'+key + ' branch=' + branch);
    }

}


// -----------------// -----------------// -----------------// -----------------
// TASKS
// -----------------// -----------------// -----------------// -----------------


// A very basic default task.
grunt.registerTask('default', 'Log some stuff.', function() {
    grunt.log.write('Logging some stuff...').ok();
});




// setup servers for deployment

// deployments
grunt.registerTask('deploy-setup', 'Setting up server for deployments...', function(arg1) {

    var user='ec2-user';

    if (arguments.length === 0) {
        grunt.log.error(this.name + ", define a setup target ");
        return false;
    }

    switch (arg1) {

        case 'production':

            runMina('setup','production',user);

            break;

        case 'testing':

            runMina('setup','testing',user);

            break;

        default:

    }


});



// deployments
grunt.registerTask('deploy', 'Deploy to Servers...', function(arg1,arg2) {

    var user='ec2-user';

    if (arguments.length === 0) {
        grunt.log.error(this.name + ", define a deployment target ");
        return false;
     }


    // defined the branch; default is the master
    var branch='master';
    if (arg2) {  branch =arg2; }

    switch (arg1) {

        case 'production':

            runMina('deploy','production',user,branch);

            break;

        case 'testing':

            runMina('deploy','testing',user,branch);

            break;

         default:

    }


});

// https://github.com/jharding/grunt-exec
grunt.loadNpmTasks('grunt-exec');

};

Na verdade, não é tão difícil. Eu configurei o diretório do aplicativo como um compartilhamento NFS. E basicamente todo host tem uma referência a esse diretório. Uma vez que as alterações são enviadas, todos os hosts recebem alterações via NFS e eu tenho uma pequena configuração de cliente de servidor de soquete que envia uma mensagem do servidor principal para todos os hosts para reiniciar o servidor. Mina faz interface apenas com 1 host primário e o host primário trata do resto.

+1

  • 1

+1

+1

Ainda esperando por isso ...

alguma solução?

+1

+1

: +1:

+1

+1

Alguma solução @gabskoro?

+1

+1

@bbnnt , está faltando o principal problema - paralelo vs serial. A solução alternativa é para vários hosts em série, mas é lenta em grandes infraestruturas. Idealmente, há uma maneira de liberar para todos os nós ao mesmo tempo.

@ronwsmith obrigado por apontar isso

Obrigado @phlipper - você salvou minha vida.

+1 para verdadeiras implantações paralelas!

Quase três anos e nenhum passo em frente, muito menos uma resposta decente?

capistrano 3 é realmente muito bom, comecei a usá-lo.

Na terça - feira, 17 de março de 2015 às 9h27, iMoses

Quase três anos e nenhum passo em frente, muito menos uma resposta decente?

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/mina-deploy/mina/issues/8#issuecomment -82050525.

Com base no primeiro cenário descrito por @cheba , poderia ser tão simples como:

cat list_of_servers.txt | mina paralela implantar em = {}

Há alguma desvantagem em executar vários processos mina?

@josericardo Está meio que funcionando, mas não é bem assim. Especificamente, você pode não querer realizar a implantação completa em cada caixa. Você deseja executar migrações apenas uma vez (digamos, se você tiver muitos servidores de aplicativos e um servidor db). Você pode querer fazer upload de seus ativos para o CDN apenas uma vez. Existem razões legítimas para ter suporte nativo para vários destinos.

Assim que eu estava cavando em Mina para nossa nova configuração de implantação, me deparei com isso e parei de repente.

A implantação em vários servidores de aplicativos não é apenas uma questão de "executar a tarefa em todas as caixas". Também há coordenação, por exemplo. se a implantação em uma caixa falhar, reconheça isso e reverta a implantação em todas elas, para que você não termine com versões diferentes em execução ao mesmo tempo. Particularmente se você estiver fazendo algo como criar e enviar ativos para um CDN remoto, esse tipo de coordenação é crucial. Portanto, apenas percorrer uma lista de domínios e disparar a tarefa de implantação em cada um deles não é solução.

Muito decepcionante, um quebra-negócio completo.

Ei @brendonrapp sim, eu concordo. Eu amo o conceito de Mina, mas o resultado final é que Capistrano é um produto muito mais maduro. Ele representa muitos anos de experiência no mundo real na implantação de ambientes de produção complexos. Faltam milhares de horas para o desenvolvedor para o projeto Mina.

Precisamos de ajuda nisso. Como não usamos vários servidores em nossa empresa, realmente não existe uma prioridade alta.
Mas agradeceríamos os PRs.
Valeu

Eu só quero compartilhar como usar vários servidores ou ambientes de implantação com o mina. A Mina tem um terceiro para implantar em vários estágios. Você pode usar mina-multistages neste url https://github.com/endoze/mina-multistage. É realmente poderoso para gerenciar seu ambiente de implantação.
Espero que isso ajude a todos vocês. Obrigado

Eu li sobre como usar o Mina em conjunto com o Ansible para implantações de vários hosts.

+1 para ver isto adicionado nativamente a mina

  • 1 BUMP

+1

qualquer solução para implantação paralela usando mina ??

Ainda esperando a solução nativa.
Enquanto espero, ainda estou usando a solução @phlipper .

Mina não faz várias caixas e provavelmente nunca, porque se destina a ser usado como um script rápido em um host remoto.
Eu sinto muito por isso.
Existe uma ótima ferramenta [capistrano] que faz bem esse trabalho.

Eu criei uma gema muito simples chamada mina-multi_server que adiciona suporte para vários servidores. Ele executa tarefas sequencialmente, mas provavelmente não será um problema se você não tiver muitos servidores.

Todos os comentários são apreciados.

Este é um bloqueador para qualquer pessoa que use, por exemplo, o servidor sidekiq em outra caixa dedicada.

meu 2.x

set :domains, %w[host1 host2 host3]
desc "Deploy to all servers"
task :deploy_all do
    fetch(:domains).each do |domain|
      set :domain, domain
      invoke :deploy
    end
end

+1

Construímos o mina-multideploy - ferramenta útil para implantação paralela em vários servidores.

Algo assim pode funcionar para lidar com funções. Novamente, não é paralelo (ainda).

task :staging do
  set :domains, 'staging-1.app.com' => [:db], 'staging-2.app.com' => []
end

task :deploy do
  invoke :'git:ensure_pushed'

  fetch(:domains).each do |domain, roles|
    set :domain, domain

    deploy do
      invoke :'git:clone'
      invoke :'deploy:link_shared_paths'
      invoke :'bundle:install'
      invoke :'rails:db_migrate' if roles.include?(:db)
      invoke :'rails:assets_precompile'
      invoke :'deploy:cleanup'

      on :launch do
        in_path(fetch(:current_path)) do
          command %(mkdir -p tmp/)
          command %(touch tmp/restart.txt)
          command %(direnv allow)
        end
      end
    end
  end
end
Esta página foi útil?
0 / 5 - 0 avaliações