Ruby, Capistrano e administração remota
Postado em 06. ago, 2007 por Lucas Cavalcanti em Ruby
Algumas vezes nos deparamos com a seguinte situação:
Temos uns 15 computadores em rede e precisamos executar um mesmo comando em cada um deles, como por exemplo instalar a JavaVM…
Uma primeira solução seria logar como root máquina por máquina, e executar o comando em todas… Muito ruim…
Agora, se você souber um pouquinho de bash script, em cinco minutos conseguirá fazer um script que loga via ssh em todas as máquinas e executa o comando nelas. Mas ainda tem o problema de você ter que digitar o password para cada máquina, e de ter que assistir a execução do comando, caso ele precise de alguma confirmação, ou algo do tipo…
Felizmente existe uma ferramenta muito útil que pode nos ajudar nessa tarefa entediante. E ela se chama Capistrano (www.capify.org). Com os mesmos 5 min você consegue escrever um script que execute o comando que você quer, digite as confirmações pra você nos lugares necessários, e você só precisará digitar a senha uma única vez!
O Capistrano requer que você o use em sistemas compatíveis com bash, e que exista um mesmo usuário em todas as máquinas que tenha uma única senha.
Para o script funcionar você precisa, com o capistrano instalado corretamente:
- Definir o usuário a que você vai se conectar nos micros:
set :user = "root" #pode ser qualquer usuário - Definir os ips dos micros aos quais você irá se conectar:
role :micros = "192.168.0.10", "192.168.0.11" - Ou se for uma faixa de IPs:
role :micros = *("192.168.0.10" .. "192.168.0.25").to_a - E, finalmente, definir a tarefa que você quer executar, ou seja, o(s) comando(s). Para isso temos que passar os roles a que queremos nos conectar (os micros)
task :instalaJava, :roles => :micros do run "apt-get install java-virtual-machine" end
Pronto! O comando será executado em todas as máquinas!
Ou melhor, quase pronto…
Você sabe que o apt-get pode pedir confirmação para continuar instalando o programa pedido…
Você pode automatizar isso usando um recurso muito útil do capistrano:
run "apt-get install java-virtual-machine" do |channel, stream, data|
#channel é um objeto que nos permite enviar dados para o comando
#stream identifica se a saída do comando foi a padrão (:out) ou a de erros(:err)
#data é uma string com a saída do comando
if data =~ /Do you want to proceed/ #se na saída do comando tiver essa frase
channel.send_data "y\\n" #manda pro comando um y e um enter
end
puts data #pra saída do comando aparecer na tela
end
Agora sim, o script vai fazer o que a gente queria: executar o comando e confirmar!
O comando run vai ser executado em todos os micros paralelamente, e o bloco de código entre do e end do run vai ser executado toda vez que o comando “apt-get” jogar algum texto na tela ou na saída de erros.
Pra executar o script basta salvar o código que escrevemos como “capfile” e chamar pela linha de comando cap + o nome da nossa task:
$ cap instalaJava
O comando irá mostrar qual task está sendo executado e pedirá uma vez a senha. E é só ficar assistindo, ou ir fazer algo mais produtivo.
Nesse arquivo capfile você pode usar toda a sintaxe e as funcionalidades de um rakefile e, consequentemente, código em ruby. Então dá pra fazer coisas bem legais, como chamar tasks dentro de tasks, popular um role dinamicamente, executar uma tarefa antes e/ou depois da task chamada, enfim, muitas coisas…
Você só terá que se preocupar com uma coisa: se um dos micros que estiver no role da task não estiver acessível pela rede, ou se acontecer um erro fatal qualquer, o capistrano não irá executar a task em nenhum dos micros.
É isso. Divirta-se!
5 Respostas para “Ruby, Capistrano e administração remota”
Trackbacks/Pingbacks
-
-
agosto 13, 2007
[...] Ainda com o Ruby, uma ótima dica de ferramenta escrita em Ruby, com a intenção de ser uma ferramenta de deploy para aplicações em Ruby, mas que no final se tornou um automatizador de tarefas é o Capistrano, mais detalhes e exemplos neste post do blog da Caelum. [...]
ASSINE NOSSO RSS




Rafael de F. Ferreira
06. ago, 2007
Eu nunca usei, mas já ouvi falar bastante do Smartfrog. Eu tenho a impressão que é 100% Java (não interage direto com o shell) então não daria para instalar o JRE usando ele, mas parece útil para deploy e teste de apps. Vocês já deram uma olhada?
Paulo Silveira
07. ago, 2007
Valeu a dica Rafael. Pior que procuramos pra caramba algo em java. Vamos ver se ele é comparavel ao capistrano, e se nao é muito burocratico.
Tiago Albineli Motta
07. ago, 2007
Ótima dica, quem nunca passou por essa situação? Agora com essa ferramenta tudo fica mais fácil.
Marcio
03. set, 2008
Gostei bastante desse post, só que tenho uma dúvida.
Eu vi que quando o run é executado ele utiliza o sh -c, existe a possibilidade dele não utilizar o sh -c e utilizar apenas o que eu coloquei no run??
Obrigado.