Skip to main content

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):

  1. Extra vars (kommanda qatori -e)
  2. Task vars (task ichida)
  3. Block vars (block ichida)
  4. Role va include vars
  5. Play vars (playbook ichida)
  6. Host facts (avtomatik yig'ilgan)
  7. Registered vars (task natijasi)
  8. Set_facts (o'rnatilgan faktlar)
  9. Role defaults (role standart qiymatlari)
  10. Inventory vars
  11. Group vars
  12. 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 nomi
  • ansible_os_family - OS turi (RedHat, Debian)
  • ansible_memory_mb - xotira hajmi
  • ansible_default_ipv4.address - asosiy IP manzil
  • ansible_processor_cores - CPU yadrolar soni
  • ansible_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 saqlash
  • loop_var - item o'rniga boshqa nom ishlatish
  • label - chiqarishda ko'rsatiladigan qisqa tavsif
  • pause - har bir iteratsiya orasida pauza

Xatolar bilan ishlash:

  • ignore_errors: yes - xato bo'lsa ham davom etish
  • Loop natijalarini register da 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 kerak
  • or - bittasi to'g'ri bo'lsa kifoya
  • not - teskari natija

Mavjudlik tekshirish:

  • is defined - variable belgilanganmi
  • is not defined - variable belgilanmaganmi
  • is 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:

  1. Shartlarni sodda qiling - murakkab mantiqni bir nechta qadamlarga bo'ling
  2. Variables ni tekshiring - mavjudligini doimo tekshiring
  3. Default qiymatlar bering - undefined variable larni oldini oling
  4. 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'zgartirgich
  • replace('old', 'new') - matnni almashtirish
  • trim - bo'shliqlarni olib tashlash

List filters:

  • join(' ') - elementlarni birlashtirish
  • sort - saralash
  • unique - takrorlanuvchilarni olib tashlash

Number filters:

  • round(2) - yaxlitlash
  • abs - absolyut qiymat

Default va conditional filters:

  • default('default_value') - mavjud bo'lmasa default
  • mandatory - 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:

  1. Template fayllar .j2 kengaytmasi bilan - aniqlik uchun
  2. Indentation saqlansin - YAML kabi template ham tartibli
  3. Error handling - undefined variables uchun default values
  4. Comments qo'ying - murakkab mantiqni tushuntiring
  5. Test qiling - har xil scenarios bilan sinab ko'ring
  6. 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_undefined orqali 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.