Variables, Loops, Conditionals va Templates
1. Variables va Facts
Variables (O'zgaruvchilar) nima?
Variables - bu Ansible playbook larida qayta ishlatiladigan qiymatlar. Ular kodni yanada moslashuvchan, qayta ishlatilishi mumkin va boshqarish oson qiladi.
Variables ning afzalliklari:
- Moslashuvchanlik - bir xil playbook ni turli muhitlarda ishlatish
- Markazlashtirish - bir joyda o'zgartirish, hamma joyda ta'sir qilish
- Xavfsizlik - maxfiy ma'lumotlarni alohida saqlash
- Qayta foydalanish - bir marta belgilab, ko'p joyda ishlatish
Variables ning ustunlik tartibi:
Ansible variables ni quyidagi tartibda qo'llaydi (yuqorisi pastinidan ustun):
- Extra vars (kommanda qatori
-e) - Task vars (task ichida)
- Block vars (block ichida)
- Role va include vars
- Play vars (playbook ichida)
- Host facts (avtomatik yig'ilgan)
- Registered vars (task natijasi)
- Set_facts (o'rnatilgan faktlar)
- Role defaults (role standart qiymatlari)
- Inventory vars
- Group vars
- Host vars
Variables ni belgilash usullari:
1. Playbook ichida vars bo'limi:
vars:
app_name: mywebapp
app_port: 8080
debug_mode: true
2. Alohida fayllardan:
vars_files:
- vars/common.yml
- vars/secrets.yml
3. Inventory da:
[webservers:vars]
nginx_version=1.18
ssl_enabled=true
4. Kommanda qatorida:
ansible-playbook site.yml -e "env=production debug=false"
Variables bilan ishlash:
Qiymatlarni birlashtirish:
- String concatenation:
"{{ app_name }}-{{ app_version }}" - Math operations:
{{ app_port | int + 100 }} - Default values:
{{ custom_port | default(8080) }}
Dictionary va list elementlari:
- Dictionary:
{{ database.mysql.host }} - List:
{{ users[0].name }} - Safe access:
{{ item.password | default('not_set') }}
Facts (Faktlar) tizimi:
Facts - bu Ansible tomonidan avtomatik yig'iladigan tizim haqidagi ma'lumotlar.
Foydali built-in facts:
ansible_hostname- host nomiansible_os_family- OS turi (RedHat, Debian)ansible_memory_mb- xotira hajmiansible_default_ipv4.address- asosiy IP manzilansible_processor_cores- CPU yadrolar soniansible_distribution- Linux distributivi
Facts bilan conditional logic:
when: ansible_os_family == "RedHat"
when: ansible_memtotal_mb > 4096
Custom facts yaratish:
/etc/ansible/facts.d/custom.fact faylida JSON yoki INI formatda ma'lumotlar saqlash mumkin.
Register mechanism:
Task natijalarini keyingi task larda ishlatish uchun register parametri ishlatiladi.
2. Loops (Takrorlashlar)
Loop nima va nega kerak?
Loop - bu bir xil amalni turli qiymatlar bilan bir necha marta bajarish imkonini beruvchi mexanizm. Bu DRY (Don't Repeat Yourself) tamoyilini amalga oshiradi.
Loop larning afzalliklari:
- Kodni qisqartirish - bir task o'rniga ko'plab elementlar uchun
- Xatolarni kamaytirish - copy-paste xatolarni oldini olish
- Maintainability - o'zgartirishlar faqat bir joyda
- Dinamiklik - ro'yxat uzunligi o'zgarishi mumkin
Loop ning asosiy turlari:
1. Oddiy ro'yxat bo'yicha loop:
loop:
- nginx
- php-fpm
- mysql-client
Eng oddiy va keng ishlatiladigan turi. {{ item }} orqali har bir elementga murojaat qilinadi.
2. Dictionary bo'yicha loop:
loop:
- name: admin
uid: 1001
- name: user1
uid: 1002
{{ item.name }} va {{ item.uid }} orqali dictionary elementlariga murojaat.
3. Key-value loop:
Variables da dictionary mavjud bo'lsa, uni dict2items filter orqali loop ga aylantirish mumkin.
4. Range loop:
Raqamli diapazon uchun range() funksiyasi ishlatiladi.
5. File patterns:
lookup('fileglob', 'pattern') orqali fayl naqshlari bo'yicha loop.
6. Nested loops:
Ichma-ich joylashgan takrorlashlar uchun product() filter.
Loop parametrlari:
loop_control:
index_var- joriy index ni saqlashloop_var- item o'rniga boshqa nom ishlatishlabel- chiqarishda ko'rsatiladigan qisqa tavsifpause- har bir iteratsiya orasida pauza
Xatolar bilan ishlash:
ignore_errors: yes- xato bo'lsa ham davom etish- Loop natijalarini
registerda saqlash va keyin tahlil qilish
3. Conditionals (Shartli Bajarish)
Conditionals nima?
Conditionals - bu task larni faqat ma'lum shartlar bajarilganda ishlatish imkonini beruvchi mexanizm. Bu playbook larni yanada oqilona va moslashuvchan qiladi.
Conditionals ning maqsadlari:
- Platform awareness - turli OS larda turlicha harakat qilish
- Environment-specific - dev, staging, production uchun alohida
- Resource optimization - faqat kerak bo'lganda bajarish
- Error handling - xatoli holatlarni boshqarish
when statement:
when - eng asosiy conditional statement. Jinja2 expression qaytaradigan natija True bo'lsa task bajariladi, False bo'lsa o'tkaziladi.
Conditional operatorlar:
Taqqoslash operatorlari:
==(teng),!=(teng emas)>,>=,<,<=(raqamli taqqoslash)in,not in(ro'yxatda mavjudligi)
Mantiqiy operatorlar:
and- ikkalasi ham to'g'ri bo'lishi kerakor- bittasi to'g'ri bo'lsa kifoyanot- teskari natija
Mavjudlik tekshirish:
is defined- variable belgilanganmiis not defined- variable belgilanmaganmiis none- qiymat None mi
Conditional misollar:
OS-based conditionals:
when: ansible_os_family == "RedHat"
when: ansible_distribution == "Ubuntu"
Resource-based conditionals:
when: ansible_memtotal_mb > 4096
when: ansible_processor_cores >= 4
Multi-condition:
when:
- environment == "production"
- ssl_enabled | default(false)
- certificate_path is defined
Conditional best practices:
- Shartlarni sodda qiling - murakkab mantiqni bir nechta qadamlarga bo'ling
- Variables ni tekshiring - mavjudligini doimo tekshiring
- Default qiymatlar bering - undefined variable larni oldini oling
- Izoh yozing - murakkab shartlarni tushuntiring
4. Templates (Jinja2)
Template nima?
Template - bu dinamik kontent yaratish uchun ishlatiladigan fayl. Bu statik fayl emas, balki Ansible tomonidan variables bilan to'ldiriladi va nihoyat maqsadli faylga aylanadi.
Template larning afzalliklari:
- Dinamik kontent - har bir host uchun individual
- Konfiguratsiya boshqaruvi - markazlashtirilgan, lekin moslashtirilgan
- Qayta foydalanish - bitta shablon, ko'plab fayllar
- Maintainability - o'zgartirishlar bitta joyda
Jinja2 Template Engine:
Jinja2 - Python dunyosidagi eng mashhur template engine. Ansible uni ichki qismida ishlatadi.
Jinja2 ning xususiyatlari:
- Powerful expressions - murakkab mantiq
- Control structures - if, for, while
- Filters - ma'lumotlarni o'zgartirish
- Macros - qayta ishlatilishi mumkin bo'lgan kod qismlari
- Template inheritance - template larni kengaytirish
Jinja2 Syntax:
Asosiy sintaksis elementlari:
- Variable output:
{{ variable }}- qiymatni chiqarish - Control statements:
{% statement %}- mantiqiy struktura - Comments:
{# comment #}- izohlar
Template da Variables:
Oddiy variable ishlatish:
Server name: {{ ansible_hostname }}
Port: {{ app_port | default(8080) }}
Dictionary va list elements:
Database host: {{ database.mysql.host }}
First user: {{ users[0].name }}
Control Structures:
Conditional blocks:
{% if ssl_enabled %}
SSL Certificate: {{ ssl_cert_path }}
{% else %}
SSL: Disabled
{% endif %}
Loops in templates:
{% for user in users %}
User: {{ user.name }} ({{ user.role }})
{% endfor %}
Combined structures:
{% for host in groups['webservers'] %}
{% if hostvars[host]['ssl_enabled'] %}
server {{ hostvars[host]['ansible_default_ipv4']['address'] }} ssl;
{% endif %}
{% endfor %}
Jinja2 Filters:
Filters - ma'lumotlarni o'zgartirish uchun ishlatiladigan funksiyalar.
String filters:
upper,lower- harflar o'zgartirgichreplace('old', 'new')- matnni almashtirishtrim- bo'shliqlarni olib tashlash
List filters:
join(' ')- elementlarni birlashtirishsort- saralashunique- takrorlanuvchilarni olib tashlash
Number filters:
round(2)- yaxlitlashabs- absolyut qiymat
Default va conditional filters:
default('default_value')- mavjud bo'lmasa defaultmandatory- majburiy qiymat
Template faylni ishlatish:
- name: Generate config file
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
mode: '0644'
notify: reload nginx
Template Best Practices:
- Template fayllar
.j2kengaytmasi bilan - aniqlik uchun - Indentation saqlansin - YAML kabi template ham tartibli
- Error handling - undefined variables uchun default values
- Comments qo'ying - murakkab mantiqni tushuntiring
- Test qiling - har xil scenarios bilan sinab ko'ring
- Security - user input ni escape qiling
Template organizatsiyasi:
Template hierarchy:
- Base templates - umumiy shablon
- Child templates - meros qilib oluvchi shablonlar
- Include fragments - kichik qismlar
Template da xatolar:
- Undefined variables -
strict_undefinedorqali boshqarish - Type errors - variable turlarini tekshirish
- Encoding issues - UTF-8 ni to'g'ri sozlash
Template lar Ansible ning eng kuchli qismlaridan biri bo'lib, infrastructure-as-code konsepsiyasini to'liq amalga oshirish imkonini beradi. To'g'ri ishlatilganda, konfiguratsiya boshqaruvi juda osonlashadi va xatolar sezilarli darajada kamayadi.