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:
copymoodul otsib failefileskaustast.templatemoodul otsib failetemplateskaustast.rolesfunktsionaalsus otsib rolleroleskaustast. 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.htmluue sisuga.- HTMLi saab siit: index.html või võib genereerida enda oma.
- Ansibles tuleks selleks kasutada moodulit
copy. - Moodul
copytahab otsida failefileskaustast. - Kuna meie tahame asendada faili, siis tuleks kasutada ka
force: true.
- Panna
nginxteenus käima, kasutadessystemctl-i.- Selleks on olemas Ansible moodul
service. - Staatus, mida kasutada võiks, on
restarted. Siis tulevikus veel jooksutades pannakse muudatused ka "laivi".
- Selleks on olemas Ansible moodul
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öö!