Tutorial Ansible pentru începători: manual, comenzi și exemple

Ce este Ansible?

ansiblu este un instrument de automatizare și orchestrare open source pentru furnizarea de software, gestionarea configurației și implementarea software-ului. Ansible poate rula și configura cu ușurință sisteme asemănătoare Unix, precum și Windows sisteme pentru a furniza infrastructura ca cod. Conține propriul său limbaj de programare declarativ pentru configurarea și managementul sistemului.

Ansible este popular pentru simplitatea instalării, ușurința în utilizare în ceea ce privește conectivitatea la clienți, lipsa de agent pentru clienții Ansible și multitudinea de abilități. Funcționează prin conectarea prin SSH către clienți, deci nu are nevoie de un agent special pe partea clientului, iar prin împingerea modulelor către clienți, modulele sunt apoi executate local pe partea clientului și ieșirea este împinsă înapoi către serverul Ansible.

Deoarece folosește SSH, se poate conecta foarte ușor la clienți folosind SSH-Keys, simplificând tot procesul. Detaliile clientului, cum ar fi numele de gazdă sau adresele IP și porturile SSH, sunt stocate în fișiere numite fișiere de inventar. Odată ce ați creat un fișier de inventar și l-ați populat, ansible îl poate folosi.

De ce să folosiți Ansible?

Iată câteva avantaje/beneficii importante ale utilizării Ansible

  • Unul dintre cele mai semnificative avantaje ale lui Ansible este că este liber de utilizat de către toată lumea.
  • Nu necesită abilități speciale de administrator de sistem pentru a instala și utiliza Ansible, iar documentația oficială este foarte cuprinzătoare.
  • Modularitatea sa în ceea ce privește pluginurile, modulele, inventarele și manualele fac din Ansible însoțitorul perfect pentru a orchestra medii mari.
  • Ansible este foarte ușor și consistent și nu sunt prezente constrângeri privind sistemul de operare sau hardware-ul de bază.
  • De asemenea, este foarte sigur datorită capabilităților sale fără agent și datorită utilizării caracteristicilor de securitate OpenSSH.
  • Un alt avantaj care încurajează adoptarea Ansible este curba de învățare lină, determinată de documentația cuprinzătoare și structura și configurația ușor de învățat.

Istoria lui Ansible

Iată reperele importante din istoria ansiblelor:

  • În februarie 2012 a început proiectul Ansible. A fost dezvoltat pentru prima dată de Michael DeHaan, creatorul Cobbler și Func, Fedora Unified Network Controller.
  • Numită inițial AnsibleWorks Inc, compania care finanțează instrumentul ansible a fost achiziționată în 2015 de RedHat și mai târziu, împreună cu RedHat, sa mutat sub umbrela lui. IBM.
  • În prezent, Ansible este inclus în distribuții precum Fedora Linux, RHEL, Centos și Oracle Linux.

Termeni importanți utilizați în Ansible

  • Server Ansible

    Mașina în care este instalat Ansible și de pe care vor fi rulate toate sarcinile și manualele

  • Module

    Practic, un modul este o comandă sau un set de comenzi similare Ansible menite să fie executate pe partea clientului

  • Sarcină

    O sarcină este o secțiune care constă dintr-o singură procedură care trebuie finalizată

  • Rol

    O modalitate de organizare a sarcinilor și a fișierelor aferente care urmează să fie apelate ulterior într-un manual

  • Fapt

    Informații preluate din sistemul client din variabilele globale cu operația gather-facts

  • Inventar

    Fișier care conține date despre serverele client ansible. Definit în exemplele ulterioare ca fișier hosts

  • Joaca

    Executarea unui playbook

  • Manipulant

    Sarcină care este apelată numai dacă este prezent un notificator

  • Notifier

    Secțiune atribuită unei sarcini care apelează un handler dacă rezultatul este modificat

  • Etichetă

    Nume setat la o sarcină care poate fi folosită mai târziu pentru a emite doar acea sarcină sau grup de sarcini.

Instalare Ansible în Linux

Odată ce ați comparat și cântărit opțiunile și ați decis să alegeți Ansible, următorul pas este să îl instalați pe sistemul dvs. Vom parcurge pașii instalării în diferite Linux distribuții, cele mai populare, în următorul mic tutorial.

