Simcronizando / implementando scripts em vários sistemas

0

Tenho algumas tarefas demoradas que gosto de espalhar por vários computadores. Essas tarefas exigem a execução de um script de ruby ou python idêntico (ou uma série de scripts que chamam uns aos outros) em cada máquina. As máquinas terão um arquivo de configuração separado informando ao script que parte da tarefa deve ser concluída.

Eu quero descobrir a melhor maneira de sincronizar os scripts nessas máquinas antes de executá-los. Até agora, tenho feito alterações em uma cópia do script em um compartilhamento de rede e copiando uma cópia nova para cada máquina quando quiser executá-la. Mas isso é complicado e deixa uma chance de erro (por exemplo, perder um arquivo na cópia ou não clicar em "copiar e substituir").

Vamos supor que os sistemas são máquinas Windows padrão que não são dedicadas a esta tarefa e eu não preciso executar esses scripts o tempo todo (então eu não quero uma solução que funcione 24/7 e sempre os mantenha atualizados). até hoje, eu prefiro algo que empurra / puxa o comando).

Meus pensamentos sobre várias opções:

  • Adaptação simples do meu fluxo de trabalho atual: mantenha os originais na unidade de rede, mas escreva um arquivo em lotes que copie a versão mais recente dos scripts, para que tudo seja uma operação de um clique. Requer ação em cada sistema, mas isso não é o fim do mundo (já que cada um geralmente precisa que seu arquivo de configuração mude um pouco também).
  • Coloque tudo em um reposotório do Mercurial / Git e faça uma cópia nova em cada nó. Ir direto ao repositório de cada máquina garantiria uma versão atual (e teria o benefício de permitir que as edições do script fossem feitas em qualquer máquina). Contras seria que requer VCS para ser instalado em cada máquina e pode haver algumas dores de lidar com autenticação desde que eu não usaria um repositório público.
  • Abra o acesso de gravação em uma pasta compartilhada e escreva um script para usar o rsync (ou similar) para enviar as alterações para todas as máquinas de uma só vez. Isso obtém uma versão atual em cada máquina (embora você tenha que alterar o script se quiser omitir uma máquina ou adicionar uma nova). O possível problema seria que cada computador deve permitir o acesso de gravação.
  • O Dropbox é uma sugestão razoável (e pode funcionar bem), mas eu não quero usar um serviço externo e prefiro não ter o dropbox funcionando 24/7 nos sistemas que normalmente não precisariam dele.

Existe algo simples que estou perdendo? Alguma ferramenta projetada expressamente para fazer esse tipo de coisa? Caso contrário, estou inclinado apenas a vincular todos os sistemas ao Mercurial, pois, embora exija software extra, é um pouco mais robusto do que gravar um arquivo em lote (por exemplo, se dividir parte de um script em um módulo separado, o Mercurial saberá o que fazer enquanto eu teria que adicionar uma linha para o arquivo de lote).

    
por orh 21.10.2013 / 23:10

2 respostas

1

Eu uso Jenkins (CI Server) e Capistrano 2 (Ruby build / deploy). Você não precisa necessariamente do Jenkins para isso, mas um servidor de CI é ótimo para esse tipo de trabalho. Capistrano é ótimo porque eu posso fazer uma coisa / muitas máquinas facilmente e posso lidar com o check-out do SCM (git ou mercurial como você pediu) se você quiser. O Fabric (Python) também é um bom framework "deploy".

Fluxo de trabalho:

  • Capistrano faz check-out de um branch / master git contendo script na máquina local
  • O Capistrano envia o arquivo de script para todas as máquinas via scp ou sftp. (: deploy_via,: copy)
  • O Capistrano executa o script em todos os nós "app", em paralelo ou sequencialmente, e relata sucesso ou falha.

Você pode substituir o Capistrano por (Fabric | bash | Chrome | receita do chef | configuração do fantoche)

Agora, se você tiver um servidor de IC em execução, poderá gerenciar as chaves SSH e a administração de um ponto central.

Eu posso seguramente assumir que você está usando o Windows para desenvolvimento local, se estas também são máquinas Windows que você está implantando ... você pode querer considerar os comandos Powershell executados a partir do Capistrano ao invés do modo "unix" que descrevi aqui. O desafio é como X registra na caixa Y e executa Z, uma questão diferente.

    
por 21.10.2013 / 23:32
0

Apenas tenha um script "loader" inicial que capture a última versão de tudo da rede. Armazene os dados de configuração fora dessa árvore (o que você deve fazer de qualquer maneira). O carregador pode ser qualquer coisa, desde um arquivo de lote simples chamando xcopy / robocopy até um pull DVCS ou DropBox / OwnCloud sync.

Dessa forma, não importa como ele é executado, a primeira ação será atualizar para o mais recente antes da execução.

    
por 21.10.2013 / 23:51