Nota: O seguinte artigo irá ajudá-lo com: Como executar um único comando em várias máquinas Linux ao mesmo tempo
Estou sempre procurando maneiras de tornar meu trabalho mais eficiente, então a última coisa que quero fazer é entrar em várias máquinas Linux e executar um único comando em cada uma. Eu prefiro ter a capacidade de executar esse comando em várias máquinas ao mesmo tempo.
VEJA: Mais de 40 termos de código aberto e Linux que você precisa conhecer (TechRepublic )
Claro, existem aplicativos para isso. Mas como isso é Linux, não faria mais sentido montar sua própria solução? Claro que sim. Afinal, Linux é sobre escolha, poder e flexibilidade.
Digamos, por exemplo, que você tenha vários servidores Ubuntu e queira executar sudo apt-get update e sudo apt-get upgrade em todos eles de uma vez. Você não precisa fazer em cada uma dessas máquinas para executar esses comandos, não quando há scripts para lidar com essa tarefa para você.
Eu encontrei esse script e o modifiquei de forma que você possa usá-lo para criar vários scripts para hosts específicos (como servidores baseados em Ubuntu ou RHEL). Vamos dar uma olhada neste script e ver como fazê-lo funcionar.
O que você precisará
Para usar este script, você precisará de uma máquina Linux para executar o comando e servidores Linux para enviar comandos. Dependendo do comando que você deseja executar nos servidores remotos, você precisará de um usuário com privilégios sudo.
É isso. Vamos fazer alguma mágica.
Como configurar o SSH
A primeira coisa que devemos fazer é criar um arquivo de configuração SSH que definirá nossos hosts remotos. Mas há um truque para essa configuração específica. Vamos definir nomes de host que começam com ubuntu- ou rhel-, dependendo do sistema operacional de cada um.
No sistema que você estará executando o script, crie o arquivo de configuração SSH com o comando:
nano ~/.ssh/config
Digamos que temos o seguinte:
Sistemas baseados em Ubuntu nos endereços IP 192.168.1.11 e 192.168.1.13 e uma máquina baseada em RHEL no endereço IP 192.168.1.14. Nosso arquivo de configuração pode ficar assim:
Host rhel-db1
Hostname 192.168.1.14
Hospedar fatura do Ubuntu
Nome do host 192.168.1.11
Hospedar ubuntu-portainer
Nome do host 192.168.1.13
Salve e feche o arquivo.
Como criar o roteiro
Agora, vamos criar dois scripts, um para servidores Ubuntu e outro para servidores RHEL. Crie o script do servidor Ubuntu com o comando:
nano ~/ubuntu-cmd
Nesse arquivo, cole o seguinte:
!/bin/bash
# Obtém a entrada do usuário como comando
[[ -z ${@} ]]&& sair || CMD_EXEC=”${@}”
# Obtenha os hosts de ~/.ssh/config cujos nomes são prefixados por `lan-`
HOSTS=$(grep -Po ‘Host\s\Kubuntu-.*’ “$HOME/.ssh/config”)
# Teste o tempo em que o comando de entrada usa sudo
E se [[ $CMD_EXEC =~ ^sudo ]]
então
#Peça senha
leia -sp'[sudo] senha para remote_: ‘ senha; eco
#Reescreva o comando
CMD_EXEC=$(sed “s/^sudo/echo ‘$’ | sudo -S/” “$CMD_EXEC”)
fi
# loop sobre os hosts e execute o comando SSH, remova `-a` para substituir o>
enquanto IFS= leia -r host
Faz
echo -e ‘\n\033[1;33m’”HOST: ${host}”‘\033[0m’
ssh -n “$host” “$CMD_EXEC 2>&1” | tee -a “/tmp/$(basename “${0}”).${host}.>
done <<< “$HOSTS”
Save and close the file. Next, create the RHEL script with the command:
nano ~/rhel-cmd
In that file, paste the following:
#!/bin/bash
# Get the ’s input as command
[[ -z ${@} ]]&& sair || CMD_EXEC=”${@}”
# Obtenha os hosts de ~/.ssh/config cujos nomes são prefixados por `lan-`
HOSTS=$(grep -Po ‘Host\s\Krhel-.*’ “$HOME/.ssh/config”)
# Teste o tempo em que o comando de entrada usa sudo
E se [[ $CMD_EXEC =~ ^sudo ]]
então
#Peça senha
leia -sp'[sudo] senha para remote_: ‘ senha; eco
#Reescreva o comando
CMD_EXEC=$(sed “s/^sudo/echo ‘$senha’ | sudo -S/” <<< “$CMD_EXEC”)
fi
# loop sobre os hosts e execute o comando SSH, remova `-a` para substituir o>
enquanto IFS= leia -r host
Faz
echo -e ‘\n\033[1;33m’”HOST:${host}”‘\033[0m'[1;33m’”HOST:${host}”‘\033[0m’
ssh -n “$host” “$CMD_EXEC 2>&1” | tee -a “/tmp/$(basename “${0}”).${host}.>
feito <<< “$HOSTS”
Salve e feche o arquivo. Mova esses arquivos para um diretório em seu caminho, como com o comando:
sudo ubuntu-cmd rhel-cmd /usr/local/bin
Altere a propriedade desses scripts com:
sudo chown $ /usr/local/bin/ubuntu-cmd
sudo chown $ /usr/local/bin/rhel-cmd
Agora temos nossos hosts Ubuntu e RHEL definidos em nosso arquivo de configuração SSH e nossos scripts que são globalmente executáveis. Vamos primeiro executar o script do Ubuntu e enviar o comando sudo apt-get update para nossos servidores Ubuntu. Para isso, o comando seria:
ubuntu-cmd sudo apt-get update
O script verificará o arquivo de configuração SSH para qualquer host que comece com o Ubuntu e, em seguida, solicitará sua senha sudo e sua senha de usuário remoto para cada host. Ele deve executar com sucesso o comando apt-get update em qualquer servidor Ubuntu encontrado no arquivo de configuração SSH.
Em seguida, executaremos sudo dnf update em nossos hosts RHEL com o comando:
rhel-cmd sudo dnf atualização
A mesma coisa acontecerá, apenas o comando dnf update será executado em nossos hosts baseados em RHEL definidos no arquivo de configuração SSH.
E isso é tudo para criar um script para executar um comando em vários hosts definidos em seu arquivo de configuração SSH. Use esta configuração para ver que outras coisas inteligentes você pode fazer porque isso faz parte do poder do Linux.