YAML Struktura, Tasks va Handlers
1. YAML Struktura
YAML nima va nega kerak?
YAML (YAML Ain't Markup Language) - bu ma'lumotlarni tashkil etish uchun ishlatiladigan format. Ansible YAML ni tanlagan sabablari:
- Odam o'qishi oson - XML yoki JSON dan farqli o'laroq, oddiy matn kabi ko'rinadi
- Oddiy sintaksis - kam belgiler, ko'proq mantiq
- Ierarxik struktura - murakkab ma'lumotlarni tartibli qilish mumkin
- Izohlar qo'yish mumkin - kodga tushuntirish yozish
YAML ning asosiy tamoyillari:
Indentation (chekinish) - eng muhim qoida:
- Bo'shliqlar (spaces) bilan darajalar ajratiladi
- Tab belgisi ishlatilmaydi - faqat bo'shliqlar
- Bir xil darajadagi elementlar bir xil masofada bo'lishi kerak
- Odatda 2 yoki 4 ta bo'shliq ishlatiladi
Ma'lumot turlari:
- Oddiy qiymatlar (Scalars):
server_name: web-01
port: 80
ssl_enabled: true
- Ro'yxatlar (Lists):
packages:
- nginx
- php
- mysql
- Lug'atlar (Dictionaries):
database:
host: localhost
port: 3306
user: admin
Maxsus xususiyatlar:
- Ko'p qatorli matn -
|belgisi bilan - Izohlar -
#belgisi bilan - Ma'lumot qayta ishlatish -
&va*belgilari bilan
YAML da tez uchraydigan xatolar:
- Noto'g'ri chekinish - eng keng tarqalgan xato
- Tab va space aralashtirib yuborish
- Maxsus belgilarni noto'g'ri ishlatish
- Qo'shtirnoq bilan muammolar
2. Tasks (Vazifalar)
Task nima?
Task - bu Ansible playbook ning asosiy qurilish bloki. Har bir task bitta aniq vazifani bajaradi:
- Paket o'rnatish
- Fayl nusxalash
- Service ishga tushirish
- Foydalanuvchi yaratish va hokazo
Task ning anatamiyasi:
Har bir task quyidagi qismlardan iborat:
- Name - task ning tavsifi (majburiy emas, lekin tavsiya etiladi)
- Module - qanday amal bajarilishi (apt, copy, service va boshqalar)
- Parameters - modulga beriladigan sozlamalar
- Qo'shimcha parametrlar - when, register, notify va boshqalar
- name: "Task ning izohli nomi"
module_name:
parameter: qiymat
when: shart
register: natija
Task larning asosiy turlari:
1. Package Management Tasks:
- Dasturiy ta'minotni o'rnatish/o'chirish
- apt, yum, package modullari ishlatiladi
2. File Operations Tasks:
- Fayl va papkalar bilan ishlash
- copy, file, template modullari
3. Service Management Tasks:
- Serviclarni boshqarish
- service, systemd modullari
4. User Management Tasks:
- Foydalanuvchilar va guruhlar
- user, group modullari
5. System Tasks:
- Tizim sozlamalari o'zgartirish
- command, shell, sysctl modullari
Task parametrlari:
name parametri:
- Task ning maqsadini tushuntiradi
- Playbook ishlaganda ko'rsatiladi
- Debug qilishda yordam beradi
when parametri:
- Task ning shartli bajarilishi
- Jinja2 template sintaksisi ishlatiladi
- Mantiqiy amallarni qo'llash mumkin
register parametri:
- Task natijasini o'zgaruvchida saqlash
- Keyingi task larda ishlatish uchun
- Debug qilishda foydali
tags parametri:
- Task larni guruhlash
- Muayyan tag li task larni bajarish
- Katta playbook larda foydali
Task lar ketma-ketligi:
Ansible task larni yuqoridan pastga tartibda bajaradi:
- Har bir task yakka-yakka bajariladi
- Bitta task muvaffaqiyatsiz bo'lsa, keyingilari bajarilmaydi
ignore_errors: yesbilan xatolikni e'tiborsiz qoldirish mumkin
3. Handlers (Hodisa Ishlovchilar)
Handler nima?
Handler - bu maxsus task turi bo'lib, faqat boshqa task lar tomonidan chaqirilganda ishlaydi. Asosan quyidagi holatlarda ishlatiladi:
- Configuration fayl o'zgargandan keyin service ni restart qilish
- Ma'lumotlar bazasi backup qilish
- Log fayllarni tozalash
- Cache ni yangilash
Handler larning xususiyatlari:
- Notify orqali chaqiriladi - boshqa task lar ularni "xabardor qiladi"
- Playbook oxirida ishlaydi - barcha oddiy task lar tugagandan keyin
- Bir marta ishlaydi - bir necha marta notify qilinsa ham
- Tartib muhim - handlers bo'limida qanday tartibda yozilgan bo'lsa, shunday ishlaydi
Handler va Task orasidagi farq:
| Task | Handler |
|---|---|
| Har doim ishlaydi | Faqat notify qilinganda |
| Darhol bajariladi | Oxirda bajariladi |
| Bir necha marta ishlay oladi | Bir marta ishlaydi |
| Asosiy ish jarayoni | Qo'shimcha ish jarayoni |
Handler ishlash printsipi:
tasks:
- name: Copy config file
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx # Handler ni chaqirish
handlers:
- name: restart nginx # Handler nomi
service:
name: nginx
state: restarted
Ish jarayoni:
- Config fayl nusxalanadi
- Agar fayl o'zgargan bo'lsa, handler "notify" qilinadi
- Barcha task lar tugagandan keyin handler ishlaydi
- Nginx service restart qilinadi
Handler larning afzalliklari:
- Samaradorlik - faqat kerak bo'lganda ishlaydi
- Xavfsizlik - configuration o'zgarganda avtomatik restart
- Tartib - bir necha o'zgarish bo'lsa ham bir marta restart
- Modullik - bir handler ni turli task lar ishlatishi mumkin
Handler misollar:
Oddiy handler:
handlers:
- name: restart apache
service:
name: apache2
state: restarted
become: yes
Bir necha amal bajaruvchi handler:
handlers:
- name: reload web services
service:
name: "{{ item }}"
state: reloaded
loop:
- nginx
- php-fpm
Handler dan boshqa handler ni chaqirish:
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
notify: clear cache
- name: clear cache
command: rm -rf /var/cache/nginx/*
Handler lar bilan ishlashda maslahatlar:
- To'g'ri nomlash - handler nomi aniq va tushunarli bo'lishi kerak
- Listen ishlatish - bir nechta handler bitta nom bilan chaqirish
- Flush handlers - handler ni darhol ishga tushirish kerak bo'lsa
- Meta flush_handlers - playbook o'rtasida handler larni ishga tushirish
Listen parametri:
Bir nechta handler ni bitta nom bilan chaqirish:
handlers:
- name: restart web server
service:
name: nginx
state: restarted
listen: "restart web services"
- name: clear cache
command: rm -rf /tmp/cache/*
listen: "restart web services"
tasks:
- name: Update config
copy:
src: config.txt
dest: /etc/config.txt
notify: "restart web services"
Bu holda bitta notify ikki handler ni ishga tushiradi.
Handler debugging:
Handler ishlamagan holda tekshirish usullari:
- Task haqiqatan ham o'zgarish kiritganmi?
- Handler nomi to'g'ri yozilganmi?
- Handler handlers bo'limida joylashganmi?
- Syntax xatolar yo'qmi?
Handler lar Ansible ning eng kuchli xususiyatlaridan biri bo'lib, avtomatlashtirish jarayonini yanada oqilona va samarali qiladi.