Instalați Ansible pe sistemele Centos/RedHat

Pas 1) Instalați EPEL repo

[root@ansible-server ~]# sudo yum install epel-release

Pas 2) Instalați pachetul ansible

[root@ansible-server ~]# sudo  yum install -y ansible

Instalați Ansible pe sistemele Centos/RedHat

Instalați ansible pe Ubuntu/sisteme Debian

Pas 1) Efectuați o actualizare a pachetelor

$ sudo apt update

Pas 2) Instalați pachetul software-properties-common

$ sudo apt install software-properties-common

Pas 3) Instalați arhiva de pachete personale ansible

$ sudo apt-add-repository ppa:ansible/ansible

Pas 4) Instalați ansible

$ sudo apt update
$ sudo apt install ansible

Comenzi ad-hoc Ansible

Una dintre cele mai simple moduri în care Ansible poate fi utilizat este utilizarea comenzilor ad-hoc. Acestea pot fi folosite atunci când doriți să lansați unele comenzi pe un server sau pe o grămadă de servere. Comenzile ad-hoc nu sunt stocate pentru utilizări viitoare, ci reprezintă o modalitate rapidă de a interacționa cu serverele dorite.

Pentru acest tutorial Ansible, va fi configurat un simplu fișier hosts cu două servere, care conține host1 și host2.

Vă puteți asigura că gazdele sunt accesibile de pe serverul ansible lansând o comandă ping pe toate gazdele.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Comenzi ad-hoc Ansible

Explicaţie:

  1. Starea comenzii, în acest caz, SUCCES
  2. Gazdă pe care a rulat comanda
  3. Comanda emisă prin parametrul -m, în acest caz, ping
  4. Cu parametrul -i, puteți indica fișierul hosts.


Puteți lansa aceeași comandă numai pe o anumită gazdă dacă este necesar.

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Comenzi ad-hoc Ansible

Explicaţie:

  1. Parametrul limită poate fi folosit pentru a lansa comenzi numai pe anumite gazde din fișierul gazdei
  2. Numele gazdei așa cum este definit în fișierul de inventar

Dacă trebuie să copiați rapid un fișier către mai multe destinații, puteți utiliza modulul de copiere din ansible care utilizează SCP. Deci comanda și rezultatul acesteia arată ca mai jos:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Comenzi ad-hoc Ansible

Explicaţie:

  1. Modul de copiere definit
  2. Argumentele modulului, în acest caz, sunt calea absolută sursă și calea absolută destinație.
  3. Ieșirea comenzii Ansible care reflectă succesul comenzii de copiere și alte detalii, cum ar fi sumele de verificare sha1 sau md5 pentru verificarea integrității fișierelor și metadate precum proprietarul, dimensiunea sau permisiunile. Este ușor să aveți un pachet instalat pe o mulțime de servere. Ansible are mai multe module care interacționează cu instalatorii uzați, cum ar fi yum, apt, dnf etc.

În exemplul următor, veți afla cum să instalați un pachet prin modulul yum pe două gazde Centos.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Comenzi ad-hoc Ansible

Explicaţie:

  1. Modulul Yum este folosit în acest exemplu
  2. Acesta definește argumentele modulului, iar în acest caz, veți alege numele pachetului și starea acestuia. Dacă starea este absentă, de exemplu, pachetul va fi căutat și dacă este găsit, eliminat
  3. Când este colorat în galben, veți vedea ieșirea comenzii ansible cu starea schimbată, adică în acest caz, pachetul a fost găsit și instalat.
  4. Starea comenzii yum install emisă prin ansible. În acest caz a fost instalat pachetul ncdu.x86_64 0:1.14-1.el7.

Desigur, toate opțiunile de instalare yum pot fi utilizate prin ansible, inclusiv actualizarea, instalarea, cea mai recentă versiune sau eliminarea.

În exemplul de mai jos, aceeași comandă a fost emisă pentru a elimina pachetul ncdu instalat anterior.

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Comenzi ad-hoc Ansible

Explicaţie:

  1. Ieșirea comenzii yum arată că pachetul a fost eliminat.

