Automatizați toate lucrurile cu posibilitate partea a doua

Prezentare generală

Aceasta este partea a doua a unui tutorial în două părți despre Ansible. Prima parte este aici. În această parte, veți afla despre rolurile (blocurile de construcție ale lui Ansible), variabilele, buclele, modul de utilizare a rolurilor în playbook-uri și modul de organizare a rolurilor într-o structură de directoare.

roluri

Când gestionați zeci, sute sau mai multe servere, probabil multe dintre ele trebuie configurate în mod similar. Grupuri diferite de servere, cum ar fi serverele web sau serverele de baze de date, necesită o configurație specială a acestora, dar pot împărtăși și alte funcționalități comune. Este, desigur, posibil să copiați sarcinile în jurul valorii de, dar acest lucru devine vechi foarte rapid atunci când se ocupă cu o infrastructură complicată.

Rolele roșii sunt biletul. Manualele pot include roluri. Rolurile pot depinde de alte roluri, iar cele mai bune practici anuale recomandă gruparea gazdelor în fișierul de inventar pe baza rolurilor acestora. Rolurile sunt coloana vertebrală a unei infrastructuri grave gestionate de Anabe. Ca de obicei, încep cu un exemplu și introduc multe dintre capabilitățile de roluri prin exemplu.

Îmi plac aliasurile și funcțiile coajă, pentru că nu-mi pot aminti toate comutatoarele și opțiunile arcane pentru fiecare comandă și pentru că economisesc multă tastare. De asemenea, îmi place să am niște unelte precum htop și tmux pe fiecare server la care mă conectez.

Iată un fișier care conține câteva aliasuri și funcții favorite. O să spun ".gigirc". Apropo, daca v-ati intrebat vreodata ce sufixul 'rc' reprezinta in toate acele fisiere rc, atunci inseamna 'Run Commands'.

alias sv = "sudo vim" alias py = "python" alias pi = "pip install" # Listarea într-un format frumos alias lla = "ls -lAGh" # Find files zero size alias lsz = dimensiunea 0 -exec ls  \; " # Șterge toate fișierele * .pyc recursiv alias rmpyc = "find. -Name" * .pyc "-print0 | xargs -0 rm" # Utilizarea discului care sortează, de asemenea, rezultatele după dimensiune și salvează într- Pscmx * | sortare -nr | tee disk_usage.txt "alias gi =" git "alias gci =" git comanda -a "alias gcia =" git comanda -a -amend "alias gb = git "- alias" git "- alias" git "alias gd =" git diff "alias gl =" git log - line "# Afișează toate fișierele și directoarele netracked în directorul curent alias ng =" git clean -n -d ". # Descărcați și să urmăriți funcția ramificație la distanță gfr git checkout --track -b $ 1 origine / $ 1 # Creați o ramură git la distanță (și locală) de la funcția master gbr gco master gb $ 1 g împinge -u origine $ 1 

Să definim un rol numit "comun" care creează un utilizator numit "gigi", adaugă o cheie publică ssh, copiază fișierul ".gigirc" și adaugă o linie la sfârșitul "~ / .bashrc" care execută acest fișier și instalează pachetele comune vim, htop și tmux (definite în fișierul "vars / main.yml"). 

Voi introduce o mult de lucruri noi aici: patru module diferite, variabile și bucle. De asemenea, rolurile sunt, de obicei, răspândite în mai multe fișiere dintr-o structură de directoare standard. Vă voi arăta câteva fișiere și apoi veți explica structura directorului. Iată fișierul "tasks / main.yml":

--- - nume: creați un utilizator numit gigi user: name = gigi - name: Adăugați cheie publică authorized_key: user = gigi key = "lookup ('file', '/ .ssh / id_rsa.pub' : Copiați fișierul .gigirc în directorul de domiciliu al noului utilizator gigi: src = ~ / .gigirc dest = / home / gigi / .gigirc owner = gigi group = modul gigi = 0644 - name: Rulați .gigirc din .bashrc lineinfile: dest = / home / gigi / .bashrc line = "source /home/gigi/.gigirc" - name: Instalați pachete comune apt: name = update_cache = true force = yes with_items: COMMON_PACKAGES 

Și aici este fișierul vars / main.yml care conține definiția variabilei "COMMON_PACKAGES" utilizată pentru a specifica pachetele comune de instalat.

--- COMMON_PACKAGES: - vim - htop - tmux 

module

Modulul de utilizator poate gestiona conturile de utilizator. Aici îl folosesc pentru a crea "gigi".

Modulul authorized_key este pentru adăugarea / eliminarea cheilor autorizate SSH. Aici îl folosesc pentru a-mi adăuga cheia publică pentru utilizatorul "gigi".

