Skip to content

Praktiline osa 2

Projekti struktuur

Aastatega on välja kasvanud kindel projekti struktuur, mida Ansible soovitab, ning ka teatud juhtudel eeldab, et kasutatakse. Eriti mängib see rolli, kuna teatud moodulid otsivad kindlatest kohtadest asju:

  • copy moodul otsib faile files kaustast.
  • template moodul otsib faile templates kaustast.
  • roles funktsionaalsus otsib rolle roles kaustast. jpm..

Nagu näha, siis loogika on võrdlemisi loogiline, ning saab ka selle loogika vastu minna, aga siis peab teekonnad väga täpselt ära defineerima. Kui õige fail on õige mooduli jaoks õiges kaustas, piisab ainult failinimest, ja see leitakse üles.

Ansible ise soovitab järgnevat kahte struktuuri:

Esimene on standartne struktuur, teist soovitame kasutusele võtta siis, kui sama Ansible projekti raames on palju keskkondasid - näiteks dev, test, prod jms.

Küll aga meie alustame lihtsamast. Loo endale järgnev struktuur projektikausta:

├── files/
├── group_vars/
├── hosts
├── host_vars/
├── playbook.yml
├── test.yml
├── README.md
├── roles/
└── templates/

Kaldkriipsuga lõppevad on tühjad kaustad, muud on (hetkel veel) tühjad failid, v.a. hosts fail, mis eelnevalt täidetud sai.

Playbookid

Nüüd kuis projekti struktuur on loodud, hakkame ehitama oma esimest playbooki. Selleks said ka eelmises sammus loodud failid test.yml ja playbook.yml, kuhu hakkame järjest seda ehitama.

Playbooki struktuur

Nagu loenguosas õppisime, siis playbook-id on iseseisvad käskude grupeeringud, mida tihti ehitatakse ühe ülesande või probleemi lahendamiseks. Selles on olemas kõik info mis vajalik, et seda ülesannet uuesti täita. Lisaks võib ühes playbookis olla palju erinevaid käskusid, mis jooksutatakse järjest.

Minimaalne playbooki struktuur näeb välja midagi sellist:

- hosts: all
  user: root

  tasks:
  - name: Testime
    debug: 
      msg: "Hello world!"

  - name: Testime 2
    debug: 
      msg: "Hello world!"

Esimene blokk defineerib ära mis kasutajaga millistesse inventari seadmetesse ühendatakse selle playbooki käivitamisel. Sinna saab ka juurde panna infot, kas peaks õiguseid kuidagi eskaleerima, jms.

Teine blokk alustab osa tasks. See on lihtsalt järjestus käskudest, mis Ansible poolt käivitatakse, järjestikku. Tavaolukorras edasi minnakse ainult siis, kui kõigi masinate peal on eelnev ära käinud.

Iga käsk selles blokis järgib formaati:

- name: nimi
  moodul:
    argument1: väärtus1
    argument2: väärtus2

See nime osa ei ole kohustuslik, aga on tugevalt soovituslik. See aitab aru saada, mida käsk teeb, ning pärast kui mingi probleem tekib, siis millise käsuga see tekis.

Complete

Kopeeri see playbook endale test.yml faili, ja pane see käima.

Playbooki käivitatakse nii:

ansible-playbook <playbooki_fail> -i <inventari_fail> -k

Võtmed -i ja -k töötavad samamoodi, nagu eelmises praktilises osas.

Verify

Mis on playbooki tulemus? Playbook oleks pidanud kõigi kahe masina peal edukalt ära käima, ja infot väljastama.

Kas oskad arvata, mida debug moodul teeb?

Esimene päris playbook

Esimese playbookiga tegeleme ainult CentOS masinaga. Kuna distributsioonidel on teatavad erinevused, siis tuleb neid Ansiblet kirjutades arvesse võtta - sellega tegeleme hiljem.

