Escreva um script de gerenciamento remoto

6

Eu preciso poder executar localmente um script que se conectará a vários servidores e executará comandos neles. Qual é o melhor jeito de concluir isso?

    
por Josh K 17.08.2010 / 18:47

8 respostas

5

Pessoalmente, eu usaria Capistrano . É amigável e escrito em Ruby e eles já fizeram todo o trabalho pesado para você.

Da Wikipedia:

Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.

    
por 17.08.2010 / 19:24
4

você pode executar um comando usando ssh hostname command . Se você tiver um script inteiro que precisa executar, primeiro use scp para transferi-lo para o host remoto e, em seguida, execute ssh para executá-lo.

scp script.sh host:script.sh
ssh host ./script.sh
    
por 17.08.2010 / 19:47
3

Que tal usar o gerenciamento de configurações como fantoche ou chef ? Isso talvez seja um pouco exagerado para apenas um script, mas se você precisar de vários desses scripts, talvez valha a pena considerar.

    
por 17.08.2010 / 20:15
2

Eu usaria o ssh com autenticação de chave, acredito que o ssh tenha uma maneira de garantir que determinadas contas possam efetuar login de determinados IPs, então eu o limitaria a isso porque talvez você não queira definir uma frase secreta nas chaves ( você poderia usar um gerenciador de chaves para evitar isso, mas também tem limitações)

    
por 17.08.2010 / 19:07
0

Um loop rápido para 'loop' pode ser mais fácil, talvez algo como:

for h in host1 host2 host3
do 
   echo $h
   ssh user@$h "ps -ef"
done

Claro, cfengine / puppet / chef / capistrano são melhores opções de gerenciamento de configuração. Se você quisesse enviar interativamente comandos para os vários shells, o clusterm (http://sourceforge.net/projects/clusterm/) também é uma opção sólida.

    
por 18.08.2010 / 03:44
0

Puppet e Chef são sistemas "pull" e descobri que um sistema "push" complementar implementado usando Capistrano, Fabric ou ssh (1) em for -loop é necessário. Claro, isso significa que as chaves públicas também estão disponíveis para autenticação; Felizmente, esses podem ser gerenciados por Puppet ou Chef.

    
por 18.08.2010 / 04:01
0

Eu fiquei muito feliz com um script de shell chamado dssh.sh que utiliza ssh para se comunicar com muitas máquinas simultaneamente. Ele pode executar o mesmo comando em várias máquinas simultaneamente e esperar que todos saiam antes de retornar. Para fazer o download e saber mais sobre ele, a melhor referência que encontrei é o Câncer de Cura BASH .

    
por 18.08.2010 / 00:01
0

Eu estava tendo exatamente a mesma pergunta há um ano, e depois de perguntar a algumas pessoas eu comecei com o Fabric. Foi recomendado para mim sobre Puppet e Chef por sua simplicidade.

Você pode facilmente misturar comandos locais e comandos remotos na mesma função. Além disso, poder usar o Python em vez do Bash é uma atualização notável que ajudará se você precisar fazer muito código auxiliar além dos comandos local / remoto. Mesmo que às vezes você precise de um truque para fazer as coisas simples funcionarem, eu ainda recomendo o Fabric.

Aqui está uma boa introdução ao Fabric: link O autor afirma que o Fabric é melhor que o Capistrano para sistemas simples.

Aqui eu vou dar um pequeno exemplo da vida real: transferindo o último código do repositório do git (armazenado em code_dir) para uma máquina remota e compilando:

# Use: fab -H <username>@<test_computer_ip> compile_on_test_computer
@task
def compile_on_test_computer():
  # create a remote dir for incoming updates
  run("mkdir -p %s/update" % env.remoteDir)
  # create a local dir for outgoing updates
  lrun("mkdir -p %s/update" % env.localDir)

  # archive latest code, be it committed or not
  with lcd("%s/code_dir" % env.localDir):
    lrun("uploadStash='git stash create' && git archive -o ../update/code_outgoing.zip $uploadStash || git archive -o ../update/code_outgoing.zip HEAD")

  # transfer source code to test computer, unzip and compile
  put("%s/update/code_outgoing.zip" % (env.localDir), 
  "%s/update/code_incoming.zip" % (env.remoteDir),
   mirror_local_mode=True)
  with cd("%s" % env.remoteDir):
    run("unzip -uo update/code_incoming.zip -d code_dir")
    run("cd code_dir && ./compile_and_install_all.sh")
    
por 01.09.2014 / 07:35