Find via SSH em vários servidores

Iniciado por rudrigue86, 04 de Abril de 2019, 13:33

tópico anterior - próximo tópico

rudrigue86

Olá, senhores.
Uma das minhas atividades na empresa que trabalho é verificar log de JVMs quando temos erros na aplicação.
A forma que é feita essa verificação é através de SSH (temos um "túnel" configurado através de vpn diretamente configurada no SONICWALL).
Funciona assim:


$ ssh [servidor interno] (utilizo ALIAS, o host está configurado na minha chave)
$ssh [servidor cliente] (não temos mais acesso direto)

Dentro do servidor do cliente temos 2 JVMs (criamos links das pastas de logs para ñ ter que ficar navegando até elas), mas para acessar as pastas precisamos voltar um diretório (não sei pq cargas d'agua o usuário da empresa não loga no diretório raiz), ficando:

$ cd

Resumindo a rotina:

$ ssh [servidor empresa]
$ ssh [servidor cliente]
$ cd
$ cd [log_vm_1]
$ find ./* -type f -exec grep -l COD_ERRO_JVM  {} \;


Não é um processo muito longo, o problema é que temos 5 servidores com 2 vms cada, e a aplicação é gerenciada por um weblogic (não temos como saber onde ocorreu o erro), ou seja, tenho que procurar VM por VM

A minha dúvida é:

É possível criar um script onde eu rode este find em todos os servidores/vms ao mesmo tempo??

Obrigado!

zekkerj

Sim, é possível. Crie uma chave RSA no primeiro servidor, e cadastre-a como acesso ao segundo, de forma que não seja mais necessário digitar senhas nesse processo:

ssh-keygen -t rsa -b 4096 -f interno

ssh-copy-id -i interno [servidor interno]

Daí, você pode pegar os comandos executado ano acesso e colocá-los num arquivo de script no servidor interno, assim você pode chamá-lo assim, a partir do servidor externo:

ssh -i interno [servidor interno] script.sh

Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

rudrigue86

Pessoal, eu agradeço a ajuda. A solução que eu encontrei, foi:

Primeiramente você pode criar um script que faz a busca nas duas JVMs de um mesmo servidor:
Citar
#!/bin/bash

cd
for dir in log_vm_1 log_vm_2
do
    echo "procurando em" $(hostname) $dir
    find $dir -type f -exec grep -l COD_ERRO_JVM  {} \;
done

Repare que você não precisa fazer cd dir e depois find, é possível passar o diretório diretamente para o find. Aliás, se você sabe o caminho completo do diretório, nem mesmo o cd no começo é necessário, você poderia fazer simplesmente find /caminho/completo/log_vm.

Na verdade, se quiser, pode passar vários diretórios de uma vez: find log_vm_1 log_vm_2, assim nem precisaria do for. Eu fiz o for acima apenas para ter um echo entre um diretório e outro, assim as respectivas saídas ficam visualmente mais separadas.

Supondo que o script acima esteja salvo no arquivo busca.sh (em alguma pasta do seu servidor interno), basta você se conectar em cada um dos servidores do cliente passando o nome do script como parâmetro:

Citarssh servidor_interno
for serv in  servidor_cliente_1  servidor_cliente_2  servidor_cliente_3
do
    ssh $serv "bash -s" < /pasta/do/arquivo/busca.sh
done

"bash -s" < arquivo faz com que os comandos sejam lidos do arquivo. Em seguida, eles são executados no servidor do cliente, sem que o script precise estar lá.

Com isso os comandos do script busca.sh são executados em cada um dos servidores do cliente. A linha com echo imprime o hostname e o diretório, assim você terá uma saída parecida com isso:

Citarprocurando em servidor_cliente_1 log_vm_1
... saída do find
procurando em servidor_cliente_1 log_vm_2
... saída do find
procurando em servidor_cliente_2 log_vm_1
... saída do find
procurando em servidor_cliente_2 log_vm_2
... saída do find
... e assim por diante


Claro que você pode salvar o for serv ... acima em outro script, se quiser. Por exemplo, se eu salvar em /pasta/busca_todos.sh (no servidor interno) e der permissão de execução (chmod u+x busca_todos.sh), eu posso executá-lo diretamente pelo SSH:

ssh servidor_interno /pasta/busca_todos.sh
Assim, ao se logar no servidor interno, o script busca_todos.sh é executado. E dentro dele existe o for que faz um loop por todos os servidores do cliente, executando a busca em cada um deles.

Outra alternativa é copiar o script busca.sh para cada um dos servidores do cliente:

Citarscp busca.sh servidor_cliente_1:/pasta
scp busca.sh servidor_cliente_2:/pasta


... copiar para todos os servidores do cliente
Como agora existe uma cópia do arquivo em cada servidor do cliente, basta passar o caminho completo do mesmo ao fazer o SSH:

Citarssh servidor_interno
for serv in  servidor_cliente_1  servidor_cliente_2  servidor_cliente_3
do
    ssh $serv /pasta/busca.sh
done

Lembrando que o script deve ter permissão de execução (é necessário executar chmod u+x busca.sh em cada servidor do cliente para que ele possa ser executado).