Meie eesmärk siin sammus on ehitada Ansible playbook, mis teeb järgnevad sammud:

  • Paigaldab masinasse paketihalduse süsteemist paki nginx.
    • Nginx on veebiserver, mis suudab võrdlemisi väikse vaevaga veebilehti hakata serveerima.
    • CentOS-is on kasutusel paketihaldur dnf. Ansibles peame kasutama sama nimega moodulit.
  • Tõstab meie poolt ette antud HTML faili masinasse, ja asendab juba olemasoleva /usr/share/nginx/html/index.html uue sisuga.
    • HTMLi saab siit: index.html või võib genereerida enda oma.
    • Ansibles tuleks selleks kasutada moodulit copy.
    • Moodul copy tahab otsida faile files kaustast.
    • Kuna meie tahame asendada faili, siis tuleks kasutada ka force: true.
  • Panna nginx teenus käima, kasutades systemctl-i.
    • Selleks on olemas Ansible moodul service.
    • Staatus, mida kasutada võiks, on restarted. Siis tulevikus veel jooksutades pannakse muudatused ka "laivi".

Seejärel on vaja see playbook CentOS masina pihta käima panna.

Complete

Nüüd tuleks võtta playbook.yml fail, ja hakata sinna seda playbooki ehitama. Erinevus meie test.yml playbookiga on seekordne soov jooksutada ainult CentOS grupi vastu, seega hosts argument vajab muutmist. Teine muutuv osa on tasks all kirjeldatud käsud, mis tuleks vastavalt meie eesmärgile ümber kirjutada. Peale seda tuleks playbook käima panna.

Kui soovid eelneva infoga põhjal ise nuputada, siis võid kindlasti proovida. Rohkema info jaoks klikka elemendi nimega "LISAINFO" peale - see avab rohkem infot.

LISAINFO

Selleks, et CentOS masinas installida nginx, tuleks kasutada dnf moodulit:

- name: Install NGINX
  dnf:
    name: nginx
    state: present

Selleks, et panna paika index.html fail, tuleb see fail kõigepealt panna Ansible projekti files kausta, nimega index.html, ja siis kasutada copy moodulit:

- name: Copy HTML file
  copy:
    src: index.html
    dest: /usr/share/nginx/html/index.html
    force: true

Selleks, et teha restarti nginx teenusele, tuleks kasutada service moodulit:

- name: Restart nginx
  service:
    name: nginx
    state: restarted

Need käsud tuleb kirjutada õigesti tasks sektsiooni alla oma playbookis, ja seejärel playbook käima panna:

ansible-playbook playbook.yml -i <inventarifail> -k

Verify

Kui playbook on käima pandud, läheb natukene aega - käsurida sulle koheselt tagasi ei anta. Nüüd tuleb oodata kuni Ansible toimetab. Kui kõik osad on kirjutatud õigesti, ja Ansiblel kõik failid olemas, siis peaks väljund olema midagi sellist:

PLAY [all] *********************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [193.40.11.124]

TASK [Install NGINX] ***********************************************************************************************************************************************************************************************
ok: [193.40.11.124]

TASK [Copy HTML file] **********************************************************************************************************************************************************************************************
changed: [193.40.11.124]

TASK [Restart nginx] ***********************************************************************************************************************************************************************************************
changed: [193.40.11.124]

PLAY RECAP *********************************************************************************************************************************************************************************************************
193.40.11.124              : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

Kui hostil ühtegi probleemi ei olnud (s.t. kõik staatused on ok, changed, skipped või ignored), siis on Ansible edukas. Võib minna kontrollima enda veebilehte, CentOS masina IP pealt, brauseri kaudu!

Aga võib ka vabalt juhtuda error (see või mõni muu):

PLAY [all] *********************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************
ok: [193.40.11.124]

TASK [Install NGINX] ***********************************************************************************************************************************************************************************************
ok: [193.40.11.124]

TASK [Copy HTML file] **********************************************************************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: If you are using a module and expect the file to exist on the remote, see the remote_src option
fatal: [193.40.11.124]: FAILED! => {"changed": false, "msg": "Could not find or access 'index.html'\nSearched in:\n\t/home/sk0022e/Work/Trainings/ansible2024/exercises/ex2/files/index.html\n\t/home/sk0022e/Work/Trainings/ansible2024/exercises/ex2/index.html\n\t/home/sk0022e/Work/Trainings/ansible2024/exercises/ex2/files/index.html\n\t/home/sk0022e/Work/Trainings/ansible2024/exercises/ex2/index.html on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"}

PLAY RECAP *********************************************************************************************************************************************************************************************************
193.40.11.124              : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

Sellisel juhul tuleb lugeda veateadet, et aru saada mis valesti, või küsida abi.

Praktilise osa lõpp

Kui lõpetasite praktilise osa, siis võib kasutada ülejäänud aega lõuna- või sirutuspausina! Tubli töö!