O altă caracteristică utilă și esențială pe care ansible o folosește pentru a interacționa cu serverul clientului este adunarea unor date despre sistem. Deci, preia informații despre hardware, software și versiuni din sistem și stochează fiecare valoare într-o variabilă care poate fi utilizată ulterior.

Dacă aveți nevoie de informații detaliate despre sistemele care urmează să fie modificate prin ansible, se poate folosi următoarea comandă. Modulul de configurare adună date din variabilele de sistem.

Comenzi ad-hoc Ansible

Ansible Playbooks

Ansible Playbooks sunt modalitatea de trimitere a comenzilor către sistemele de la distanță prin intermediul scripturilor. Manualele Ansible sunt folosite pentru a configura medii de sistem complexe pentru a crește flexibilitatea prin executarea unui script pe unul sau mai multe sisteme. Manualele Ansible tind să fie mai mult un limbaj de configurare decât un limbaj de programare.

Comenzile Ansible Playbook folosesc formatul YAML, deci nu este nevoie de multă sintaxă, dar indentarea trebuie respectată. După cum spune și numele, un playbook este o colecție de piese de teatru. Printr-un manual, puteți desemna roluri specifice unor gazde și alte roluri altor gazde. Procedând astfel, puteți orchestra mai multe servere în scenarii foarte diverse, toate într-un singur manual.

Pentru a avea toate detaliile precise înainte de a continua cu exemplele de manuale Ansible, trebuie mai întâi să definim o sarcină. Acestea sunt interfața cu modulele ansible pentru roluri și manuale.

Acum, să învățăm Ansible Playbook printr-un exemplu cu un playbook cu o singură piesă, care conține mai multe sarcini, după cum urmează:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible Playbooks

În exemplul de mai sus Ansible Playbook, grupul1 de gazde din fișierul gazdei este țintit pentru instalarea pachetului lldpad folosind modulul yum și ulterior serviciul lldpad creat după instalare este apoi pornit folosind modulul de serviciu folosit în principal pentru a interacționa cu ansamblul systemd.

Explicaţie:

  1. Grup de gazde pe care va rula playbook-ul
  2. Modulul Yum este utilizat în această sarcină pentru instalarea lldpad
  3. Modulul de service este utilizat pentru a verifica dacă serviciul funcționează și funcționează după instalare

Fiecare playbook ansible funcționează cu un fișier de inventar. Fișierul de inventar conține o listă de servere împărțite în grupuri pentru un control mai bun pentru detalii precum Adresa IP și port SSH pentru fiecare gazdă.

Fișierul de inventar pe care îl puteți utiliza pentru acest exemplu de manual Ansible arată ca mai jos. Există două grupuri, numite group1 și group2, fiecare care conține gazda1 și, respectiv, gazdă2.

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible Playbooks

Explicaţie:

  1. Numele grupului
  2. Nume gazdă, cu adresa IP și portul ssh, în acest caz, cel implicit, 22.

Un alt exemplu util de carte de joc Ansible care conține de data aceasta două piese pentru două gazde este următorul. Pentru primul grup de gazde, group1, selinux va fi activat. Dacă este activat, atunci va apărea un mesaj pe ecranul gazdei.

Pentru al doilea grup de gazde, pachetul httpd va fi instalat numai dacă ansible_os_family este RedHat și ansible_system_vendor este HP.

Ansible_os_family și ansible_system_vendor sunt variabile adunate cu opțiunea gather_facts și pot fi folosite ca în acest exemplu condiționat.

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible Playbooks

Explicaţie:

  1. Exemplu de clauză when, În acest caz, când tipul de sistem de operare este Debian. Variabila ansible_os_family este adunată prin funcționalitatea gather_facts.
  2. Ieșirea sarcinii este înregistrată pentru utilizare ulterioară, cu numele enable_selinux
  3. Un alt exemplu de clauză when. În acest caz, va fi afișat un mesaj pentru utilizatorul gazdă dacă SELinux a fost într-adevăr activat înainte.
  4. Un alt exemplu de clauză when constând din două reguli