Modulul lineinfile poate fi folosit pentru a înlocui sau adăuga linii unice într-un fișier. În acest caz, îl folosesc pentru a sursa fișierul ".gigirc" de la ".bashrc", astfel încât toate pseudonimele și funcțiile din ".gigirc" sunt întotdeauna disponibile în orice sesiune interactivă.

În sfârșit, modulul apt are multe opțiuni pentru gestionarea pachetelor apt. Aici instalez doar câteva pachete comune.

variabile

COMMON_PACKAGES veți vedea în ultima sarcină pentru instalarea pachetelor comune este o variabilă. Ansible vă permite să utilizați variabile definite aproape oriunde: playbook-uri, inventar, roluri, fișiere dedicate și chiar variabile de mediu. Există mult mai multe informații despre variabile în documentație.

buclele

Ansible este declarativ, deci nu suportă bucle explicite. Dar există o mulțime de with_xxx care vă permite să efectuați operații repetate pe o anumită structură, cum ar fi o listă de utilizatori, pachete. sau linii dintr-un fișier. De asemenea, puteți repeta operațiile până când o anumită condiție este adevărată sau veți obține indexul elementului curent. Informații suplimentare se găsesc în documentație. 

Structura directorului de roluri

Iată ce ar putea să arate o structură tipică a directorului de roluri:

comun

───────────────────────────────

│ └── princip.yml

─ meta

│ └── princip.yml

─ sarcini

│ └── princip.yml

Șabloane ├────────

└──┘

    ├── Debian.yml

    ├─────────────────────

    └── princip.yml

Fișierul 'tasks / main.yml' este locul în care toate sarcinile sunt definite. Fiecare sarcină corespunde unei comenzi Ansible care utilizează în mod obișnuit un modul.

Fișierul "meta / main.yml" va conține o listă a altor roluri de care depinde rolul curent. Sarcinile acestor roluri vor fi executate înaintea rolului actual, astfel încât acesta să poată fi sigur că toate cerințele sale sunt îndeplinite.

Fișierul "handlers / main.yml" este locul în care păstrați agenți de manipulare, cum ar fi cel care ați văzut anterior, care pornește după instalare Nginx.

Directorul de șabloane este locul în care păstrați șabloanele de configurare Jinja2 și alte fișiere pe care doriți să le încărcați și copiați în sistemul destinație.

Directorul vars conține variabile variate și poate conține în mod condiționat valori diferite pentru diferite sisteme de operare (caz de utilizare foarte frecvent).

Este important să rețineți că Ansoft este foarte flexibil și puteți pune ceva aproape oriunde. Aceasta este o singură structură posibilă care are sens pentru mine. Dacă te uiți la structurile de directoare ale altor persoane, s-ar putea să vezi ceva complet diferit. E în regulă. Nu fi alarmat. Ansible nu este prescriptivă, deși oferă îndrumări pentru cele mai bune practici.

Utilizarea rolurilor

Rolurile fac lifting grele, dar playbook-urile sunt modul în care faci de fapt munca. Playbook-urile se căsătoresc cu inventarul și rolurile și specifică rolurile pe care să le joace pe care gazdă. Iata ce arata un playbook cu roluri:

--- - gazde: toate rolurile: - roluri / comune 

Rularea manualului de redare produce următoarea ieșire:

an-playbook -i găzduiește playbook_with_roles.yml --sudo PLAY ***************************************** ************************************** SARCINA [configurare] ******** ************************************************** ********* ok: [larry] ok: [moe] ok: [curly] SARCINA [roluri / comune: crea un utilizator numit gigi] ************** ******************* schimbat: [curly] schimbat: [moe] schimbat: [larry] SARCINA [roluri / comune: Adăugați cheia publică] ****** ************************************* schimbat: [larry] schimbat: [curly] schimbat: [ ] modificat: [moe] schimbat: [larry] schimbat: [curly] SARCINA [roluri / comune: Instalarea pachetelor comune ] ********************************** schimbat: [curly] => (item = [u'vim ' , u'htop ', u'tmux']) s-a schimbat: [moe] => (item = [u'vim ', u'htop', u'tmux ' u'vim ', u'htop', u'tmux ']) PLAY RECAP ******************************** ************************************* curly: ok = 5 schimbat = 4 un accesibil = 0 eșuat = 0 larry: ok = 5 schimbat = 4 nerealizabil = 0 eșuat = 0 moe: ok = 5 schimbat = 4 nerealizabil = 0 eșuat = 0

Concluzie

Ansible este un instrument excelent. Este ușor. Poate fi folosit interactiv cu comenzile ad-hoc, și se calculează foarte bine sistemelor masive. De asemenea, are o mulțime de impuls și o mare comunitate. Dacă gestionați sau chiar pur și simplu lucrați cu servere de la distanță, doriți Ansible.

Cod