Kasuta paremal olevat sisukorda kiireks navigeerimiseks ↗️
Tere tulemast tagasi! Eelmisel nädalal õppisime Ansible'i variables, templates ja vault'i kasutamist. Täna astume järgmise suure sammu - õpime kirjutama professionaalset infrastruktuuri koodi ja võrdleme erinevaid tööriistu.
# Looge VM sekunditegavagrantinitubuntu/jammy64
vagrantup
# Ühendage VM'igavagrantssh
# Hävitage ja alustage uuestvagrantdestroy-f
vagrantup
```text
## Vagrant Project Setup### Basic Vagrantfile:```ruby
# VagrantfileVagrant.configure("2")do|config|# Base box (OS image)config.vm.box="ubuntu/jammy64"# VM resourcesconfig.vm.provider"virtualbox"do|vb|vb.memory="2048"vb.cpus=2end
# Network settingsconfig.vm.network"private_network",ip:"192.168.56.10"# Shared foldersconfig.vm.synced_folder".","/vagrant"# Ansible provisioningconfig.vm.provision"ansible"do|ansible|ansible.playbook="site.yml"ansible.inventory_path="inventory/vagrant"end
end
```text
### Multi-VM Setup:```ruby
Vagrant.configure("2")do|config|# Ansible test VMconfig.vm.define"ansible-vm"do|ansible|ansible.vm.box="ubuntu/jammy64"ansible.vm.network"private_network",ip:"192.168.56.11"ansible.vm.hostname="ansible-test"end
# Puppet test VM config.vm.define"puppet-vm"do|puppet|puppet.vm.box="ubuntu/jammy64"puppet.vm.network"private_network",ip:"192.168.56.12"puppet.vm.hostname="puppet-test"end
end
```text
## Vagrant Lifecycle```mermaid
graphTD
A["📝 vagrant init<br/>Loo Vagrantfile"]-->B[" vagrant validate<br/>Kontrolli konfiguratsiooni"]B-->C["🚀 vagrant up<br/>Käivita VM"]C-->D["🔗 vagrant ssh<br/>Ühenda VM'iga"]D-->E["⏸ vagrant halt<br/>Peata VM"]E-->F["🔄 vagrant reload<br/>Restart VM"]F-->G[🗑vagrantdestroy<br/>KustutaVM]styleAfill:#99ccff
styleBfill:#99ff99
styleCfill:#ffcc99
styleDfill:#ff9999
styleEfill:#cc99ff
styleFfill:#ffff99
styleGfill:#ff99cc
```text
```bash
# Projekt setupvagrantinit# Loo Vagrantfilevagrantvalidate# Kontrolli konfiguratsiooni# VM managementvagrantup# Käivita VMvagrantssh# Ühenda VM'igavagranthalt# Peata VMvagrantreload# Restart VMvagrantdestroy# Kustuta VM# Snapshots ja infovagrantsnapshotsaveclean# Salvesta snapshotvagrantsnapshotrestoreclean# Taasta snapshotvagrantstatus# Vaata VM olekut```bash
## Vagrant + Ansible Integration**Automaatneprovisioning:**
```ruby
config.vm.provision"ansible"do|ansible|ansible.playbook="site.yml"ansible.inventory_path="inventory"ansible.limit="all"ansible.verbose="v"end
```text
**Manualprovisioning:**
```bash
# VM käimas, provisioning käsitsivagrantup--no-provision
vagrantssh
# VM sees: install Ansible, run playbooks```text
## Demo: Quick Vagrant Test```bash
# Loo test projektmkdirvagrant-demo&&cdvagrant-demo
# Initialize Vagrantvagrantinitubuntu/jammy64
# Start VMvagrantup
# Connect and testvagrantssh
sudoaptupdate
exit# Cleanupvagrantdestroy-f
```bash
**💡Protip:**Vagrant'iga saate testida sama playbook'ierinevatelOS'idel!---## Ansible Roles tutvustus ### Loeng 2: Ansible Roles Architecture## Miks vajame role'e?Spagettikoodprobleem
Kujutageetteolukorda:teiebosstulebteiejuurdejaütleb:
>"Palun seadista mulle 50 veebiserveri, 20 andmebaasiserveri ja 30 monitoring serveri. Kõik peavad olema identse konfiguratsiooniga ja ma vajan seda homme valmis."**Kuidastesedategemahakkaksite?**
Enamikalgajaidhakkabkirjutamaühtsuurtplaybook'i:```yaml# monster-playbook.yml - 800+ rida õudust!- name: "Kõik ühes failis - ära tehke kunagi nii!" hosts: all tasks: # 100 task'inginxjaoks
-name:"Install nginx"-name:"Configure nginx main config"-name:"Setup nginx virtual hosts"-name:"Generate SSL certificates for nginx"-name:"Configure nginx security headers"# ... veel 95 task'i nginx jaoks# 80 task'i mysql jaoks-name:"Install mysql server"-name:"Configure mysql users"-name:"Setup mysql databases"# ... veel 77 task'i mysql jaoks# 60 task'i monitoring jaoks-name:"Install prometheus"-name:"Configure grafana"# ... veel 58 task'i monitoring jaoks# 40 task'i backup jaoks# 30 task'i SSL jaoks# 50 task'i security jaoks# ja nii edasi...```bash
**Seeonkohutavlahendus!**Miks?
1.**Võimatulugeda**-800+ridaühesfailis
2.**Võimatutestida**-peatetestimakogufailikorraga
3.**Eisaakorduvkasutada**-kuivajatenginx'i teises projektis?4. **Meeskonnatöö võimatu** - kuidas jagada kolleegidega?5. **Muudatused riskantne** - ühe asja muutmine võib midagi muud lõhkudaMa olen näinud selliseid 2000+ realisi playbook'epärisfirmades.Needonnaguspagettikood-keegieitea,miskuhukuulub!
---
## Mis on Ansible Role? LEGO klotsid meetod**AnsibleRoleonnaguLEGOklots.**
MõelgeLEGOpeale:
-Igaklotsteeb**ühteasjahästi**(autoratas,sein,katus)-Klotsidon**standardsed**-sobivadalatikokku
-Klotsidon**korduvkasutatavad**-samaratassobibautojalennukikülge
-Klotsidon**kombineeritavad**-saateehitadamaju,autosid,linnu
**Role'id töötavad täpselt samamoodi:**```yaml# site.yml - selge ja lihtne!- name: "Web servers setup" hosts: webservers roles: - common # Põhiseadistused (SSH, users, firewall) - nginx # Ainult veebiserver - php # Ainult PHP runtime - ssl # Ainult SSL sertifikaadid- name: "Database servers setup" hosts: dbservers roles: - common # SAMA common role! - mysql # Ainult andmebaas - backup # Ainult varundamine- name: "Monitoring servers setup" hosts: monitoring roles: - common # SAMA common role taas! - prometheus # Ainult monitoring - grafana # Ainult dashboardid```text**Vaadake, mis toimus:**- `common` role kasutatakse **kolmes erinevas kohas**- Iga role teeb **ainult ühte asja**- Kood on **selge ja loetav**- Saame **osasid eraldi testida**---## Role'ianatoomia:Majaehitamisemeetod
Mõelgerole'ilenagumajaehitamisele.Igalosaliselonomakohtjaeesmärk:
### Iga kausta eesmärk:
**`tasks/`** = Ehitusplaan
- Sisaldab kõiki samme, mis role teeb
- **Alati alustage siit** role'i lugemisel
**`defaults/`** = Standardmaterjalid
- Vaikimisi seaded, mida saab muuta
- **Madalaim prioriteet** - kõik muu kirjutab üle
**`vars/`** = Kindlad materjalid
- Seaded, mida role ise määrab
- **Kõrge prioriteet** - raske üle kirjutada
**`templates/`** = Kohandatavad osad
- Konfiguratsioonifailid, mida saab muutujatega kohandada
- Kasutab Jinja2 template engine'i
**`files/`** = Valmis detailid
- Staatilised failid, mis kopeeritakse otse
- Skriptid, sertifikaadid, etc.
**`handlers/`** = Häiresüsteemid
- Käivitatakse ainult siis, kui midagi muutus
- Tavaliselt teenuste restart'imine
**`meta/`** = Ehitusluba
- Kirjeldab, mida role vajab tööks
- Dependencies teiste role'idega
---
## Lihtne nginx role näide
Vaatame, kuidas lihtsaim nginx role välja näeks:
**`tasks/main.yml` - mis me teeme:**
```yaml
---
- name: "Install Nginx (alati kirjutage selged nimed!)"
package:
name: nginx
state: present
- name: "Configure Nginx (kasutame template'i)"
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx # See käivitab handler'i!
- name: "Start Nginx (enable = autostart boot'imisel)"
service:
name: nginx
state: started
enabled: yes
```text
**`defaults/main.yml` - vaikimisi seaded:**
```yaml
---
nginx_port: 80 # Enamik tahab port 80
nginx_user: www-data # Ubuntu standard user
nginx_worker_processes: 2 # Mõistlik algus
nginx_max_connections: 1024 # Piisav väikesele saidile
```text
**`templates/nginx.conf.j2` - konfiguratsioon:**
```nginx
user {{ nginx_user }};
worker_processes {{ nginx_worker_processes }};
events {
worker_connections {{ nginx_max_connections }};
}
http {
server {
listen {{ nginx_port }};
server_name _;
root /var/www/html;
index index.html;
}
}
```text
**`handlers/main.yml` - reaktsioonid:**
```yaml
---
- name: restart nginx
service:
name: nginx
state: restarted
```bash
**Näete, kui lihtne see on?** Iga fail teeb ühte asja ja need töötavad koos!
---
## Variable Precedence: Muutujate hierarhia
Ansible'is on muutujatel tähtsusjärjekord. See on üks keerulisemaid teemasid, aga **väga oluline mõista!**
Kõrgemad kirjutavad üle madalamad:
1. Command line (-e var=value) ← KÕIGE TUGEVAM (käsk)
2. Task vars
3. Block vars
4. Role vars ← vars/main.yml
5. Include vars
6. Set_facts
7. Registered vars
8. Host facts
9. Play vars
10. Host vars
11. Group vars
12. Role defaults ← KÕIGE NÕRGEM (soovitus)
### Praktiline näide hierarhiast:
```yaml
# defaults/main.yml (kõige nõrgem)
nginx_port: 80
# vars/main.yml (tugev)
nginx_port: 8080
# playbook.yml (tugevam)
- role: nginx
vars:
nginx_port: 9000
# Käsureal (kõige tugevam)
ansible-playbook site.yml -e nginx_port=3000
```text
**Tulemus:** nginx kuulab port **3000**!
### Kuidas seda meeles pidada:
- **Role defaults** = "Soovitused" (nõrgad)
- **Role vars** = "Reeglid" (tugevad)
- **Play vars** = "Käsud" (tugevamad)
- **Extra vars** = "Käsklused" (kõige tugevamad)
---
## Role'ide kasutamine playbook'is
#### Lihtne kasutamine:
```yaml
- name: "Deploy web application"
hosts: webservers
become: yes
roles:
- nginx
- php
- mysql-client
```text
#### Muutujatega kasutamine:
```yaml
- name: "Custom web server setup"
hosts: webservers
become: yes
roles:
- role: nginx
vars:
nginx_port: 8080
nginx_ssl_enabled: true
nginx_worker_processes: 4
```text
#### Conditional role'id:
```yaml
- name: "Environment-specific deployment"
hosts: all
become: yes
roles:
- common
- role: nginx
when: "'webservers' in group_names"
- role: mysql
when: "'dbservers' in group_names"
- role: monitoring
when: app_env == "production"
```text
---
## Role Creation Best Practices
### Loeng 3: Professionaalsed standardid
Nüüd kui teate, mis on role, õpime, kuidas teha neid **õigesti**. Ma olen näinud tuhandeid halbu role'e - aga hea uudis on see, et on lihtsad reeglid, mis muudavad teie role'id professionaalseteks!
---
## Reegel 1: Single Responsibility Principle
**"Üks role = üks vastutus"**
See on kõige olulisem reegel. Iga role peaks tegema täpselt ühte asja ja tegema seda hästi.
### Hea lähenemine
roles/
├── nginx/ # AINULT veebiserver
├── mysql/ # AINULT andmebaas
├── php/ # AINULT PHP runtime
├── ssl/ # AINULT SSL sertifikaadid
├── backup/ # AINULT varundamine
└── monitoring/ # AINULT jälgimine
**Miks see halb?**
- Kui MySQL vajab parandust, peate puutuma nginx'iga
- Ei saa nginx'i kasutada ilma MySQL'ita
- Raske testida - peate testima kõike korraga
- Suur ja keeruline - keegi ei saa aru
**Praktiline näide:**
Kujutage ette, et teil on `web-stack` role, mis teeb kõike. Siis tuleb uus projekt, kus vaja ainult nginx'i (ilma MySQL'ita). Mida te teete?
1. **Halvad valikud:**
- Kopeerite koodi ja eemaldatae MySQL osad (DRY printsiipi rikkumine)
- Lisate tuhandeeid `when` tingimusi (keeruline)
- Kasutate kogu role'i ja ignoreerite MySQL'i (raisatud ressursid)
2. **Hea valik:**
- Kasutate eraldi `nginx` role'i - töötab kohe!
---
## Reegel 2: 80/20 Konfigureeritavus
**80% juhtudest peaks role töötama vaikimisi seadetega!**
See tähendab, et algajad saavad kohe alustada, aga eksperdid saavad kõike muuta.
### Algajasõbralik defaults
```yaml
# defaults/main.yml - lihtne ja toimib kohe
webserver_port: 80 # Kõik teavad port 80
webserver_ssl_enabled: false # SSL on optional
webserver_user: www-data # Ubuntu standard
webserver_worker_processes: 2 # Mõistlik algus
# Lihtsad moodulid
webserver_modules:
- rewrite # URL rewriting
- ssl # HTTPS support
```text
### Eksperdi võimalused
```yaml
# playbook.yml - ekspert saab kõike muuta
- role: webserver
vars:
webserver_port: 443
webserver_ssl_enabled: true
webserver_ssl_cert: "/path/to/custom.pem"
webserver_worker_processes: 8
# Eksperdi moodulid
webserver_modules:
- rewrite
- ssl
- headers
- deflate
- geoip
- rate_limit
# Täiesti custom konfiguratsioon
webserver_custom_config: |
# Minu spetsiaalne konfiguratsioon
gzip on;
gzip_types text/css application/javascript;
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
}
```text
**Võtmepunktid:**
- **Defaults** peavad olema turvalised ja mõistlikud
- **Kõik peab olema üle kirjutatav** advanced kasutajatele
- **Dokumentatsioon peab sisaldama näiteid** mõlemale tasemele
---
## Reegel 3: Multi-OS tugi
Professionaalne role toetab mitut operatsioonisüsteemi. See tähendab, et sama role töötab Ubuntu's, Debian'is, CentOS'is, jne.
### Kuidas seda organiseerida:
**Praktilineerinevus:**
-**Ansible:**Tekäivitatekäsu→asjadjuhtuvadkohe
-**Puppet:**Temuudatekonfiguratsiooni→serveridküsivadhiljemmuudatusi
#### Keele erinevus**Ansible-YAML(tutav):**
```yaml
-name:"Install and start Apache"package:
name:apache2
state:present
-name:"Start Apache service"service:
name:apache2
state:started
enabled:yes
```text
**Puppet-DSL(uuskeel):**
```puppet
package{'apache2':
ensure=>installed,
}service{'apache2':
ensure=>running,
enable=>true,
require=>Package['apache2'],
}```bash
**Õppimiskõver:**
-**Ansible:**KuioskateYAML'i, oskate Ansible'i(1-2nädalat)-**Puppet:**Peateõppimauutkeelt(1-2kuud)---
## Praktiline võrdlus: Sama ülesanne mõlemas**Ülesanne:**Nginx+SSL+automaatnekäivitamine
### Ansible lahendus:```yaml
-name:"Nginx with SSL setup"hosts:webservers
become:yes
tasks:
-name:"Install packages"package:
name:['nginx','ssl-cert']state:present
-name:"Generate SSL certificate"command:>
opensslreq-new-x509-days365-nodes
-out/etc/ssl/certs/server.crt
-keyout/etc/ssl/private/server.key
-subj"/C=EE/ST=Harju/L=Tallinn/O=Company/CN={{ ansible_fqdn }}"args:
creates:/etc/ssl/certs/server.crt
-name:"Configure Nginx"template:
src:nginx.conf.j2
dest:/etc/nginx/nginx.conf
notify:reloadnginx
-name:"Start Nginx"service:
name:nginx
state:started
enabled:yes
```text
### Puppet lahendus:```puppet
classwebserver(String$ssl_cert_path='/etc/ssl/certs/server.crt',
String$ssl_key_path='/etc/ssl/private/server.key',
){package{['nginx','ssl-cert']:
ensure=>installed,
}exec{'generate-ssl-cert':
command=>"openssl req -new -x509 -days 365 -nodes \ -out ${ssl_cert_path} \ -keyout ${ssl_key_path} \ -subj '/C=EE/ST=Harju/L=Tallinn/O=Company/CN=${facts['fqdn']}'",
creates=>$ssl_cert_path,
path=>['/usr/bin','/bin'],
require=>Package['nginx'],
}file{'/etc/nginx/nginx.conf':
ensure=>present,
content=>template('webserver/nginx.conf.erb'),
require=>Package['nginx'],
notify=>Service['nginx'],
}service{'nginx':
ensure=>running,
enable=>true,
require=>File['/etc/nginx/nginx.conf'],
}}```text
**Puppettemplates(ERB):**
```erb
# nginx.conf.erbserver{listen443ssl;server_name<%=@fqdn%>;ssl_certificate<%=@ssl_cert_path%>;ssl_certificate_key<%=@ssl_key_path%>;<%if@enable_gzip-%>
gzipon;gzip_typestext/plainapplication/json;<%end-%>
}```bash
**Miserinevustmärkate?**
-Ansible:käsk-käsult,loogilinejärjekord
-Puppet:declarative,Puppetotsustabjärjekorra
---
## Millal kasutada mida?### Ansible on parem kui:**Väiksemadkeskkonnad**(<500serverit)>SSHconnection'id ei skaleeeru hästi suurte arvudega** DevOps meeskonnad** > YAML on tuttav, hea CI/CD integratsioon** Kiire arendus ja deployment**> Ei vaja agent'ideseadistamist,kohevalmis
**Multi-cloudkeskkonnad**
>SSHtöötabkõikjal,erinevateskeskkondades
**Containerorchestration**
>HeaintegratsioonDocker/Kubernetes'iga**Näited:**- Startup'iwebapplicationdeployment
-Developmentenvironmentideseadistamine-CI/CDpipelineautomation
-Cloudinfrastructureprovisioning
### Puppet on parem kui:**Suuremadkeskkonnad**(1000+serverit)>Agent'id töötavad paralleelselt, Master koordineerib** Enterprise compliance nõuded**> 24/7 monitoring, automatic configuration drift detection** Traditional IT meeskonnad**> Rohkem infrastructure-focused, vähem development** Long-term infrastructure management**> Agent'idjälgivadjaparandavadkonfiguratsioonipidevalt
**Regulatorycompliance**
>SOX,HIPAA,PCIDSS-built-inauditingjareporting
**Näited:**
-Enterprisedatacentermanagement
-Financialservices(banking,insurance)-Healthcaresystems(HIPAAcompliance)-Governmentagencies
-LargecorporateWindowsADenvironments
---
## Skaleeritavuse võrdlus### Ansible limitatsioonid:```bash
# 1000 serveriga SSH võib olla aeglaneansible-playbook-f50playbook.yml# Max 50 paralleelset```text
**Probleemidsuurteskeskkondades:**
-SSHconnectionpooltäis
-Võrguribalaius
-Controlmachine'i CPU/memory### Puppet eelised suurtes keskkondades:```bash# 10,000+ serverit ei ole probleem# Iga agent pull'ibiseseisvalt
# Master delegeerib tööd```bash
**Miksseetöötabparemini:**
-Hajutatudarhitektuur
-Agentstöötavadparalleelselt
-Masteroptimeeribressursse
---
## Infrastructure Drift ja Compliance### Ansible - "Fire and forget":
1. Käivitate playbook'i → serverid on õiges olekus
2. 2 nädalat hiljem → keegi muudab midagi käsitsi
3. Ansible ei tea sellest midagi
4. Järgmine deployment → parandab tagasi
**Plussid:** Lihtne, ei vaja agente
**Miinused:** Ei jälgi drift'i, võimalikud security augud
### Puppet - Pidev jälgimine:
1. Agent käib iga 30 minuti tagant
2. Kontrollib konfiguratsiooni
3. Parandab automaatselt drift'i
4. Reporteerib kõik muudatused PuppetDB'sse
5. Saate alert'e kui keegi konfiguratsiooni muudab
```bash
Plussid: Pidev compliance, drift detection Miinused: Keerulisem setup, vajab agente
Korduvkasutatavus - sama role mitmes projektis Testitavus - iga role eraldi testida Loetavus - selge struktuur Meeskonnatöö - lihtne jagada Hooldatavus - muudatused isoleeritud
Mõlemad tööriistad on head, aga erinevatel juhtudel:
Ansible = Tesla - innovaatiline, kiire, sobib modernsele DevOps'ile Puppet = Mercedes - traditsiooniliselt usaldusvääre, enterprise-ready