Pe lângă sarcini, există și unele sarcini speciale numite handler. Manipulatorii trebuie să aibă un nume unic pe tot parcursul manualului. Acestea funcționează în același mod ca o sarcină obișnuită, dar un handler poate fi notificat prin intermediul unui notificator.

Dacă un handler nu este notificat în timpul rulării playbook-ului, acesta nu va rula. Cu toate acestea, dacă mai multe sarcini notifică un handler, aceasta va rula o singură dată după ce toate sarcinile sunt terminate.

În exemplul de mai jos, puteți vedea cum o anumită sarcină are o secțiune de notificare care apelează la o altă sarcină. Dacă rezultatul primei sarcini este modificat, atunci va fi apelată o sarcină de gestionare. Cel mai bun exemplu este schimbarea unui fișier de configurare și apoi repornirea serviciului respectiv.

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

În acest caz, dacă prima sarcină, „sshd config file modify port”, este schimbată, ceea ce înseamnă că, dacă portul nu este 28675 în primul rând, atunci acesta va fi modificat și sarcina va notifica handler-ul cu același nume să ruleze , și va reporni serviciul sshd.

Ansible Playbooks

Explicaţie:

  1. Exemplu de notificator
  2. Exemplu de manipulator

Roluri Ansible

Când aveți de-a face cu manuale extinse, este mai ușor să împărțiți sarcinile în roluri. Acest lucru ajută și la reutilizarea rolurilor în viitor. Rolurile sunt o colecție de sarcini, care pot fi mutate de la un playbook la altul, pot fi rulate independent, dar numai printr-un fișier playbook.

Rolurile sunt stocate în directoare separate și au o anumită structură de directoare.

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

Fișierul yaml din directorul implicite conține o listă de variabile implicite care urmează să fie utilizate împreună cu manualul de joc. Directorul handlers este folosit pentru a stoca handlers. Meta-directorul ar trebui să aibă informații despre autor și dependențele de rol. În directorul tasks, există fișierul principal yaml pentru rol.

Directorul de teste conține un exemplu de fișier Yaml Playbook și un fișier de inventar eșantion și este folosit în principal în scopuri de testare înainte de a crea rolul real.

Directorul vars conține fișierul yaml în care vor fi definite toate variabilele utilizate de rol. Șabloanele de director și fișierele de director ar trebui să conțină fișiere și șabloane care vor fi utilizate de sarcinile din rol.

Pentru a crea arborele de director pentru un rol, ar trebui să utilizați următoarea comandă cu ultimul parametru, numele rolului:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible funcționează bine și cu șabloane. Ca limbaj pentru șabloane, folosește Jinja2.

În exemplul următor, veți afla cum arată un șablon jinja2 de bază și îl veți folosi într-un rol.

În timpul rulării, în funcție de, să spunem în ce centru de date se află serverul dvs., puteți selecta dintre mai multe servere de nume, fiecare corespunzând unui centru de date, folosind variabila „resolver_ip_addresses”.

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

În acest exemplu, în directorul playbook, sunt definite câteva variabile, inclusiv o variabilă numită resolver_ip_addresses cu valori diferite în funcție de centrul de date.

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	

Roluri Ansible

Explicaţie:

  1. Numele șablonului care va fi utilizat. Șablonul se află în directorul de șabloane din calea rolului
  2. Calea de destinație a numelui fișierului care urmează să fie înlocuit cu șablonul, pe partea clientului.
  3. Permisiunile fișierului destinație

Sarcinile de roluri pot avea și un câmp de etichetă, căruia i se atribuie un nume. Mai multe sarcini pot partaja aceeași etichetă. Când rulați un manual de joc ansible, puteți specifica și eticheta, astfel încât acele sarcini să fie executate.

Studiu de caz Ansible

În această secțiune, vom analiza un studiu de caz al unui manual de joc esențial care are trei roluri. Scopul acestui lucru este de a da un exemplu practic despre ceea ce am vorbit mai înainte. Unele dintre exemplele folosite anterior în acest tutorial Ansible Playbook vor fi adaptate și utilizate în acest manual.

Mai jos este structura de directoare a playbook-ului. Fișierul Yaml care va fi utilizat va fi p4.yml.

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

