Esimene Ansible playbook — Labor
Kestus: 4 tundi
Eeldused: Loeng antud (inventory, push-mudel, idempotentsus, moodulid). Git põhialused. Kui udu — tagasi loengusse. Siit edasi ainult käed külge.
Kontroll-node: sinu arvuti, kogu töö VS Code'is (failid redaktoris, käsud integreeritud terminalis).
Sihtmärk: üks Ubuntu-server sinu valik — Kodulabor, WSL2, oma VM, pilv (kodus); Proxmox (koolis). Playbook on kõigil identne, vahet teeb üks rida inventory.ini-s.
Õpiväljundid
Selle labi lõpuks sa:
- Seadistad Ansible kontroll-node'i ja inventory oma sihtmärgile
- Ehitad playbooki kiht-kihi haaval, testides igal sammul
- Diagnoosid kolm tüüpilist viga veateate järgi (permission denied, katkine idempotentsus, vale moodul)
- Selgitad idempotentsust näite peal — miks
changedvsok, ja miksshell:selle lõhub - Taastad korratava seisu ise tehtud sasi järel
Labi loogika: setup → baas → viga → paranda → laienda → viga → taasta. Sa ei kopeeri valmis playbookit. Sa ehitad selle task-haaval, lõhud võtmekohtades meelega, ja saad aru miks. Tervet faili näed üks kord — edasi ainult "lisa see task".
Osa 1 · Setup — Ansible, inventory, ühendus
Paigalda Ansible oma arvutisse:
Ava projektikaust VS Code'is (code .), terminal Ctrl+`. Loo inventory.ini — sisu sõltub su sihtmärgist:
| Sihtmärk | Rida inventory.ini-s |
|---|---|
| WSL2 / lokaalne VM | 127.0.0.1 ansible_user=sinu_kasutaja (või VM-i IP) |
| Proxmox (koolis) | 192.168.x.x ansible_user=õpetajalt |
| Pilve-server | avalik-IP ansible_user=ubuntu |
Tabel 3.1. Sama rida, erinevad sihtmärgid.
Testi ühendust (ping moodul — mitte ICMP, vaid SSH + Python kontroll):
SUCCESS + "pong" — valmis. Ära edasi mine enne kui pong tuleb.
Tip
UNREACHABLE — kas server käib ja ssh <kasutaja>@<IP> töötab käsitsi? Ansible ei tee midagi maagilist: kui SSH käsitsi ei ühendu, ei ühendu ka Ansible.
Osa 2 · Baas — esimene task
Loo nginx.yml. Ainus kord terve fail — edasi lisad task'e:
---
- name: Paigalda ja seadista nginx # playbooki nimi, ilmub väljundis
hosts: web # grupp inventory'st
become: yes # root-õigused (sudo)
tasks:
- name: Paigalda nginx pakett
apt:
name: nginx
state: present # "peab olemas olema"
update_cache: yes # apt update enne paigaldust
Ridade lahtiseletus:
hosts: web— gruppinventory.ini-st, playbook jookseb kõigil selle grupi masinatel.become: yes— nginx paigaldus vajab root-õigusi.state: present— kui nginx juba olemas, jätab Ansible vahele. Idempotentsuse esimene vihje.
changed=1, task changed. Kontrolli:
Osa 3 · Become puudu — permission denied
Eemalda meelega rida become: yes (kommenteeri välja: # become: yes). Käivita:
Viga: midagi stiilis Permission denied või Failed to lock apt.
Diagnoosi enne kui parandad
Sinu <kasutaja> ei ole root. apt install vajab root-õigusi. Mis rida ütles Ansible'ile "tee seda sudo-ga", ja mis juhtus kui selle ära võtsid? Miks Ansible ei kasuta sudo't vaikimisi?
Paranda — pane become: yes tagasi, käivita, veendu et läbib.
See on esimene asi, mida kontrollida kui näed Permission denied: kas task vajab root-õigusi ja kas become on peal.
Osa 4 · Laienda — teenus ja idempotentsus
Nginx on paigaldatud, aga kas teenus töötab ja käivitub pärast reboot'i? Lisa teine task (fragment, tasks: alla):
- name: Käivita ja luba nginx
service:
name: nginx
state: started # käivita nüüd
enabled: yes # käivitu ka pärast reboot'i
Vaata PLAY RECAP hoolikalt. Esimene task ok (nginx juba paigaldatud — Ansible ei tee midagi), teine changed (teenus käivitati esmakordselt).
Mõtle
Käivita veel kord. Nüüd on mõlemad ok. Ansible ei paigaldanud uuesti, ei käivitanud uuesti. Kust ta teadis, et pole midagi teha? See ongi idempotentsus. Osas 5 lõhume selle.
Osa 5 · Katkine idempotentsus — shell alati changed
Tahad kontrollida nginx versiooni ja kirjutada selle faili. Vale viis — lisa see task shell: mooduliga:
ansible-playbook -i inventory.ini nginx.yml
ansible-playbook -i inventory.ini nginx.yml
ansible-playbook -i inventory.ini nginx.yml
Vaata: see task on changed iga kord. Alati. Kolm käivitust, kolm changed.
Diagnoosi
Moodulid nagu apt ja service kontrollivad seisu enne tegutsemist ("kas juba paigaldatud?"). shell: ei kontrolli midagi — ta lihtsalt käivitab käsu ja raporteerib alati changed, sest Ansible ei tea mida see käsk tegi. Miks on "alati changed" halb, kui sul on 50 serverit ja cron?
Paranda — kaks võimalust:
- Kui käsk peab jooksma ainult kord, lisa
creates(Ansible jätab vahele kui fail juba olemas):
- name: Kirjuta nginx versioon faili
shell: nginx -v 2> /tmp/nginx_version.txt
args:
creates: /tmp/nginx_version.txt
Käivita kaks korda — teine kord ok. Idempotentsus taastatud.
- Veel parem oleks üldse vältida
shell:-i ja kasutada mõnda moodulit, kui see olemas.shell:/command:on viimane abinõu, mitte esimene valik.
Tip
Reegel: enne kui kirjutad shell:, küsi kas mõni moodul teeb sama. shell: on koht, kus idempotentsus tavaliselt sureb.
Osa 6 · Laienda — oma leht
Loo fail index.html:
Lisa task (fragment):
src = sinu masinas, dest = serveris.
Ava brauseris http://<sihtmärgi-IP> — "Ansible töötab!".
Osa 7 · Kas copy on nutikas?
Muuda index.html sisu ("Versioon 2") ja käivita:
copy task on changed — fail muutus, Ansible uuendas. Käivita uuesti ilma muutmata:
Nüüd ok — fail on juba õige.
Diagnoosi
copy võrdleb faili sisu (checksum), mitte ainult olemasolu. Kui sisu klapib, ei tee midagi. Kui oleksid teinud shell: cp index.html /var/www/html/, oleks see olnud changed ka siis kui midagi ei muutunud. Mis vahe on copy ja shell: cp idempotentsuse mõttes?
Siin näed miks moodul > shell: moodul teab kuidas seisu kontrollida, cp ei tea.
Osa 8 · Taasta ja lõpp-test
Lõplik idempotentsuse test — käivita ilma midagi muutmata:
PLAY RECAP — kõik ok, null changed (kui shell task on creates-iga korras). See on tervik: playbookit võib jooksutada lõputult, tulemus sama.
Mõtle
Kui sul oleks 50 serverit ja see playbook cron'is iga tund — mida tähendaks su monitooringule, kui iga käivitus näitaks changed=0 vs changed=5? Kumb ütleks "keegi näppis servereid käsitsi"?
Kõik ok? See on tervik: playbookit võib jooksutada lõputult, tulemus sama.
Lõppkontroll — oskad ilma juhendita
-
ansible -m pingannabpongsu sihtmärgile -
Permission deniednägemisel kontrollid kohebecome - Selgitad miks
shell:on alatichangedjaapt/copyei ole - Tead millal
creates/argsidempotentsust päästab - Lõpp-test: kõik
ok,changed=0 - Brauser näitab sinu lehte
Lisaülesanded (kui jõuad ette)
--check:ansible-playbook ... --check— mida teeb ilma reaalsete muudatusteta? Millal kasulik enne tootmist?handlers: lisa handler, mis taaskäivitab nginx'i ainult siis kuiindex.htmlmuutus (notify). Miks parem kui alati restart?- Teine grupp: lisa inventory'sse teine host, jooksuta mõlemal.
--limitühele.
Veaotsing
| Veateade | Põhjus | Lahendus |
|---|---|---|
UNREACHABLE |
Server maas või SSH katki | ssh käsitsi, kontrolli inventory rida |
Permission denied / Failed to lock apt |
become puudub |
become: yes |
Task alati changed |
shell:/command: ei kontrolli seisu |
Moodul, või args: creates: |
changed ka muutmata failil |
shell: cp sisu ei võrdle |
copy moodul (checksum) |
| YAML süntaksiviga | Taane katki, tab-id | VS Code näitab taanet, tühikud mitte tabid |
Tabel 3.2. Iga rida on viga, mille sa selles labis ise tekitasid ja parandasid.
Allikad
| Allikas | URL | Miks |
|---|---|---|
| Ansible Getting Started | https://docs.ansible.com/ansible/latest/getting_started/index.html | Alustamine |
| apt / service / copy moodulid | https://docs.ansible.com/ansible/latest/collections/ansible/builtin/ | Parameetrid |
| shell vs command | https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html | Millal (mitte) kasutada |
| Idempotency (glossary) | https://docs.ansible.com/ansible/latest/reference_appendices/glossary.html | Definitsioon |