[#] Automatyczna administracja serwerami przez ssh

( Ostatnio zmieniony czw., 12/06/2008 - 14:19 )
 

Jeśli administrujemy większą ilością komputerów, instalacja lub wykonywanie tych samych zdalnych czynności może nasunąć nam się pytanie: Czy nie da sie tego zrobić automatem? Otóż da się.

Poniższy opis pokazuje jak wykonać skrypt do zdalnej administracji wieloma serwerami na raz (równolegle)

Przykład użycia w praktyce

Przypuśćmy, że uruchomiłeś zapasowy serwer DNS i chcesz go dodać do pliku ‚/etc/resolv.conf‘. Dla ułatwienia przypuśćmy również, że wszystkie maszyny mają taki sam plik ‚resolv.conf‘, jedyną rzeczą do zrobienia, jest skopiowanie nowego pliku na wszystkie inne komputery.

Skrypty oraz większa część opisu pochodzi ze strony autora: http://www.linuxfocus.org/…cle278.shtml i to jemu należy się pochwała i uznanie.


Informacja:

Do całej zabawy potrzebujemy wyeksportować klucz publiczny ssh na zdalny serwer tak aby ten nie żądał od nas podawania hasła. Opis jak to wykonać znajdziesz na stronie: „http://ni.re­coverydata.pl/con­tent/u%C5%BCy­teczne-opcje-ssh-praca-zdalna“


Uruchomienie „na sucho“:

./ainstall.sh

Użycie : $0 tryb lista_hostow lista_plikow lista_polecen
  tryby 1 lub 2
    1 : najpierw skopiuj pliki, pozniej wykonaj polecenia.
    2 : najpierw wykonaj polecenia, pozniej kopiuj pliki.
  Jeśli nazwa lista_plikow podana jest jako lista_plikow_empty wtedy nie jest brana pod uwagę"
  Jeśli nazwa lista_polecen podana jest jako lista_polecen_empty wtedy nie jest brana pod uwagę

Uruchomienie użyteczne:

./ainstall.sh 1 lista_hostow.txt lista_plikow.txt lista_polecen.txt

Zgodnie z wiadomością, jeżeli nie chcesz wykonać żadnej komendy, wtedy jako argumentu dla ‚lista_polecen‘ użyj ‚lista_polecen_em­pty.txt‘, natomiast, jeżeli nie masz zamiaru kopiować plików użyj wartości ‚lista_plikow_em­pty.txt‘ dla opcji ‚lista_plikow‘. Nie zawsze przecież jednocześnie kopiujesz lub wykonujesz jakieś polecenia.

SKRYPTY:

ainstall.sh

#!/bin/sh

# Instalowanie wszystkiego z użyciem Secure SHELL i SSH agent
# Erdal MUTLU
# 11.03.2001


##################################################################
#                     Funkcje                                    #
##################################################################
### Kopiuje pliki pomiędzy hostami
kopiuj_pliki()
{
 if [ $lista_plikow != "lista_plikow_empty.txt" ];then
  cat $lista_plikow | grep -v "#" | while read -r line
  do
   direction=`echo ${line} | cut -d " " -f 1`
   plik1=`echo ${line}     | cut -d " " -f 2`
   plik2=`echo ${line}     | cut -d " " -f 3`

   case ${direction} in
      "l2r") :  ### Z localhost do zdalnego hosta
          echo "$plik1  --> ${host}:${plik2}"
          scp $plik1 root@${host}:${plik2}
      ;;
      "r2l") :  ### Ze zdalnego hosta na localhost
          echo "${host}:${plik2}  --> localhost:${plik2}"
          scp root@${host}:${plik1} ${plik2}
      ;;
      *)
          echo "Nieznana dyrektywa : ${direction}"
          echo "Musi być przynajmniej lokalny lub zdalny."
      ;;
   esac
  done
 fi
}

### Wykonaj polecenia na zdalnym hoście
wykonaj_polecenia()
{
 if [ $lista_polecen != "lista_polecen_empty.txt" ];then
  cat $lista_polecen | grep -v "#" |  while read -r line
  do
   command_str="${line}"
   echo "Wykonywanie $command_str ..."
   ssh -x -a root@${host}  ${command_str} &
   wait $!
   echo "Wykonanie $command_str OK."
  done
 fi
}

