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.
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?
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.
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
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)
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.
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.
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 .
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")