Ansible
1. Ansible nima va qanday ishlaydi?
Ansible nima?
Ansible - bu ochiq manbali avtomatlashtirish vositasi bo'lib, IT infratuzilmasini boshqarish, dasturiy ta'minotni joylash (deployment) va konfiguratsiya boshqaruvi uchun ishlatiladi. U Red Hat kompaniyasi tomonidan ishlab chiqilgan va Python dasturlash tilida yozilgan.
Ansible ning asosiy xususiyatlari:
- Agentsiz (Agentless): Boshqariladigan serverlar ustida qo'shimcha dastur o'rnatish shart emas
- Deklarativ til: Siz nima kerakligini aytasiz, qanday qilishni emas
- Idempotent: Bir xil amaliyotni bir necha marta bajarishda natija o'zgarmaydi
- SSH orqali ulanish: Secure Shell protokoli orqali serverlarni boshqaradi
- YAML sintaksis: Odam o'qishi oson bo'lgan format
Ansible qanday ishlaydi?
Ansible "push" modelini ishlatadi:
- Control Node (Boshqaruvchi tugun) dan buyruqlar yuboriladi
- SSH orqali Managed Hosts (Boshqariladigan hostlar) ga ulanadi
- Vaqtinchalik Python skriptlar hosil qilinadi va bajariladi
- Natijalar qaytariladi va vaqtinchalik fayllar o'chiriladi
Control Node ----SSH----> Managed Host 1
| ----SSH----> Managed Host 2
| ----SSH----> Managed Host 3
|
Playbook
Inventory
Modules
Ansible ning asosiy tushunchalari:
- Inventory: Boshqariladigan serverlar ro'yxati
- Playbook: Vazifalar ketma-ketligi (YAML formatda)
- Task: Bitta amal yoki vazifa
- Module: Muayyan vazifani bajaruvchi kod qismi
- Role: Qayta ishlatilishi mumkin bo'lgan playbook qismlari
- Handler: Hodisalar natijasida bajariladigan maxsus tasklar
2. Control Node va Managed Hosts
Control Node (Boshqaruvchi Tugun)
Control Node - bu Ansible o'rnatilgan va barcha boshqaruv amaliyotlari bajarilayotgan asosiy kompyuter.
Control Node talablari:
- Python 2.7 yoki Python 3.5+ versiyasi
- Linux, macOS yoki WSL (Windows Subsystem for Linux)
- SSH client
- Windows to'g'ridan-to'g'ri Control Node bo'la olmaydi
Control Node vazifalarim:
- Inventory fayllarini saqlash
- Playbook larni saqlash va bajarish
- Managed hostlar bilan aloqa o'rnatish
- Modullar va kutubxonalarni saqlash
Managed Hosts (Boshqariladigan Hostlar)
Managed Hosts - bu Ansible tomonidan boshqariladigan serverlar, kompyuterlar yoki tarmoq qurilmalari.
Managed Host talablari:
- SSH serveri (Linux/Unix uchun)
- Python 2.6+ yoki Python 3.5+ (ba'zi modullar uchun)
- PowerShell 3.0+ (Windows uchun)
- WinRM (Windows uchun)
Managed Host turlari:
- Linux serverlar
- Windows serverlar
- Tarmoq qurilmalari (router, switch)
- Cloud platformalar (AWS, Azure, GCP)
- Container platformalar (Docker, Kubernetes)
Aloqa protokollari:
SSH (Linux/Unix uchun):
ansible_connection: ssh
ansible_host: 192.168.1.10
ansible_user: admin
ansible_ssh_private_key_file: ~/.ssh/id_rsa
WinRM (Windows uchun):
ansible_connection: winrm
ansible_host: 192.168.1.20
ansible_user: Administrator
ansible_password: password123
ansible_winrm_transport: ntlm
Local (mahalliy uchun):
ansible_connection: local
3. O'rnatish va Inventory Asoslari
Ansible ni o'rnatish
Ubuntu/Debian da:
# System yangilash
sudo apt update
# Ansible o'rnatish
sudo apt install ansible -y
# Yoki pip orqali
pip3 install ansible
# Versiyani tekshirish
ansible --version
CentOS/RHEL da:
# EPEL repository qo'shish
sudo yum install epel-release -y
# Ansible o'rnatish
sudo yum install ansible -y
# Versiyani tekshirish
ansible --version
macOS da:
# Homebrew orqali
brew install ansible
# Yoki pip orqali
pip3 install ansible
Ansible konfiguratsiya fayli
Ansible konfiguratsiyasi ansible.cfg faylida saqlanadi. Qidiruv tartibi:
ANSIBLE_CONFIGenvironment o'zgaruvchisi- Joriy katalogdagi
ansible.cfg - Home katalogdagi
~/.ansible.cfg /etc/ansible/ansible.cfg
Asosiy konfiguratsiya:
[defaults]
inventory = ./hosts
remote_user = ansible
host_key_checking = False
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/facts_cache
timeout = 30
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = True
Inventory Asoslari
Inventory - bu Ansible boshqaradigan barcha hostlarning ro'yxati.
INI formatdagi inventory:
Oddiy inventory (hosts fayli):
# Web serverlar
web1.example.com
web2.example.com
192.168.1.10
# Database serverlar
[databases]
db1.example.com
db2.example.com
# Load balancer lar
[loadbalancers]
lb1.example.com ansible_host=192.168.1.5
lb2.example.com ansible_host=192.168.1.6
# Guruh o'zgaruvchilari
[webservers:vars]
http_port=80
max_clients=200
# Guruhlarni birlashtirish
[production:children]
webservers
databases
loadbalancers
YAML formatdagi inventory:
inventory.yml fayli:
all:
hosts:
web1.example.com:
web2.example.com:
192.168.1.10:
children:
webservers:
hosts:
web1.example.com:
ansible_host: 192.168.1.11
http_port: 80
web2.example.com:
ansible_host: 192.168.1.12
http_port: 8080
vars:
max_clients: 200
databases:
hosts:
db1.example.com:
db2.example.com:
vars:
mysql_port: 3306
loadbalancers:
hosts:
lb1.example.com:
ansible_host: 192.168.1.5
lb2.example.com:
ansible_host: 192.168.1.6
Host o'zgaruvchilari:
[webservers]
web1.example.com ansible_host=192.168.1.11 ansible_user=admin
web2.example.com ansible_host=192.168.1.12 ansible_user=root ansible_port=2222
web3.example.com ansible_connection=local
Host o'zgaruvchilari faylda:
host_vars/web1.example.com.yml:
ansible_host: 192.168.1.11
ansible_user: admin
ansible_ssh_private_key_file: ~/.ssh/web1_key
http_port: 80
ssl_enabled: true
Guruh o'zgaruvchilari:
group_vars/webservers.yml:
http_port: 80
max_clients: 200
ssl_enabled: false
nginx_version: 1.18
group_vars/all.yml:
ntp_server: pool.ntp.org
timezone: Asia/Tashkent
ansible_user: ansible
Inventory ni tekshirish:
# Barcha hostlarni ko'rish
ansible-inventory --list
# Muayyan guruhni ko'rish
ansible-inventory --host web1.example.com
# Grafik formatda ko'rish
ansible-inventory --graph
# YAML formatda chiqarish
ansible-inventory --list -y
4. Ad-hoc Buyruqlar
Ad-hoc buyruqlar - bu Ansible ning eng oddiy va tez usuli bo'lib, playbook yozmasdan turib bitta vazifani bajarish uchun ishlatiladi.
Ad-hoc buyruqlarning sintaksisi:
ansible <pattern> -m <module> -a "<arguments>" [options]
Asosiy parametrlar:
<pattern>: Qaysi hostlar (all, guruh nomi, host nomi)-m <module>: Ishlatilishi kerak bo'lgan modul-a "<arguments>": Modulga beriladigan argumentlar-i <inventory>: Inventory fayli-u <user>: Remote foydalanuvchi-k: SSH parolini so'rash-K: sudo parolini so'rash--become: sudo huquqlarini ishlatish
Asosiy modullar bilan misollar:
1. Ping moduli:
# Barcha hostlarni tekshirish
ansible all -m ping
# Muayyan guruhni tekshirish
ansible webservers -m ping
# Bitta hostni tekshirish
ansible web1.example.com -m ping
2. Command moduli:
# Oddiy buyruq bajarish
ansible all -m command -a "uptime"
# Tizim ma'lumotlarini olish
ansible webservers -m command -a "df -h"
# Jarayonlarni ko'rish
ansible databases -m command -a "ps aux | grep mysql"
# Working directory belgilash
ansible all -m command -a "pwd" -a "chdir=/tmp"
3. Shell moduli:
# Shell buyruqlari (pipes, redirections)
ansible all -m shell -a "ps aux | grep nginx | wc -l"
# Environment o'zgaruvchilari bilan
ansible webservers -m shell -a "echo $HOME"
# Murakkab buyruqlar
ansible all -m shell -a "if [ -f /etc/passwd ]; then echo 'File exists'; fi"
4. Copy moduli:
# Fayl nusxalash
ansible webservers -m copy -a "src=/tmp/file.txt dest=/opt/file.txt"
# Matn yaratish
ansible all -m copy -a "content='Hello World' dest=/tmp/hello.txt"
# Ruxsatlar bilan nusxalash
ansible webservers -m copy -a "src=config.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644" --become
5. File moduli:
# Fayl yaratish
ansible all -m file -a "path=/tmp/testfile state=touch"
# Katalog yaratish
ansible webservers -m file -a "path=/opt/myapp state=directory mode=0755" --become
# Fayl o'chirish
ansible all -m file -a "path=/tmp/oldfile state=absent"
# Symbolic link yaratish
ansible webservers -m file -a "src=/opt/myapp/current dest=/opt/myapp/latest state=link"
# Ruxsatlarni o'zgartirish
ansible all -m file -a "path=/tmp/script.sh mode=0755"
6. Service moduli:
# Service ni ishga tushirish
ansible webservers -m service -a "name=nginx state=started" --become
# Service ni to'xtatish
ansible webservers -m service -a "name=apache2 state=stopped" --become
# Service ni qayta ishga tushirish
ansible databases -m service -a "name=mysql state=restarted" --become
# Service ni avtomatik ishga tushirishni yoqish
ansible all -m service -a "name=sshd state=started enabled=yes" --become
7. Package moduli (apt/yum):
# Paket o'rnatish (Ubuntu/Debian)
ansible webservers -m apt -a "name=nginx state=present" --become
# Paket o'rnatish (CentOS/RHEL)
ansible webservers -m yum -a "name=httpd state=present" --become
# Paket yangilash
ansible all -m apt -a "name=openssh-server state=latest" --become
# Paket o'chirish
ansible webservers -m apt -a "name=apache2 state=absent" --become
# Bir nechta paket o'rnatish
ansible all -m apt -a "name=git,curl,wget state=present" --become
8. User moduli:
# Foydalanuvchi yaratish
ansible all -m user -a "name=testuser state=present" --become
# Parol bilan foydalanuvchi yaratish
ansible all -m user -a "name=appuser password='$6$encrypted_password' state=present" --become
# Foydalanuvchini guruhga qo'shish
ansible webservers -m user -a "name=nginx group=www-data groups=ssl-cert append=yes" --become
# Foydalanuvchini o'chirish
ansible all -m user -a "name=olduser state=absent remove=yes" --become
9. Mount moduli:
# Disk mount qilish
ansible all -m mount -a "src=/dev/sdb1 path=/data fstype=ext4 state=mounted" --become
# Mount ni unmount qilish
ansible databases -m mount -a "path=/backup state=unmounted" --become
10. Cron moduli:
# Cron job yaratish
ansible all -m cron -a "name='backup script' minute=0 hour=2 job='/opt/backup.sh'" --become
# Cron job o'chirish
ansible all -m cron -a "name='old backup' state=absent" --become
Setup moduli - system faktlarini yig'ish:
# Barcha system ma'lumotlarini olish
ansible all -m setup
# Ma'lum faktlarni filterlash
ansible all -m setup -a "filter=ansible_os_family"
# Network ma'lumotlari
ansible webservers -m setup -a "filter=ansible_default_ipv4"
# Hardware ma'lumotlari
ansible all -m setup -a "filter=ansible_processor*"
# Memory ma'lumotlari
ansible databases -m setup -a "filter=ansible_memory_mb"
Qo'shimcha parametrlar:
# Parallel bajarish (default: 5)
ansible all -m ping -f 10
# Timeout belgilash
ansible all -m command -a "sleep 30" -T 60
# Ma'lum hostlarni chiqarib tashlash
ansible all -m ping --limit "!web3.example.com"
# Faqat ma'lum hostlarda bajarish
ansible all -m command -a "hostname" --limit "web*"
# Dry-run rejimi (check mode)
ansible webservers -m apt -a "name=nginx state=present" --check --become
# Verbose output
ansible all -m setup -v
ansible all -m ping -vv
ansible all -m command -a "hostname" -vvv
Xatoliklarni boshqarish:
# Xatolikda to'xtamaslik
ansible all -m command -a "false" -i
# Ma'lum miqdordagi xatolikda to'xtash
ansible all -m ping --max-fail-percentage=25
Maslahatlar:
- Xavfsizlik: Muhim buyruqlarni avval
--checkrejimida sinab ko'ring - Performance: Ko'p hostlar uchun
-fparametrini oshiring - Logging:
--verboserejimlarini debugging uchun ishlating - Inventory: Host naqshlarini to'g'ri ishlating (wildcards: *, [])
- Authentication: SSH kalitlarini parollardan afzal ko'ring
Ad-hoc buyruqlar tez va oddiy vazifalar uchun juda foydali, lekin murakkab va qayta ishlatilishi kerak bo'lgan vazifalar uchun playbook yozish yaxshiroq yondashuv hisoblanadi.