### Funkcja wrapper do wykonywania poleceń i kopiowania plików
doit()
{
 cat $lista_hostow | grep -v "#" | while read -r host
 do
  echo "host=$host wykonywanie..."
  case "${tryb}" in
        "1")
                kopiuj_pliki
                wykonaj_polecenia
                ;;
        "2")
                wykonaj_polecenia
                kopiuj_pliki
                ;;
        *)
                echo "$0 : Nieznany tryb : ${tryb}"
                ;;
  esac
  echo "host=$host ok."
  echo "------------------------------------------------------------------"
 done
}

##################################################################
### Program zaczyna się tutaj
##################################################################

if [ $# -ne 4 ]; then
 echo "Użycie : $0 tryb lista_hostow lista_plikow lista_polecen"
 echo ""
 echo "tryby 1 lub 2 "
 echo "    1 : najpierw skopiuj pliki, pozniej wykonaj polecenia."
 echo "    2 : najpierw wykonaj polecenia, pozniej kopiuj pliki."
 echo "Jeśli nazwa lista_plikow podana jest jako lista_plikow_empty wtedy nie jest brana pod uwagę"
 echo "Jeśli nazwa lista_polecen podana jest jako lista_polecen_empty wtedy nie jest brana pod uwagę"
 exit
fi


tryb=$1
lista_hostow=$2
lista_plikow=$3
lista_polecen=$4

agent_info_file=~/.ssh/agent_info
if [ -f $agent_info_file ]; then
 . $agent_info_file
fi

if [ ! -f $lista_hostow ]; then
 echo "Plik z listą hostów : $lista_hostow nie istnieje!"
 exit 1
fi

if [ $lista_plikow != "lista_plikow_empty.txt" -a ! -f $lista_plikow ]; then
  echo  "Plik z listą plików : $lista_plikow nie istnieje!"
  exit 1
fi

if [ $lista_polecen != "lista_polecen_empty.txt" -a ! -f $lista_polecen ]; then
 echo  "Plik z listą poleceń : $lista_polecen nie istnieje!"
 exit 1
fi

#### Do everything there
doit

hosts.txt

##########################################################################
#### Każda linia zawiera jedną nazwę lub adres IP komputera. Linie, które
#### rozpoczynają się  od znaku # są ignorowane.
##########################################################################
helvetica.fonts.de
optima.fonts.de
zaphino
vectora
#10.10.10.162
10.10.10.106
193.103.125.43
10.53.103.120

lista_polecen.txt

###########################################################################
# Struktura pliku jest następująca: każda linia zawiera polecenie do
# wykonania. Polecenia wykonywane są po kolei.
###########################################################################
chown root.root /etc/resolv.conf
chmod 644 /etc/resolv.conf
cat /etc/resolv.conf

lista_plikow.txt

############################################################################
# Struktura pliku:
# - Znaczenie wpisów: l2r (localhost to remote) and r2l
# (remote computer to local).
#       r2l  file1   file2
#         znaczy skopiuj plik1 z hosta zdalnego (hosty znajdują się
#         w pliku lista_hostow.txt ) na lokalny komputer jako plik2.
#       l2r     plik1   plik2
#         znaczy skopiuj file1 z lokalnej maszyny na zdalny komputer
#          (hosty znajdują się w pliku lista_hostow.txt) jako plik2
#
#       Notka: cały proces jest zależny od dyrektywy
#       określającej kierunek.
############################################################################
l2r     resolv.conf     /etc/resolv.conf
Twoja ocena: Brak Średnio: 5 (1 vote)

Dodaj nową odpowiedź

Informacja:

Osoby zamieszczające wypowiedzi naruszające prawo lub prawem chronione dobra osób trzecich, mogą ponieść z tego tytułu odpowiedzialność karną lub cywilną. Upewnij się, że twoja wypowiedź nie godzi w niczyje mienie.

  • Internal paths in single or double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or path. Paths to files in single or double quotes, written as "files:somefile.ext", for example, are replaced with the appropriate URL that can be used to download the file.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <strong> <blockquote> <code>
  • Znaki końca linii i akapitu dodawane są automatycznie.

Więcej informacji na temat formatowania

Łapirobot
Proszę odpowiedzieć
7
W
x
V
A
n
t
y
h
M
Enter the code without spaces and pay attention to upper/lower case.