Playbook-ul are trei roluri, unul numit resolver care setează un anumit server de nume pe servere prin copierea unui fișier de pe server în destinația /etc/resolv.conf. Un altul se numește httpd și instalează pachetul httpd cu modulul yum, iar al treilea activează SELinux și anunță utilizatorul conectat să repornească sistemul. Fiecare rol a fost creat folosind comanda ansible-galaxy.

Rol de rezolvare, sarcină main.yml:

Studiu de caz Ansible

Rol Httpd, sarcină main.yml:

Studiu de caz Ansible

Rol Selinux, sarcină main.yml:

Studiu de caz Ansible

Mai jos este definit playbook-ul p4.yml. Acesta va rula pe toate gazdele dacă nu se specifică altfel în linia de comandă, va rula ca utilizator root pe portul 22 (SSH), va aduna date înainte de a rula rolurile și va rula toate cele trei roluri menționate anterior. Fiecare rol poate fi rulat independent prin specificarea etichetei în linia de comandă ansible-playbook cu parametrul –t.

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

Rularea playbook-ului p4.yml pe două gazde și interpretarea rezultatului. Aceeași comandă poate fi rulată cu parametrul –check pentru o funcționare uscată. În cazul în care doriți să utilizați autentificarea prin parolă, utilizați parametrul -k.

Studiu de caz Ansible

Explicaţie:

  1. Comanda Ansible-playbook care rulează p4.yml
  2. Playbook omite rolul SELinux deoarece este deja activat.
  3. Ansible a constatat că pachetul httpd este deja instalat, deci se întoarce ok.
  4. Resolverul a fost setat, iar starea de rezolvare a rolului a fost schimbată.

Ansible Commands Cheat Sheet

Instalați EPEL repo pe sistemele Centos/RHEL

[root@ansible-server ~]# sudo yum install epel-release

Instalați pachetul ansible pe sistemele Centos/RHEL

[root@ansible-server ~]# sudo  yum install -y ansible

Efectuați o actualizare a pachetelor de pe Debian/Ubuntu sisteme

$ sudo apt update

Instalați pachetul software-properties-common pe Debian/Ubuntu sisteme

$ sudo apt install software-properties-common

Instalați arhiva de pachete personale ansible pe Debian/Ubuntu sisteme

$ sudo apt-add-repository ppa:ansible/ansible

Instalați ansible pe Debian/Ubuntu sisteme

$ sudo apt update
$ sudo apt install ansible

Lansați o comandă ping pe toate serverele definite în fișierul de inventar numit hosts

 
[root@ansible-server test_ansible]# ansible -i hosts all -m ping

Emite o comandă ping numai pe host2

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

Copiați fișierul „testfile” pe toate gazdele din fișierul de inventar

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

Instalați pachetul ncdu pe toate gazdele

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

Eliminați pachetul ncdu de pe toate gazdele

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

Construiți structura de director pentru rolul numit rol1.

[root@ansible-server test2]# ansible-galaxy init role1

Caietul de joc p4.yml de rulare uscată

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

Rulați playbook-ul p4.yml cu autentificare prin parolă pentru toate gazdele

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

Rezumat

Într-o lume cu tehnologie care se schimbă continuu într-un ritm rapid și crește incredibil de rapid în același timp, administratorii de sistem și inginerii devops trebuie să se gândească la abordări diferite cu privire la modul de automatizare a sarcinilor de rutină și de orchestrare a unor grupuri mari de servere.

În timp ce există multe alternativă la Ansible (Chef, Puppet) care fac același lucru cu unele diferențe, Ansible a reușit să se ridice deasupra tuturor prin simplitate, securitate îmbunătățită și, cel mai important, curba de învățare lină. Datorită acestor calități și adoptării rapide a Ansible, am creat un tutorial plin de exemple, astfel încât să puteți avea o primă experiență și mai simplă în lucrul cu Ansible.

În acest tutorial de bază Ansible, am descris ansible și am vorbit puțin despre istoria sa. Am menționat punctele forte ale Ansible și avantajele pe care ansible le poate aduce automatizării și orchestrarii infrastructurilor de diferite dimensiuni. Am definit termenii esențiali folosiți ansible și am definit structura manualelor Ansible. Exemple amănunțite au însoțit toate informațiile cu explicații detaliate.