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-praktikum
text
Nüüd loome inventory faili sammhaaval:
1.3.1 Looge tühi fail¶
bash
touch inventory.ini
text
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=local
bash
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 ping
text
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.yml
text
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.0
text
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: true
text
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.yml
text
3.2.2 Alustage YAML ja Play definitsiooniga¶
```yaml¶
- name: "Minu esimene Ansible playbook" hosts: all gather_facts: yes ```text Selgitus:
name:
= playbook'i kirjeldushosts: all
= käivita kõikidele serveritele inventory'sgather_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_sisu
text
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:
-
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 -
Kui kuiv käivitus õnnestus, siis tegelik käivitus:
bash ansible-playbook -i inventory.ini mu-esimene-playbook.yml
-
Vaadake tulemust:
- Kas kõik taskid õnnestusid (roheline)?
- 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.yml
text
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: yes
text
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: yes
text
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 |
|
```text
3.3.6 Käivita ja eksperimenteerige¶
bash
ansible-playbook -i inventory.ini playbook-muutujatega.yml
text
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.yml
text
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: present
text
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: yes
text
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 |
|
``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:
-
Süntaksi kontroll:
bash ansible-playbook -i inventory.ini --syntax-check nginx-setup.yml
-
Kuiv käivitus:
bash ansible-playbook -i inventory.ini --check nginx-setup.yml
Vaadake: Millised taskid näitavad "changed"? -
Tegelik käivitus:
bash ansible-playbook -i inventory.ini nginx-setup.yml
-
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 ```
- Brauseris (kui GUI on):
- Avage http://localhost
- 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.cfg
text
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.yml
text
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 |
|
``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: false
text
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 -v
bash
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:
- Ansible arhitektuur:
- Selgitage oma sõnadega, miks Ansible on "agentless"
-
Mis vahe on "control node" ja "managed node" vahel?
-
Idempotency:
- Miks saab playbook'e turvaliselt korduvalt käivitada?
-
Mis vahe on "changed" ja "ok" state'il?
-
YAML ja muutujad:
- Miks on taandrimine YAML's nii oluline?
-
Kuidas muutujad teevad playbook'i korduvkasutatavaks?
-
SSH ja turvalisus:
- Miks on SSH võtmed paremad kui paroolid?
- Kuidas Ansible tagab turvalise kommunikatsiooni?
7.3 Praktilised oskused¶
🔧 Proovige ise:
- Muutke Nginx playbook'i:
- Lisage uus muutuja
server_admin_email
-
Muutke HTML template'i seda kasutama
-
Looge uus playbook:
- Installige htop ja tree paketid
- Looge
/opt/tools/
kaust -
Kirjutage info fail installitud tööriistade kohta
-
Eksperimenteerige ad-hoc käskudega:
- Kontrollige kõigi serverite disk space'i
- 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 |
|
```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 |
|
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!