Automatizarea administrării sistemului cu ssh și scp

Automatizarea administrării sistemului cu ssh și scp

Dacă trebuie să administrați un număr mare de sisteme Linux / Unix, probabil că aveți nevoie de scripturi pentru a automatiza anumite procese. În cursul muncii de zi cu zi, ar fi trebuit să fi observat că trebuie să efectuați aceleași acțiuni sau acelea similare pe fiecare sistem. Poate că v-ați gândit la modalități de automatizare a acestor procese. Acest lucru este valabil mai ales atunci când deserviți un număr mare de sisteme Linux / Unix configurate în mod egal. În acest articol, vă voi arăta cum să faceți acest lucru cu utilitarele ssh.







Ideea este de a găsi o modalitate de copiere a unor fișiere de pe stația de lucru, în fața căreia eu sunt în prezent pe un număr de stații de lucru sau servere, și apoi rula pe aceste mașini, unele echipe, cum ar fi rularea de instalare rpm sau modificarea unor setări de sistem. Uneori avem nevoie pentru a rula mai întâi pe aceste mașini, unele de comandă și apoi a obține fișierele - rezultatul acestor comenzi.

Pentru a utiliza acest articol, trebuie să înțelegeți elementele de bază ale programării în coajă. Pentru informații despre programarea în shell, a se vedea Katja și Guido Socher în LinuxFocus Shell Programming. De asemenea, aveți nevoie de cunoștințe despre utilitățile ssh, cum ar fi ssh-keygen, ssh-add, ssh, scp sau sftp. Există o implementare liberă a protocolului SSH pentru Linux: OpenSSH. conținând toate aceste instrumente. Există, de asemenea, pagini ale manualului (pagini manuale).

De ce ssh?

Întrebarea este: De ce nu? Puteți utiliza rsh-rcp sau telnet-ftp, dar acestea nu sunt potrivite pentru un mediu neprotejat, cum ar fi Internetul și, eventual, un intranet. Ssh asigură comunicații criptate securizate între două computere dintr-o rețea neprotejată. Nu voi discuta problemele de securitate când folosesc aceste instrumente. Citiți articolul de Georges Tarbouriech Prin tunel.
De fapt, eu, în trecut, am folosit script-uri bazate pe telnet / ftp.

Pentru a copia un fișier dintr-un director local într-un computer la distanță, puteți utiliza comanda:

scp / cale / spre / fișier / fișier1 utilizator @ remote_host: / remotedir / newfile

În acest exemplu, fișierul1 este copiat din directorul local către computerul la distanță (remote_host poate fi fie IP sau numele computerului la distanță) în directorul / remotedir sub noul nume nou nume. O invitație la autentificare este dată sub numele de utilizator. În cazul unei autentificări reușite și dacă utilizatorul are drepturile corespunzătoare, fișierul va fi copiat. Nu puteți specifica un nou nume de fișier. În acest caz, fișierul va fi copiat sub numele vechi. Pe scurt, aceasta înseamnă că fișierul poate fi redenumit atunci când se copiază.
Este posibilă și operarea inversă: puteți copia fișierul de pe un computer la distanță în directorul local:

scp user @ remote_host: / remotedir / fișier / cale / către / local / folder / newfile

Există, de asemenea, o versiune foarte comodă a comenzii scp. Prin specificarea opțiunii "-r", puteți copia directoarele recursiv.

scp -r utilizator @ remote_host: / remotedir.

Această comandă copiază directorul "remotedir" și toate subdirectoarele și fișierele sale de pe computerul la distanță în directorul curent de lucru sub același nume.

Notă: Se presupune că daemonul sshd rulează pe computerul la distanță.

Înregistrarea la distanță folosind ssh

În loc de rlogin sau telnet, puteți folosi o modalitate mai sigură - ssh:

Executați comenzi cu ssh

Puteți utiliza comanda ssh pentru a executa comenzi pe computerul la distanță:

ssh [email protected] df -H

Acest lucru este foarte similar cu sintaxa de înregistrare la distanță. Diferențele încep după numele computerului. Se emite o comandă (în acest exemplu, "df -H") pentru a fi executată pe computerul la distanță. Ieșirea comenzii va fi afișată pe terminal.

Conectarea la un computer la distanță, fără parolă

În loc să utilizați autentificarea prin parolă, puteți utiliza o pereche de chei (publică / privată). Trebuie să generați o pereche de chei. Există un utilitar ssh-keygen, pe care îl puteți folosi pentru a genera cheile pentru ssh:

ssh-keygen -b 1024 -t dsa

Vi se va cere numele cheii private. Numele cheii publice este, de obicei, identic cu cheia privată, cu adăugarea de ".pub". Aici '-b 1024' este numărul de biți ai cheii generate. Dacă această valoare nu este specificată, se va utiliza valoarea implicită. '-t dsa' specifică tipul de cheie creată. Valorile posibile sunt: ​​'rsa1' pentru versiunea protocolului 1 și 'rsa' sau 'dsa' pentru versiunea protocolului 2. Aș recomanda utilizarea versiunii 2 a protocolului SSH. Dar dacă aveți servere vechi care acceptă doar protocolul versiunii 1, trebuie să specificați "-t rsa1" pentru a crea o altă pereche de chei. Dacă specificați "-1" sau "-2", puteți forța versiunea 1 sau 2 a protocolului ssh.

