não é capaz de executar vários comandos em várias máquinas linux?

1

Tenho cerca de 50 máquinas Ubuntu no qual preciso executar comandos abaixo:

sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

Então criei um arquivo de script de shell com os comandos acima como commands.sh e criei outro arquivo chamado machines.text no qual tenho todas as 50 máquinas.

Minha lista de máquinas está neste arquivo machines.text :

somemachineA
somemachineB

E meus comandos estão neste arquivo commands.sh :

#!/bin/bash
sudo apt-get install htop
sudo scp -r [email protected]:/home/todd/pip /tmp/
sudo apt-get install python-pip
sudo pip install --no-index --find-links="file:///tmp/pip/" kazoo
sudo scp -r [email protected]:/home/todd/parallel-gnu.tar /tmp/
sudo su
cd /tmp
tar -xvf parallel-gnu.tar
cd parallel-20101112/
sudo ./configure && make && make install
sudo mkdir /appholder
sudo chown -R golden /appholder/
sudo mkdir -p /opt/lnp
sudo scp [email protected]:/keeper/data/release/comp.tar.gz /opt/lnp/
sudo chown -R golden /opt/lnp/
sudo mkdir -p /comp/core
sudo chown -R golden /comp/core

Eu tenho um script como este execute.sh que estou executando assim ./execute.sh machines.txt :

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "###################################################"
    echo "Machine Name: $line"
    scp commands.sh $line:/tmp/commands.sh
    ssh -t $line 'script /dev/null . /tmp/commands.sh'
    echo "###################################################"
done < "$1"

Depois de executar acima, vejo abaixo o erro e ele não executou nenhum desses comandos em somemachineA :

todd@testMachine:~$ ./execute.sh machines.text
###################################################
Machine Name: somemachineA
todd@somemachineA's password:
commands.sh                                                                                                                                                                                                100%  104     0.1KB/s   00:00
Pseudo-terminal will not be allocated because stdin is not a terminal.
todd@somemachineA's password:
Script started, file is /dev/null
Script done, file is /dev/null
todd@somemachineA:/home/todd$ somemachineB: command not found

O que estou fazendo errado e como posso executar múltiplos comandos linux em várias máquinas linux?

    
por david 02.09.2015 / 08:37

2 respostas

0

Existem várias ferramentas disponíveis para fazer o que você deseja. Meu favorito é o pdsh , que inclui um pdcp (multi-host scp), pdsh (multi-host scp) host ssh) e dshbak (exibir saída de vários hosts agrupada por host) - dshbak é útil porque o pdsh executa comandos em paralelo em vários hosts, não em um host após o outro. Eu usei o pdsh várias vezes em clusters, VMs, servidores de nuvem e pequenos e grandes grupos de máquinas físicas. Ele faz bem o trabalho e é fácil de configurar.

O pdsh está disponível pré-empacotado para a maioria das distros.

Para usá-lo, você criaria um arquivo de hosts (por padrão, / etc / genders) contendo nomes de host e uma lista separada por vírgulas de nomes de "grupos" aos quais eles pertencem. Cada host pode pertencer a um ou mais grupos - por exemplo, alguns hosts podem estar no grupo "webserver", alguns no grupo "dbserver" e todos os hosts no grupo "all". Por exemplo:

somemachineA all
somemachineB all

Então você usaria pdcp para copiar seu script para todos os hosts no grupo "all":

pdcp -g all commands.sh /tmp/

(Nota: / tmp nos hosts remotos devem ser montados com exec privs - padrão para a maioria dos sistemas de arquivos, mas não é incomum que / tmp seja montado noexec para fins de segurança. Nesse caso, pdcp o script para algum outro lugar ou invocá-lo com, por exemplo, bash /tmp/commands.sh em vez de apenas /tmp/commands.sh ?)

Em seguida, execute o script em todos os hosts:

pdsh -g all /tmp/commands.sh >& /tmp/commands.log

(Nota: isso pressupõe que o ssh foi configurado em todos os hosts para login sem senha, isto é, usando uma chave ssh em vez de uma senha. Se não for esse o caso, provavelmente é melhor não redirecionar a saída para um arquivo de log , porque isso tornaria o uso interativo difícil. Você realmente deve configurar os hosts remotos para o acesso à chave ssh e, em seguida, desativar os logins de senha)

quando terminar, você poderá ver o log com o dshbak:

dshbak /tmp/commands.log | less

Finalmente, uma coisa útil para saber sobre o pdsh etc é que, por padrão, ele tentará usar o rsh em vez do ssh. Eu não tenho ideia do porquê, porque ninguém sã usa o rsh mais ... ele é facilmente corrigido, basta criar um arquivo chamado /etc/pdsh/rcmd_default e adicionar uma linha contendo apenas ssh .

    
por 02.09.2015 / 09:59
0

tente substituir

ssh -t $line 'script /dev/null . /tmp/commands.sh'

por

ssh  $line 'bash /tmp/commands.sh'
  • você está criando scripts para / dev / null ??
  • se você estiver executando o comando interativamente, tty será alocado.
por 02.09.2015 / 10:08