Esimene Ansible playbook: Praktikum¶
Kestus: 4 tundi
Eeldused: Loeng loetud (ptk 1–8: inventory, push-mudel, playbook, idempotentsus). Nädal 1 tehtud, kursus_ed25519 võti kolmes sõlmes, ansible -m ping annab pong. Kui udu, tagasi loengusse.
Kontroll-node: sinu arvuti, kogu töö VS Code'is (failid redaktoris, käsud terminalis).
Sihtmärk: su Proxmoxi sõlmed proxmox1 / proxmox2 / proxmox3 (nagu nädal 1). Kui teed kodus, sobib ka WSL2/VM/pilv. Playbook on kõigil identne.
Õpiväljundid
Selle praktikumi lõpuks sa:
- Ehitad playbooki task-haaval, testides igal sammul
- Diagnoosid kolm tüüpviga veateate järgi (permission denied, katkine idempotentsus, sisu vs olemasolu)
- Selgitad idempotentsust näite peal: miks
changedvsok, ja miksshell:selle lõhub - Ajad Märteni monitori roheliseks: Ansible teeb selle, mida Märten käsitsi ei dokumenteerinud
Näidisstsenaarium: Märten, teine vaatus
Nädal 2 päästsid Märteni monitor.sh. Ta kontrollib, kas nginx töötab, ja ütles kohe "nginx EI tööta", sest nginx polnud kunagi paigaldatud. Märten oleks selle käsitsi installinud, unustanud enable, ega kirjutanud kuhugi üles, mis ta tegi.
Sina teed teisiti: kirjutad playbooki, mis paigaldab ja käivitab nginx'i: korratavalt, dokumenteeritult, koodina. Praktikumi lõpus jooksutad Märteni monitori ja see läheb roheliseks.
Praktikumi loogika: setup → baas → viga → paranda → laienda → viga → taasta. Sa ei kopeeri valmis playbookit. Ehitad selle task-haaval, lõhud võtmekohtades meelega, ja saad aru miks.
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#ede7f6','primaryBorderColor':'#5e35b1','primaryTextColor':'#212121','lineColor':'#7e57c2'}}}%%
graph LR
subgraph SA["Sinu arvuti = kontroll-node"]
INV["inventory.ini<br/>(web: proxmox1)"]
PB["nginx.yml<br/>(playbook)"]
ANS(["ansible-playbook"])
INV --> ANS
PB --> ANS
end
ANS -->|"SSH (kursus_ed25519)"| N1["proxmox1<br/>nginx paigaldatud + käib"]
ANS -. "lisaülesanne" .-> N2[proxmox2]
ANS -. "lisaülesanne" .-> N3[proxmox3]
Osa 1 · Setup: kontrolli ühendust¶
Ansible ei jookse Windowsi käsurealt
Ansible vajab *NIX-käsurida: Mac, Linux või WSL2. Windowsi cmd/PowerShell ei sobi kontroll-node'iks. Kolm varianti:
- On WSL2 / Mac / Linux → jooksuta Ansible oma masinast sõlme vastu (nii nagu päriselt tehakse).
- *Pole NIX-i käepärast → jooksuta Ansible sõlme seest sõlme enda vastu (
localhost). See pole tavapärane kasutus, aga toimib õppimiseks. - Kahtluse korral küsi õpetajalt, kumb tee sinu masinal sobib.
Ansible on su arvutil juba (nädal 1). Ava projektikaust VS Code'is (code .), terminal Ctrl+`. Sinu inventory.ini on nädalast 1:
Testi ühendust ping mooduliga (mitte ICMP, vaid SSH + Python kontroll):
SUCCESS + "pong": valmis. Ära edasi mine enne kui pong tuleb.
Kes sa Ansible'i silmis oled?
Ansible logib sisse sama kasutajana, kellega ssh proxmox1 töötab, sest User ja võti tulevad su nädala 1 ~/.ssh/config-ist. Teie sõlmedel on see kasutaja. Kontrolli üle:
Väljund peab olema kasutaja, sama, kellega ise SSH-d. Nii näedki, et Ansible kasutab täpselt sama SSH-teed mis sina.
Tootmises on Ansible'il sageli oma teenuskonto (nt
ansible), mitte inimese isiklik konto. Nii on ligipääs auditeeritav ja piiratud. Meie kursusel piisab ühestkasutaja-st; root-õigused tuleb siisbecome-ga (Osa 3).
Tip
UNREACHABLE? Kas ssh proxmox1 töötab käsitsi? Ansible kasutab sama SSH-ühendust mis sina: 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
hosts: web
become: true # root-õigused (sudo)
tasks:
- name: Paigalda nginx pakett
ansible.builtin.package: # valib ise dnf (Alma) või apt (Ubuntu)
name: nginx
state: present # "peab olemas olema"
Kolm asja, mida tähele panna:
hosts: web: gruppinventory.ini-st.become: true: paketi paigaldus vajab root-õigusi.ansible.builtin.package: universaalne paketimoodul. Su koolisõlm on Alma (dnf), aga sama task töötab ka Ubuntul (apt). Ei pea harusid tegema.
Käivita:
changed=1, task changed. Kontrolli sõlmes:
Osa 3 · Become puudu: permission denied¶
Eemalda meelega rida become: true (kommenteeri: # become: true). Käivita:
Viga: midagi stiilis Permission denied või This command has to be run under the root user.
Diagnoosi enne kui parandad
Sinu SSH-kasutaja ei ole root. Paketi paigaldus vajab root-õigusi. Mis rida ütles Ansible'ile "tee sudo-ga", ja mis juhtus kui selle ära võtsid? Miks Ansible ei kasuta sudo't vaikimisi?
Paranda: pane become: true tagasi, käivita, veendu et läbib. See on esimene asi, mida Permission denied puhul kontrollida: kas task vajab root'i 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 (tasks: alla):
- name: Käivita ja luba nginx
ansible.builtin.service:
name: nginx
state: started # käivita nüüd
enabled: true # 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. Kust Ansible teadis, et pole midagi teha? See ongi idempotentsus. Osas 5 lõhume selle meelega.
enabled: true on see, mille Märten unustas. Nüüd on see failis kirjas, enam ei unusta.
Osa 5 · Katkine idempotentsus: shell alati changed¶
Tahad kirjutada nginx versiooni faili. Vale viis: lisa 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. Kolm käivitust, kolm changed.
Diagnoosi
package ja service kontrollivad seisu enne tegutsemist. shell: ei kontrolli midagi. Ta 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 sõlme ja Märteni monitor jooksib cron'is?
Paranda: kui käsk peab jooksma ainult kord, lisa creates (Ansible jätab vahele kui fail olemas):
- name: Kirjuta nginx versioon faili
ansible.builtin.shell: nginx -v 2> /tmp/nginx_version.txt
args:
creates: /tmp/nginx_version.txt
Käivita kaks korda: teine kord ok. Idempotentsus taastatud.
Tip
Reegel: enne kui kirjutad shell:, küsi kas mõni moodul teeb sama. shell: on koht, kus idempotentsus tavaliselt sureb.
Osa 6 · Oma leht¶
Loo fail index.html:
Lisa task (Alma nginx serveerib kaustast /usr/share/nginx/html/):
- name: Kopeeri index.html
ansible.builtin.copy:
src: index.html
dest: /usr/share/nginx/html/index.html
mode: '0644'
src = sinu masinas, dest = sõlmes.
Peaksid nägema oma lehte. (curl localhost sõlme seest väldib tulemüüri; brauserist väljast töötab, kui port 80 on firewalld-is avatud, vt lisaülesanne.)
Osa 7 · Taasta, lõpp-test ja Märteni monitor¶
Lõplik idempotentsuse test: käivita ilma midagi muutmata:
PLAY RECAP: kõik ok, changed=0. See on tervik: playbookit võib jooksutada lõputult, tulemus sama.
Nüüd jooksuta Märteni monitor sõlmes. See on teenus, mis nädalal 2 ütles "EI tööta":
Märten oleks selle käsitsi teinud ja unustanud. Sina tegid playbookiga: korratav, dokumenteeritud, Gitis.
Mõtle
Kui sul oleks 50 sõlme ja see playbook cron'is iga tund: mida ütleks changed=0 vs changed=5 su monitooringule? Kumb tähendaks "keegi näppis sõlme käsitsi"?
Lõppkontroll: oskad ilma juhendita¶
-
ansible -m pingannabpongsu sõlmele -
Permission deniednägemisel kontrollid kohebecome - Selgitad miks
shell:on alatichangedjapackage/copyei ole - Tead millal
createsidempotentsust päästab - Lõpp-test: kõik
ok,changed=0 -
curl localhostnäitab sinu lehte - Märteni monitor ütleb "nginx töötab"
Lisaülesanded (kui jõuad ette)¶
- Kolm sõlme korraga. Lisa
inventory.ini[web]gruppiproxmox2japroxmox3, jooksuta sama playbook kõigil. Sama fail, kolm sõlme: see ongi Ansible'i mõte. --check:ansible-playbook -i inventory.ini nginx.yml --check. Mida teeb ilma reaalsete muudatusteta? Millal kasulik enne tootmist?--syntax-check: kustuta meelega üks koolon, jooksuta--syntax-check. Kuidas Ansible viga näitab?- Tulemüür: ava Almal port 80 (
ansible.posix.firewalldvõifirewall-cmd), et leht avaneks ka brauserist väljast. Miks on port vaikimisi kinni?
Veaotsing¶
| Veateade | Põhjus | Lahendus |
|---|---|---|
UNREACHABLE |
SSH katki / sõlm maas | ssh proxmox1 käsitsi, kontrolli inventory rida |
Permission denied / root vajalik |
become puudub |
become: true |
Task alati changed |
shell: ei kontrolli seisu |
Moodul, või args: creates: |
No package nginx available |
Alma repo puudu | ssh proxmox1 "sudo dnf repolist", kontrolli appstream |
curl: Connection refused |
teenus maas | kontrolli Osa 4 task, ssh proxmox1 systemctl status nginx |
| YAML süntaksiviga | Taane katki, tab-id | VS Code näitab taanet; --syntax-check |
Tabel 3.2. Iga rida on viga, mille sa selles praktikumis ise tekitasid ja parandasid.
Esitamine: commit + push oma repo¶
Töö läheb su kursuse repo hkhk-automation all, haru ja PR-i kaudu (nagu nädal 2):
- Salvesta viimane, muutmata käivitus logifaili (kontroll otsib seda):
changed=0 tuleb ainult siis, kui kõik on juba paigas. Nii tõestab logi, et jooksutasid ja playbook on idempotentne.
- Haru:
git switch -c n03-nginx - Lisa
nginx.yml,index.html,inventory.inijalogid/play_recap.txt, commit git push -u origin n03-nginxja ava Pull Requestmainvastu- Veendu, et automaatne kontroll (Actions) on roheline. See tähendab, et failid, süntaks, moodulid, nimi lehel ja
changed=0on kõik korras - Pärast review'd merge. Esita PR-i link GitHub Projectis.
Allikad¶
| Allikas | URL | Miks |
|---|---|---|
| Getting Started | https://docs.ansible.com/ansible/latest/getting_started/index.html | Alustamine |
package moodul |
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/package_module.html | Universaalne paigaldus |
service moodul |
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html | Teenuse haldus |
shell vs command |
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/shell_module.html | Millal (mitte) kasutada |
Järgmine: N4, muutujad välisfailidesse, Jinja2 mallid ja saladuste kaitse (Vault).