Fórum Ubuntu Linux - PT

Suporte Técnico => Internet, Redes e Segurança => Tópico iniciado por: rudrigue86 em 04 de Abril de 2019, 13:33

Título: Find via SSH em vários servidores
Enviado por: rudrigue86 em 04 de Abril de 2019, 13:33
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!
Título: Re:Find via SSH em vários servidores
Enviado por: zekkerj em 05 de Abril de 2019, 00:48
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

Título: Re:Find via SSH em vários servidores
Enviado por: rudrigue86 em 05 de Abril de 2019, 11:30
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:

Citar
ssh 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:

Citar
procurando 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:

Citar
scp 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:

Citar
ssh 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).