Pentru a utiliza cheia, trebuie să instalați cheia publică pe computerul la distanță. Conținutul fișierului cheie public trebuie copiat sau adăugat în fișier
$ HOME / .ssh / authorized_keys sau $ HOME / .ssh / authorized_keys2. Aveți grijă să nu amestecați cheile pentru diferite versiuni ale protocolului. Pentru versiunea de protocol 1, este folosit author_keys, iar pentru versiunea protocolului 2, este utilizată autorizată_keys2. Dacă ați instalat corect cheia publică, prima dată când vă conectați la acest computer se va cere să introduceți parola de acces (passphrase), iar în caz de eșec, se va solicita parola utilizatorului la distanță. Puteți restricționa conexiunea la sistemul dvs. numai utilizând autentificarea cheilor publice editând fișierul de configurare sshd. Numele fișierului






/ etc / ssh / sshd_config și numele parametrului pe care trebuie să-l modificați este 'PasswordAuthentication'. Înlocuiți acest parametru fără (PasswordAuthentication no) și reporniți sshd.

Până în acest moment, totul este bine. Avem o modalitate sigură de a copia și executa comenzi pe sisteme la distanță. Dar, prin automatizarea unor sarcini, nu trebuie să introduceți parole sau parole. În caz contrar, nu putem automatiza nimic. Desigur, ați putea introduce parolele necesare în fiecare scenariu, dar aceasta nu este o idee bună. Este mai bine să instruiți agentul cheie să aibă grijă de frazele de parolă. ssh-agent este un program destinat să stocheze cheile private folosite pentru autentificarea cheilor publice. Trebuie să rulați agentul cheie:

și adăugați cheile private pe care doriți să le utilizați

id_dsa este un fișier cheie DSA privat, iar identitatea este un fișier cu cheie privată RSA1. Acestea sunt numele de fișiere implicite, datele când se generează chei folosind ssh-keygen. Desigur, vi se va cere să introduceți o expresie de acces înainte ca ssh-add să vă adauge cheia agentului cheie. Lista cheilor adăugate poate fi obținută cu ajutorul comenzii:

Când se utilizează ssh-agent în modul descris mai sus, acesta poate fi utilizat numai de la terminalul în care a fost pornit. Pentru a folosi ssh-agent de la orice terminal pe care îl deschideți, va trebui să lucrați puțin mai mult. Am scris un script atât de mic pentru a rula agentul:

Dacă agentul rulează și se execută, puteți adăuga propriile chei la el. Dar, înainte de aceasta, trebuie să executați fișierul agent_info astfel încât instrumentele ssh să știe unde este localizat agentul dvs.:

Și adăugați-vă cheile cu ssh-add. Puteți adăuga mai multe linii în fișierul .bashrc astfel încât de fiecare dată când noul terminal să fie deschis, fișierul agent_info este executat:

ATENȚIE: Trebuie să vă asigurați computerul pe care utilizați ssh-agent și scriptul de automatizare, pe care îl voi descrie aici. Altfel, dacă cineva accesează contul dvs., el va avea acces la toate serverele cu care comunicați folosind tastele ssh. Pentru tot ce trebuie să plătiți!

Acum este momentul să vă explicați modul în care vom automatiza unele dintre sarcinile administratorului de sistem. Ideea este să executați un anumit set de comenzi pe un anumit set de gazde și să copiați unele fișiere către sau de la aceste gazde. Acesta este modul în care adesea administratorii de sistem trebuie să facă față. Iată scriptul:

Să scriem scriptul ainstal.sh (instalare automată) și să încercăm să îl executăm fără parametri. Vom primi mesajul:

Conform acestui mesaj, dacă nu doriți să executați comenzi, dați argumentul comands.txt numele comands_empty.txt și, dacă nu doriți să trimiteți niciun fișier, dați argumentului files_file numele file_empty.txt. Uneori, la urma urmei, trebuie doar să executați mai multe comenzi, iar în alte cazuri să trimiteți doar mai multe fișiere.

Înainte de a explica script-ul, da un exemplu de utilizare a acestuia: Să presupunem că ați adăugat o rețea de server DNS secundar și-ar dori să-l adăugați la fișierul /etc/resolv.conf. Pentru simplitate, presupuneți că toate computerele dvs. au același fișier resolv.conf. În acest caz, singurul lucru pe care trebuie să faceți este să copiați noul fișier resolv.conf la toate gazdele.
Primul lucru de care aveți nevoie este o listă de gazde. Să le scriem în fișierul hosts.txt. Formatul acestui fișier este astfel încât fiecare linie să conțină numele sau adresa IP a unei singure gazde. Iată un exemplu:

