Como executar vários comandos remotamente em poucos servidores?

3

Estou tentando automatizar essas etapas para que eu não precise fazer isso em todas as máquinas manualmente. Eu preciso instalar o software mais recente do servidor de aplicativos (abc.tar.gz) em todas as caixas unix.

Eu preciso fazer isso em cerca de 12 máquinas - "machine1" ... "machine12" . Eu tenho uma máquina mestra "machine0" que tem abc.tar.gz arquivo, então eu estava pensando em executar o meu script apenas desta máquina e instalar o software abc.tar.gz seguindo as etapas abaixo em todas as 12 máquinas, uma por uma. Meu ID de conta unix é david e meu processo é executado como golden user.

Estas são as etapas que eu sigo quando estou instalando abc.tar.gz em "machine1":

david@machine1:~$ sudo scp david@machine0:/home/david/abc.tar.gz .
david@machine1:~$ sudo stop test_server
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ rm -rf *
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo cp abc.tar.gz /opt/process
david@machine1:~$ sudo chown -R golden /opt/process
david@machine1:~$ sudo su - golden
golden@machine1:~$ cd /opt/process
golden@machine1:/opt/process$ tar -xvzf abc.tar.gz
golden@machine1:/opt/process$ exit
david@machine1:~$ sudo start test_server

Como posso automatizar isso para que ele possa executar as mesmas etapas em todas as 12 máquinas, uma por uma? Quero dizer, instale abc.tar.gz em machine1 primeiro, depois instale em machine2 e vá em frente. Eu quero executar este script apenas em machine0 .

Existe alguma maneira de automatizar isso?

    
por user1950349 30.03.2016 / 01:39

4 respostas

5

Eu recomendaria uma ferramenta de provisionamento como Fabric ou Assistente para isso. Ambos são razoavelmente fáceis de configurar, e permitirão que você faça mais do que o comando que você precisa neste caso, já que você pode construir seus playbooks iniciais ou fabfiles dependendo de qual ferramenta você escolher.

Os documentos do Fabric podem ser encontrados aqui: link Os documentos do Ansible podem ser encontrados aqui: link

Você precisará de um pouco de conforto com chaves SSH e configurações SSH para ambas as ferramentas, que também podem ser encontradas nos documentos.

    
por 30.03.2016 / 01:55
1

Em termos de um script, você pode estar olhando para algo como:

MACHINES = (
  'machine1'
  'machine2'
  ...
)
for machine in "${MACHINES[@]}"; do
  # insert sequence of setup steps here.
done

Esta é uma maneira rápida e suja de ter um script de implantação em várias máquinas. É claro que existem outras formas mais "profissionais" de realizar essa tarefa, mas geralmente isso é suficiente e sustentável.

    
por 30.03.2016 / 03:39
1
O

pdsh pode fazer o que você quiser. Por padrão, ele funcionará em várias máquinas ao mesmo tempo em paralelo, mas você pode usar a opção -f para limitá-lo a execução em cada máquina, uma de cada vez, se desejar.

por exemplo,

# copy abc.tar.gz to /home/david on machine1..machine12
pdcp -w machine[1-12] abc.tar.gz /home/david

# run a bunch of commands on machine1..machine12
# be careful of quoting
pdsh -w machine[1-12] 'sudo stop service ; do something ; do something else ;
                       sudo start service'

Como alternativa, em vez de colocar todos os comandos em aspas simples ou duplas na linha de comando pdsh , você pode pdcp um script de shell para as máquinas remotas e executá-lo com um único comando.

pdcp -w machine[1-12] abc.tar.gz /home/david
pdcp -w machine[1-12] ./my-script.sh /tmp
pdsh -w machine[1-12] sh -c '/tmp/my-script.sh'

(use sh -c apenas no caso de /tmp ser montado noexec)

Isso é particularmente útil se você quiser evitar confusões ao ter vários níveis de cotações aninhadas (por exemplo, se precisar executar alguns comandos com sudo ou su ou incorporar awk ou sed ou qualquer script). Geralmente, é muito mais simples escrever um script de shell normal (ou awk ou perl ou qualquer outro), copiá-lo para onde for necessário e executá-lo lá.

pdsh também permite que você use um arquivo chamado /etc/genders para definir máquinas e quais atributos (arbitrários) você atribui a elas. por exemplo,

machine0        master,all
machine[1-12]   machines,all
web[1-4]        webservers,all
db[1-2]         mysql,db,all

Você pode selecionar as máquinas por atributo na linha de comando pdsh ou pdcp com -g , por exemplo, pdcp -g machines abc.tar.gz /home/david ou pdsh -g all uname -a ou pdsh -g web,db,master uptime .

pdsh foi escrito para uso em clusters HPC, mas descobri que ele é igualmente útil para a administração em massa de qualquer grupo de máquinas.

BTW, pdsh é um tipo diferente de ferramenta para puppet ou ansible ou cfengine etc - eles são para instalar e manter um ambiente consistente em um grupo de máquinas (como um cluster ou um Fazenda de VM, etc). pdsh é mais para executar comandos únicos e / ou cópias (de ou para) no mesmo grupo de máquinas.

    
por 30.03.2016 / 06:15
0

Eu prefiro usar xargs para essas tarefas. Como exemplo

#/bin/sh
cat serverlist.txt | xargs -I % sh -c 'ssh root@% 'date';'echo test''

E serverlist.txt contém o IP / hostnames newline separado.

Para um maior parque de servidores, é melhor usar ferramentas como ansible .

    
por 30.03.2016 / 06:25