Gerenciar vários servidores

0

Eu escrevi um script simples que gostaria de executar em vários hosts. (Ou seja, eu quero executar uma instância do script, mas ele deve operar em vários hosts.) O script funciona, mas apenas para o primeiro host. Quando eu adiciono mais de um host, recebo um erro informando:

line 3: MACHINE2: command not found

O que estou fazendo de errado? O script está postado abaixo.

#!/bin/sh

HOSTS=MACHINE1 MACHINE 2

for i in $HOSTS; do echo $i
    ssh -q $i uname -a;
done
    
por Sad Puppy 27.08.2015 / 18:07

1 resposta

1

Um comando como

xyz=abc def ghi jkl

significa executar o programa def com argumentos ghi e jkl , e com a variável de ambiente xyz definida como abc . Para definir HOSTS para a string

MACHINE1 MACHINE 2

você precisaria dizer

HOSTS="MACHINE1 MACHINE 2"

(embora eu assuma que você não quer ter um espaço entre o segundo MACHINE e o 2 .) Você provavelmente poderia fazer isso funcionar já que nomes de host não contêm espaços ou outros caracteres especiais. No entanto, pode ser mais inteligente usar uma matriz:

HOSTS=(MACHINE1 MACHINE2)

for i in "${HOSTS[@]}"
do
    echo "$i"
    ssh -q "$i" uname -a
done

Essa estrutura permite que você tenha elementos de matriz de várias palavras com caracteres especiais:

lyrics=("Twinkle twinkle little *" "How I wonder what you are")

for line in "${lyrics[@]}"
do
    printf "%s\n" "$line"
done

Note que você deve sempre citar todas as referências de variáveis de shell (por exemplo, "${HOSTS[@]}" e "$i" ) a menos que você tenha um bom motivo para não e você está certo de que sabe o que está fazendo. Além disso,

  • Você não precisa de ponto-e-vírgula no final das linhas.
  • É comum em scripts de shell usar letras minúsculas para nomes de variáveis de script já que ALL UPPER CASE é tradicionalmente usado para variáveis do sistema.
  • echo é útil para imprimir strings fixas, mas pode fazer coisas inesperadas com dados arbitrários. É muito mais seguro usar printf .
por 27.08.2015 / 18:31