După cum puteți vedea din exemplu, puteți specifica nume complet calificate sau numai o parte care specifică numele computerului. În plus, veți avea nevoie de un fișier în care vor fi înregistrate numele fișierelor care vor fi transferate. Există două tipuri de transmisie:

  • De la gazda locală la gazdele enumerate în fișierul hosts.txt. Acesta este tipul de transmisie de care avem nevoie.
  • De la fiecare gazdă listată în fișierul hosts.txt la gazda locală. Atunci când trebuie să obținem niște fișiere din fiecare gazdă. De exemplu, folosind un script de backup simplu, pe care îl voi descrie mai târziu în acest articol.

Fișierele care urmează să fie transferate sunt listate într-un alt fișier. Să numim acest fișier files_file.txt. Formatul files_file.txt este: Fiecare linie conține informații despre copierea unui singur fișier. Există două direcții posibile de copiere: l2r (local la distanță - de la local la distanță) și r2l (de la distanță la local - de la distanță la local). l2r este atunci când fișierul este copiat de la gazda locală la gazda de la distanță. r2l - când fișierul de la gazda de la distanță este copiat pe fișierul local. Urmând cuvântul cheie de direcție, urmează două nume de fișiere. Câmpurile sunt separate prin spații sau file. Primul fișier este copiat în al doilea, în conformitate cu cuvântul cheie al direcției. Numele de fișier al gazdei la distanță trebuie să fie complet calificat, altfel fișierul va fi copiat în directorul de domiciliu al root-ului utilizatorului. Aici este fișierul nostru file_file.txt:

După cum puteți vedea, am inclus o descriere a structurii sale în fișier. De obicei, includ această descriere în fiecare file_file.txt pe care îl folosesc. Aceasta este o soluție simplă, dar bună pentru documentare. În acest exemplu, dorim să copiem fișierul resolv.conf la computerul la distanță ca /etc/resolv.conf. În scopuri demo, după copierea fișierului pe calculatoarele țintă, am adăugat comanda pentru a schimba proprietarul și grupul fișierului și a afișa conținutul /etc/resolv.conf. Comenzile care trebuie executate sunt plasate într-un fișier separat. Să o numim comands_file.txt. Aici este fișierul nostru comands_file.txt:

Fișierul de comandă conține comenzile care trebuie executate pe fiecare computer listat în fișierul hosts.txt. Comenzile sunt executate secvențial, ceea ce înseamnă că prima comandă este executată mai întâi, apoi cea de-a doua, și așa mai departe.

Ok, acum avem toate fișierele necesare pentru acest exemplu simplu. Singurul lucru rămas este de a specifica modul care se determină care dintre două fișiere: commands_file.txt sau files_file.txt fi prelucrate mai întâi. Puteți transfera fișierele listate în fișierul files_file.txt și apoi executa toate comenzile de pe mașina țintă, un mod de 1. Sau invers, executa comenzi și apoi transferați fișiere, acest mod 2. Acum puteți rula script-ul cu argumentele necesare, după cum urmează :

/ainstall.sh 1 hosts.txt fișiere_file.txt comenzi_file.txt

Un mic sfat: de obicei, numele fișierului files.txt Începeți cu fișiere_ și adăugați un nume descriptiv scurt, de exemplu, files_resolvconf.txt. De asemenea, numesc hosts.txt și comenzi.txt.

/.ssh/agent_info ", este executat. Acest fișier conține informații despre agentul ssh pe care îl executați. Dacă nu utilizați un agent, va trebui să introduceți parole sau passphrases manual, ceea ce înseamnă că nici o automatizare :). Apoi fiecare fișier (gazde, fișiere și comenzi) este verificat pentru existență. Există, de asemenea, un test special pentru files_empty.txt și commands_empty.txt. Dacă ați specificat un astfel de nume, atunci nu este necesară verificarea existenței. Am schimbat această parte a scenariului când am scris acest articol. Anterior a fost doar:

Backup simplu al fișierelor de configurare

Aici este o utilizare mai complicată a acestui script. Ideea este să creați copii de rezervă pentru fișierele de configurare ale tuturor computerelor sau serverelor. În acest scop, am scris un mic script care folosește ainstall.sh:

Ar trebui să aveți un director special numit servere. În acest director ar trebui să existe două fișiere: files_getbackup.txt și ll_servers.txt. Iată fișierul 'files_getbackup.txt':

r2l /root/backup.tgz backup.tgz

'll_servers.txt' conține numele sau gazdele IP care trebuie rezervate. Fiecare nume de gazdă enumerate în fișierul „ll_servers.txt“ trebuie să aibă un director cu același nume, care trebuie să fie fișier commands_make_backups.txt care conține comenzi pentru a crea arhiva /root/backup.tgz de fișiere de configurare pe acea gazdă. Iar directorul este denumit backup. Toate fișierele de rezervă ale acestei gazde vor fi stocate în acest director. Fișierul ll_servers.txt conține:







Trimiteți-le prietenilor: