Keri sisuni

Ansible Basics Lab: Setup ja Esimene Playbook

Navigeerimine

Kasuta paremal olevat sisukorda kiireks navigeerimiseks ↗️

Eesmärk: Õppida Ansible'i alused ja luua esimesed automatiseerimise skriptid

Õpiväljundid

Pärast laborit oskate: - Installida ja konfigureerida Ansible'i - Seadistada SSH võtmeid turvaliseks ühenduseks - Luua ja hallata inventory faile - Kasutada ad-hoc käske kiireks automatiseerimiseks - Kirjutada YAML süntaksit - Luua ja käivitada playbook'e - Automatiseeritult seadistada veebiserveri


1. Ansible'i installimine ja seadistamine

1.1 Ansible'i installimine

Ubuntu/Debian: ```bash

Uuenda pakettide nimekirja

sudo apt update

Installi Ansible

sudo apt install ansible -y

Kontrolli installatsiooni

ansible --version ```text

macOS (Homebrew): ```bash

Installi Homebrew (kui ei ole)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Installi Ansible

brew install ansible

Kontrolli

ansible --version ```text

Windows (WSL): ```bash

Windows'is kasutage Windows Subsystem for Linux

Seejärel järgige Ubuntu juhendeid

```bash

1.2 SSH võtmete seadistamine

Miks SSH võtmed on vajalikud: - Ansible kasutab SSH'd serveritega ühendumiseks - Võtmed on turvalisemad kui paroolid - Automatiseerimine toimib ilma parooli küsimata

SSH võtme loomine: ```bash

Looge SSH võti (kui teil ei ole)

ssh-keygen -t rsa -b 4096 -C "teie.email@example.com"

Vajutage Enter kõikidele küsimustele (kasutab default asukohti)

Võite lisada parooli või jätta tühjaks

```text

SSH võtme kopeerimine test serverisse: ```bash

Kopeerige avalik võti serverisse

ssh-copy-id kasutaja@test-server.local

Või käsitsi

cat ~/.ssh/id_rsa.pub | ssh kasutaja@test-server.local "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ```text

Testide ühendust: ```bash

Peaks ühenduma ilma parooli küsimata

ssh kasutaja@test-server.local ```bash

1.3 Esimene inventory fail - Serverite "telefoniraamat"

Esmalt mõistame, mis on inventory: - Inventory on fail, kus kirjas kõik serverid, mida Ansible haldab - See on nagu telefoniraamat - Ansible vaatab sealt, milliseid servereid kontakteeruda - Saame servereid grupeerida (nt webserverid, andmebaasiserveid)

Looge töökaust: bash mkdir ~/ansible-praktikum cd ~/ansible-praktikumtext

Nüüd loome inventory faili sammhaaval:

1.3.1 Looge tühi fail

bash touch inventory.initext

1.3.2 Avage fail tekstiredaktoris

```bash nano inventory.ini

või

code inventory.ini ```text

1.3.3 Lisage esimene server (localhost testimiseks)

ini [test] localhost ansible_connection=localbash

Selgitus: - [test] = grupi nimi (sulgudes) - localhost = serveri nimi - ansible_connection=local = ütleb Ansible'ile, et kasuta lokaalseid käske (SSH pole vaja)

1.3.4 Lisage teine grupp (tuleviku serveritele)

```ini [practice]

Kommentaar: Siia saate hiljem lisada tegelikke servereid

Näide: server1.example.com ansible_user=ubuntu

```text

1.3.5 Salvestage fail (Ctrl+X, siis Y, siis Enter nano's)

Nüüd testima inventory: ```bash

Vaatame, kas Ansible näeb meie servereid

ansible -i inventory.ini --list-hosts all

Peaks näitama: localhost

```text

Testide ühendust: bash ansible -i inventory.ini test -m pingtext

Mõtelge: Miks kasutame test mitte localhost? (Vastus: test on grupi nimi!)


2. Esimesed Ad-hoc käsud

2.1 Ad-hoc käskude harjutused

Ping test: ```bash

Kontrollige kõiki servereid

ansible -i inventory.ini all -m ping ```text

Süsteemi info: ```bash

Vaata operatsioonisüsteemi

ansible -i inventory.ini all -m setup -a "filter=ansible_distribution*"

Vaata mälu ja CPU

ansible -i inventory.ini all -m setup -a "filter=ansible_memtotal_mb,ansible_processor_count" ```text

Failide haldamine: ```bash

Loo test kaust

ansible -i inventory.ini all -m file -a "path=/tmp/ansible-test state=directory"

Loo test fail

ansible -i inventory.ini all -m copy -a "content='Ansible test' dest=/tmp/ansible-test/hello.txt"

Kontrolli faili olemasolu

ansible -i inventory.ini all -m command -a "ls -la /tmp/ansible-test/" ```text

Pakettide haldamine: ```bash

Installi htop (vajalik sudo)

ansible -i inventory.ini all -m package -a "name=htop state=present" --become

Kontrolli installatsiooni

ansible -i inventory.ini all -m command -a "which htop" ```bash


3. YAML ja esimene playbook

3.1 YAML süntaksi harjutus - Õpime "inimese keelt"

Miks YAML on oluline: - Ansible playbook'id on kirjutatud YAML keeles - YAML on disainitud inimesele loetavaks - Taandrimine (indentation) on VÄGA oluline!

Loome YAML faili sammhaaval:

3.1.1 Looge uus fail

bash touch test.yml nano test.yml # või code test.ymltext

3.1.2 Alustage YAML dokumendiga

```yaml

YAML alustab alati kolme kriipsuga

Hashtag (#) on kommentaar

```text

3.1.3 Lisage lihtne väärtus

yaml nimi: "Minu Ansible Test" versioon: 1.0text Märkus: Jutumärgid on vabatahtlikud, aga hea praktika tekstile

3.1.4 Lisage loend (list)

yaml serverid: - nimi: "test1" ip: "192.168.1.10" roll: "veebiserver" - nimi: "test2" ip: "192.168.1.11" roll: "andmebaas"text Tähelepanu: - Kriips (-) tähistab loendi elementi - Taandrimine peab olema täpne (kasutage 2 tühikut) - ÄRA kasutage Tab klahvi!

3.1.5 Lisage seadistused

yaml seadistused: http_port: 80 https_port: 443 debug: truetext

3.1.6 Salvestage fail

Kontrollige süntaksi: ```bash

Python abil (kui on installitud)

python3 -c "import yaml; print(yaml.safe_load(open('test.yml')))"

Ansible abil

ansible-playbook --syntax-check test.yml ```bash

Harjutus: Muutke debug: true väärtuseks false ja kontrollige uuesti!

3.2 Esimene lihtne playbook - Sammhaaval ehitamine

Mõistame playbook struktuuri: - Play = üks stsenaarium ühe grupi serveritele - Tasks = konkreetsed sammud, mida teha - Modules = Ansible'i ehitatud funktsioonid (debug, file, copy jne)

Loome playbook samm-sammult:

3.2.1 Looge uus fail

bash touch mu-esimene-playbook.yml nano mu-esimene-playbook.ymltext

3.2.2 Alustage YAML ja Play definitsiooniga

```yaml

  • name: "Minu esimene Ansible playbook" hosts: all gather_facts: yes ```text Selgitus:
  • name: = playbook'i kirjeldus
  • hosts: all = käivita kõikidele serveritele inventory's
  • gather_facts: yes = kogu serveri infot (OS, IP, jne)

3.2.3 Lisage tasks sektsioon

yaml tasks:text

3.2.4 Esimene task - lihtne tervitus

yaml - name: "Tervita maailma" debug: msg: "Tere! Ansible töötab {{ inventory_hostname }} serveris!"text Märkuseid: - debug = moodul sõnumite väljastamiseks - {{ inventory_hostname }} = muutuja (server nimi)

3.2.5 Teine task - näita süsteemi infot

yaml - name: "Näita süsteemi infot" debug: msg: "Server töötab {{ ansible_distribution }} {{ ansible_distribution_version }}"text

3.2.6 Kolmas task - loo kaust

yaml - name: "Loo test kataloog" file: path: /tmp/ansible-praktikum state: directory mode: '0755'text Selgitus: - file = moodul failide/kaustade haldamiseks - state: directory = veendu, et see on kaust - mode: '0755' = määra õigused (rwx r-x r-x)

3.2.7 Neljas task - kirjuta fail

yaml - name: "Kirjuta info fail" copy: dest: /tmp/ansible-praktikum/info.txt mode: '0644' content: | Ansible playbook käivitatud: {{ ansible_date_time.iso8601 }} Serveri nimi: {{ inventory_hostname }} IP aadress: {{ ansible_default_ipv4.address | default('ei tuvastatud') }}text Märkuseid: - content: | = mitme-realine tekst - {{ ansible_date_time.iso8601 }} = praegune kuupäev

3.2.8 Viies task - loe fail

yaml - name: "Kuva faili sisu" command: cat /tmp/ansible-praktikum/info.txt register: faili_sisutext Selgitus: - command = käivita shell käsk - register = salvesta väljund muutujasse

3.2.9 Kuues task - näita tulemust

yaml - name: "Näita, mis failis on" debug: msg: "{{ faili_sisu.stdout_lines }}"bash

3.2.10 Salvestage fail

Nüüd testima meie playbook'i:

  1. Esmalt kuiv käivitus (dry run): bash ansible-playbook -i inventory.ini --check mu-esimene-playbook.yml Mis juhtub: Ansible näitab, mida ta teeks, aga ei muuda midagi

  2. Kui kuiv käivitus õnnestus, siis tegelik käivitus: bash ansible-playbook -i inventory.ini mu-esimene-playbook.yml

  3. Vaadake tulemust:

  4. Kas kõik taskid õnnestusid (roheline)?
  5. Kontrollige, kas fail tekkis: ls -la /tmp/ansible-praktikum/

Debugimise küsimused: - Mida tähendab "changed" vs "ok"? - Miks mõned taskid on "changed" ja teised "ok"? - Käivitage playbook uuesti - mis muutub?

3.3 Playbook muutujatega - Õpime dünaamilisust

Miks muutujad on olulised: - Teevad playbook'i korduvkasutatavaks - Võimaldavad erinevaid konfiguratsioone - Lihtsustavad muudatuste tegemist

Loome muutujatega playbook sammhaaval:

3.3.1 Uus fail

bash touch playbook-muutujatega.yml nano playbook-muutujatega.ymltext

3.3.2 Play definitsioon muutujatega

```yaml

  • name: "Playbook muutujatega" hosts: all vars: rakenduse_nimi: "Minu Veebirakendus" versioon: "1.2.3" portnumber: 8080

tasks: ```text

3.3.3 Task 1 - Dünaamiline kausta nimi

yaml - name: "Loo rakenduse kaust" file: path: "/opt/{{ rakenduse_nimi | lower | replace(' ', '-') }}" state: directory mode: '0755' become: yestext Selgitused: - {{ rakenduse_nimi }} = kasuta muutujat - | lower = muuda väikesteks tähtedeks - | replace(' ', '-') = asenda tühikud kriipsudega

3.3.4 Task 2 - Dünaamiline konfiguratsioon

yaml - name: "Kirjuta konfiguratsioon" copy: dest: "/opt/{{ rakenduse_nimi | lower | replace(' ', '-') }}/config.env" mode: '0644' content: | # {{ rakenduse_nimi }} konfiguratsioon APP_NAME={{ rakenduse_nimi }} VERSION={{ versioon }} PORT={{ portnumber }} INSTALLED_ON={{ ansible_date_time.iso8601 }} become: yestext

3.3.5 Task 3 - Kuva tulemus

```yaml - name: "Kuva konfiguratsioon" command: "cat /opt/{{ rakenduse_nimi | lower | replace(' ', '-') }}/config.env" register: config_sisu become: yes

Text Only
1
2
3
- name: "Näita konfiguratsiooni"
  debug:
    msg: "{{ config_sisu.stdout_lines }}"

```text

3.3.6 Käivita ja eksperimenteerige

bash ansible-playbook -i inventory.ini playbook-muutujatega.ymltext

Harjutus: 1. Muutke rakenduse_nimi muutujat 2. Käivitage playbook uuesti 3. Vaadake, kuidas tulemus muutub

Lisaharjutus: Lisage uus muutuja kirjeldus ja kasutage seda config failis!


4. Veebiserveri seadistamine

4.1 Nginx playbook - Automatiseeritud veebiserver

Miks Nginx: - Populaarne veebiserver - Lihtne seadistada - Hea näide produktsiooni-lähedase automatiseerimise kohta

Loome Nginx playbook etappide kaupa:

4.1.1 Alustage uue failiga

bash touch nginx-setup.yml nano nginx-setup.ymltext

4.1.2 Play definitsioon muutujatega

```yaml

  • name: "Nginx veebiserveri seadistamine" hosts: all become: yes vars: web_root: "/var/www/html" site_name: "Minu Test Sait"

tasks: ``text **Märkuseid:** -become: yes= kasuta sudo õiguseid kõikides tasks'ides -vars:` = playbook'i muutujad

4.1.3 Task 1 - Süsteemi ettevalmistus

yaml - name: "Uuenda pakettide nimekirja" package: update_cache: yes when: ansible_os_family == "Debian"text Selgitus: when: = conditional - käivita ainult Debian/Ubuntu's

4.1.4 Task 2 - Nginx installimine

yaml - name: "Installi Nginx" package: name: nginx state: presenttext

4.1.5 Task 3 - Veebi kausta loomine

yaml - name: "Loo veebi kaust" file: path: "{{ web_root }}" state: directory owner: www-data group: www-data mode: '0755' when: ansible_os_family == "Debian"text Märkuseid: - {{ web_root }} = kasutab muutujat - owner/group: www-data = nginx kasutaja

4.1.6 Task 4 - Lihtsa HTML lehe loomine

yaml - name: "Kopeeri HTML lehekülg" copy: dest: "{{ web_root }}/index.html" owner: www-data group: www-data mode: '0644' content: | <!DOCTYPE html> <html lang="et"> <head> <meta charset="UTF-8"> <title>{{ site_name }}</title> <style> body { font-family: Arial, sans-serif; text-align: center; padding: 50px; } .container { max-width: 600px; margin: 0 auto; } .success { color: green; } .info { background: #f0f0f0; padding: 20px; border-radius: 5px; } </style> </head> <body> <div class="container"> <h1 class="success">{{ site_name }}</h1> <p>Nginx on edukalt paigaldatud Ansible'iga!</p> <div class="info"> <h3>Serveri info:</h3> <p><strong>Hostname:</strong> {{ inventory_hostname }}</p> <p><strong>Süsteem:</strong> {{ ansible_distribution }} {{ ansible_distribution_version }}</p> <p><strong>Paigaldatud:</strong> {{ ansible_date_time.iso8601 }}</p> </div> </div> </body> </html> when: ansible_os_family == "Debian"text

4.1.7 Task 5 - Nginx käivitamine

yaml - name: "Käivita ja luba Nginx" service: name: nginx state: started enabled: yestext Selgitus: - state: started = veendu, et teenus töötab - enabled: yes = käivita automaatselt boot'imisel

4.1.8 Task 6 - Valideerimised

```yaml - name: "Kontrolli Nginx olekut" command: systemctl is-active nginx register: nginx_status failed_when: false

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
- name: "Näita Nginx olekut"
  debug:
    msg: "Nginx olek: {{ nginx_status.stdout }}"

- name: "Testi veebiserveri ühendust"
  uri:
    url: "http://localhost"
    return_content: yes
  register: web_test
  failed_when: false

- name: "Näita veebiserveri vastust"
  debug:
    msg: "Veebiserver töötab! HTTP kood: {{ web_test.status | default('Ei saanud ühendust') }}"

``bash **Märkuseid:** -urimoodul = HTTP päringute tegemiseks -failed_when: false` = ära lõpeta vea korral

4.1.9 Salvestage fail

Nüüd testima Nginx playbook'i:

  1. Süntaksi kontroll: bash ansible-playbook -i inventory.ini --syntax-check nginx-setup.yml

  2. Kuiv käivitus: bash ansible-playbook -i inventory.ini --check nginx-setup.yml Vaadake: Millised taskid näitavad "changed"?

  3. Tegelik käivitus: bash ansible-playbook -i inventory.ini nginx-setup.yml

  4. Tulemuse testimine: ```bash # Kontrolli Nginx protsessi sudo systemctl status nginx

# Kontrolli, kas port 80 on avatud sudo netstat -tlnp | grep :80

# Testi HTTP päringuga curl http://localhost ```

  1. Brauseris (kui GUI on):
  2. Avage http://localhost
  3. Peaks näitama ilusat HTML lehte

💡 Analüüsige: - Mitu "changed" oli esimesel käivitusel? - Käivitage playbook uuesti - mitu "changed" nüüd? - Miks see nii on? (Hint: idempotency!)

🔧 Troubleshooting: - Kui Nginx ei käivitu, kontrollige: sudo journalctl -u nginx - Kui port kinni, vaadake: sudo ss -tlnp | grep :80


5. Ansible konfiguratsiooni optimeerimine

5.1 ansible.cfg seadistamine - Mugavuse suurendamine

Miks ansible.cfg on kasulik: - Ei pea iga kord -i inventory.ini kirjutama - Paremad vaikimisi seadistused - SSH optimeeringud

Loome konfiguratsiooni sammhaaval:

5.1.1 Loo fail

bash touch ansible.cfg nano ansible.cfgtext

5.1.2 Lisage põhiseadistused

```ini [defaults]

Inventory faili asukoht (nüüd ei pea -i iga kord kirjutama)

inventory = inventory.ini ```text

5.1.3 SSH seadistused (et vältida vigu)

```ini

SSH seadistused

host_key_checking = False remote_user = kasutaja private_key_file = ~/.ssh/id_rsa ``text **Selgitus:** -host_key_checking = False= ei küsi SSH fingerprinte -remote_user` = default kasutajanimi serverites

5.1.4 Väljundi parandused

```ini

Väljundi seadistused

stdout_callback = yaml pipelining = True ```text Miks: YAML väljund on inimesele loetavam

5.1.5 Performance seadistused

```ini

Paralleelsus (kui palju serveritega korraga töötab)

forks = 10

Logimise seadistused

log_path = ./ansible.log ```text

5.1.6 SSH optimeeringud (täiendav sektsioon)

```ini [ssh_connection]

SSH optimeeringud

ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null timeout = 30 retries = 3 ```text

5.1.7 Salvestage ja testiga

```bash

Nüüd saate käivitada ilma -i liputa!

ansible all -m ping ```text

Teste konfiguratsiooni: ```bash

Nüüd ei pea -i inventory.ini määrama

ansible all -m ping

Logi kontrollimise

tail -f ansible.log ```text


6. Veatuvastus ja probleemide lahendamine

6.1 Levinud probleemid ja lahendused

SSH ühenduse probleemid: ```bash

Kontrolli SSH ühendust käsitsi

ssh -v kasutaja@target-host

SSH võtme probleemid

ssh-add ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub ```text

Sudo õiguste probleemid: ```bash

Testide sudo õiguseid

ansible all -m command -a "whoami" --become

Sudo parooli küsimine

ansible all -m command -a "whoami" --become --ask-become-pass ```bash

Python teegi probleemid: ```bash

Kontrolli Python'i

ansible all -m setup -a "filter=ansible_python*"

Määra Python'i asukoht

ansible all -m ping -e ansible_python_interpreter=/usr/bin/python3 ```bash

6.2 Debugimise playbook - Õpime tõrkeid leidma

Miks debug playbook on vajalik: - Aitab mõista, millised muutujad on saadaval - Kontrollib SSH ja sudo seadistusi - Näitab Python'i konfiguratsiooni

Loome debug playbook etappide kaupa:

6.2.1 Alustage uue failiga

bash touch debug-playbook.yml nano debug-playbook.ymltext

6.2.2 Play definitsioon

```yaml

  • name: "Debug ja veatuvastus" hosts: all gather_facts: yes

tasks: ```text

6.2.3 Task 1 - Näita süsteemi muutujaid

yaml - name: "Näita operatsioonisüsteemi" debug: msg: "OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"text

6.2.4 Task 2 - Kontrolli kasutajat

```yaml - name: "Kontrolli SSH kasutaja" command: whoami register: current_user

Text Only
1
2
3
- name: "Näita kasutaja infot"
  debug:
    msg: "SSH kasutaja: {{ current_user.stdout }}, Ansible kasutaja: {{ ansible_user_id }}"

``text **Selgitus:**register` salvestab käsu väljundi muutujasse

6.2.5 Task 3 - Kontrolli sudo

yaml - name: "Kontrolli sudo õiguseid" command: whoami become: yes register: sudo_user failed_when: falsetext Märkus: failed_when: false = ära lõpeta vea korral

6.2.6 Task 4 - Näita sudo tulemust

yaml - name: "Näita sudo tulemust" debug: msg: "Sudo kasutaja: {{ sudo_user.stdout | default('Sudo ei toimi') }}"bash

6.2.7 Task 5 - Kontrolli Python'i

yaml - name: "Kontrolli Python'i" debug: msg: "Python: {{ ansible_python_interpreter | default(ansible_python.executable) }}"text

6.2.8 Käivita ja analüüsi

bash ansible-playbook -i inventory.ini debug-playbook.yml -vbash Märkus: -v flag annab rohkem detaile


7. Labi hindamine ja reflektsioon

7.1 Tehnilised saavutused

Kontrollige, et järgmised asjad toimivad:

  • Ansible töötab - ansible --version näitab versiooni
  • SSH ühendus toimib - saate serveritesse ühenduda ilma paroolita
  • Inventory on funktsionaalne - ansible all -m ping tagastab "pong"
  • Ad-hoc käsud töötavad - saate hallata faile ja pakette
  • YAML süntaks on selge - mõistate taandrimist ja struktuuri
  • Esimene playbook toimib - kõik taskid õnnestuvad (roheline väljund)
  • Muutujad töötavad - saate muuta konfiguratsiooni muutujate kaudu
  • Nginx on käigus - curl http://localhost tagastab HTML
  • Konfiguratsioon optimeeritud - ansible.cfg on seadistatud

7.2 Kontseptuaalne mõistmine

Kontrollige oma mõistmist:

  1. Ansible arhitektuur:
  2. Selgitage oma sõnadega, miks Ansible on "agentless"
  3. Mis vahe on "control node" ja "managed node" vahel?

  4. Idempotency:

  5. Miks saab playbook'e turvaliselt korduvalt käivitada?
  6. Mis vahe on "changed" ja "ok" state'il?

  7. YAML ja muutujad:

  8. Miks on taandrimine YAML's nii oluline?
  9. Kuidas muutujad teevad playbook'i korduvkasutatavaks?

  10. SSH ja turvalisus:

  11. Miks on SSH võtmed paremad kui paroolid?
  12. Kuidas Ansible tagab turvalise kommunikatsiooni?

7.3 Praktilised oskused

🔧 Proovige ise:

  1. Muutke Nginx playbook'i:
  2. Lisage uus muutuja server_admin_email
  3. Muutke HTML template'i seda kasutama

  4. Looge uus playbook:

  5. Installige htop ja tree paketid
  6. Looge /opt/tools/ kaust
  7. Kirjutage info fail installitud tööriistade kohta

  8. Eksperimenteerige ad-hoc käskudega:

  9. Kontrollige kõigi serverite disk space'i
  10. Looge fail kõikides serverites praeguse kuupäeva ja ajaga

7.4 Valmidus järgmiseks

Te olete valmis kodutööks, kui: - Mõistate Ansible'i põhikontseptsioone - Saate kirjutada lihtsat YAML süntaksit - Oskate kasutada muutujaid ja template'e - Mõistate playbook'ide struktuuri - Saate tõrkeid diagnoosida ja lahendada


8. Järgmised sammud

Valmis kodutööks: - Kasutage siin õpitud oskusi LAMP stack playbook'i loomiseks - Rakendage learned patterns oma serverite automatiseerimiseks - Praktiseerige YAML süntaksit ja playbook struktuuri

Järgmine nädal (Ansible Advanced): - Roles ja Galaxy - Templates ja Jinja2 - Conditional logic ja loops - Multi-environment deployments


9. BOONUSÜLESANDED (Ansible'i oskajatele)

9.1 Advanced Playbook Patterns

```yaml

Advanced inventory and variables


  • name: Advanced Ansible patterns hosts: webservers vars: nginx_configs:
    • { name: "api", port: 3000, upstream: "app_servers" }
    • { name: "admin", port: 4000, upstream: "admin_servers" }

tasks: # Dynamic configuration generation - name: Generate nginx configs template: src: nginx-site.j2 dest: "/etc/nginx/sites-available/{{ item.name }}" loop: "{{ nginx_configs }}" notify: reload nginx

Text Only
1
2
3
4
5
6
7
# Conditional deployments
- name: Deploy based on environment
  git:
    repo: "{{ app_repo }}"
    dest: "/var/www/{{ app_name }}"
    version: "{{ 'main' if environment == 'production' else 'develop' }}"
  when: deployment_enabled | default(false)

```text

9.2 Error Handling ja Performance

```yaml

  • name: Advanced error handling hosts: all tasks: # Retry with exponential backoff

    • name: Download with retries get_url: url: "{{ app_url }}" dest: "/tmp/app.tar.gz" register: download retries: 5 delay: "{{ 2 ** (ansible_loop.index0) }}" until: download is succeeded

    Block/rescue/always pattern

    • name: Safe deployment block:
      • name: Deploy application unarchive: src: "/tmp/app.tar.gz" dest: "/var/www/" rescue:
      • name: Rollback on failure debug: msg: "Deployment failed, rolling back..." always:
      • name: Cleanup file: path: "/tmp/app.tar.gz" state: absent ```text

9.3 Custom Modules ja Advanced Features

```bash

Custom filter plugin

mkdir -p filter_plugins cat > filter_plugins/custom.py << 'EOF' class FilterModule(object): def filters(self): return {'custom_hash': self.custom_hash}

Text Only
1
2
3
def custom_hash(self, data):
    import hashlib
    return hashlib.md5(str(data).encode()).hexdigest()[:8]

EOF

Use in playbook

ansible-playbook -i inventory advanced.yml ```bash

9.4 Ansible Vault ja Security

```bash

Create encrypted variables

ansible-vault create secrets.yml ansible-vault edit secrets.yml

Use in playbook

ansible-playbook site.yml --ask-vault-pass

Vault in CI/CD

echo "vault_password" > .vault_pass ansible-playbook site.yml --vault-password-file .vault_pass ```bash

🎉 Hästi tehtud! Te olete nüüd võimelised automatiseerima nii põhilisi kui ka keerukamaid serverihalduse ülesandeid Ansible'iga!