Ansible: konfiguratsiya va deploy
(Bo’lim: Texnologiyalar va infratuzilma)
Qisqacha xulosa
Ansible - konfiguratsiya va orkestratsiyaning deklarativ vositasi, infratuzilma yaratilgan VM/xostlar, servislar va ilovalarni takrorlash uchun juda mos keladi (Terraform/IaC) va atrof-muhitni «jonlantirish» kerak: paketlarni o’rnatish, relizni o’rnatish, shablonlarni prokat qilish, xizmatlarni downtaymsiz qayta ishga tushirish, xavfsizlik siyosatini qo’llash. Muvaffaqiyat kaliti: modulli tuzilma (rollar/kolleksiyalar), qatʼiy idempotentlik, sirlarni sinchkovlik bilan ishlash (Vault), dinamik inventarlar, test sinovlari va GitOps-intizom.
Ansible mos kelganda (va u Terraform bilan qanday birlashadi)
Terraform - resurslarni (VPC, klasterlar, DB) yaratadi.
Ansible - OS/dasturiy ta’minotni konfiguratsiya qiladi, versiyalarni chiqaradi, migratsiyani haydaydi, fayl va xizmatlarni boshqaradi.
Bog’lov: Terraform’inventory ’/IP/sirlarni artefaktlarga o’tkazadi, Ansible ularni CD’da o’qiydi.
Repozitoriy tuzilishi (tavsiya etiladigan shablon)
ansible/
inventories/
prod/
inventory. ini # or inventory. yaml group_vars/
all. yml web. yml db. yml host_vars/
web-01. yml stage/
...
roles/
webapp/
defaults/main. yml vars/main. yml tasks/main. yml handlers/main. yml templates/.j2 files/
meta/main. yml hardening/
...
playbooks/
site. yml deploy_webapp. yml hardening. yml collections/requirements. yml ansible. cfg
ansible. cfg (minimal):
ini
[defaults]
inventory = inventories/stage/inventory. ini stdout_callback = yaml callbacks_enabled = timer, profile_tasks interpreter_python = auto retry_files_enabled = False forks = 25 host_key_checking = True
Inventarlar: statik va dinamik
Statik (ini):ini
[web]
web-01 ansible_host=10. 0. 1. 10 web-02 ansible_host=10. 0. 1. 11
[db]
db-01 ansible_host=10. 0. 2. 10
[all:vars]
ansible_user=ansible ansible_ssh_common_args='-o ProxyJump=bastion@1. 2. 3. 4'
Dinamik
Xostlarni teglarga tortish uchun bulut plaginlaridan foydalaning. Muhit/tag oʻzgaruvchilari →’group _ vars’.
Rollar va kolleksiyalar
Rol = mustaqil qayta foydalanish moduli (vazifalar, fayllar, namunalar, xandlerlar).
Toʻplamlar - rollar/plaginlar/modullar toʻplami. Pin versiyalarini’collections/requirements’da yozib oling. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: idempotent stsenariylari
Umumiy pleybuk namunasi:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
’Webapp’ roli (parchalar):
yaml roles/webapp/tasks/main. yml
- name: Install packages:
name: ["nginx", "python3-venv"]
state: present
- name: Template configuration template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: "0644"
notify: Restart nginx
- name: unarchive artifact deploy:
src: "{{ webapp_package_url }}" # артефакт из CI dest: /opt/webapp remote_src: true creates: /opt/webapp/current
- name: Link to the current version of file:
src: "/opt/webapp/releases/{{ release_id }}"
dest: /opt/webapp/current state: link notify: Reload webapp
Xandlerlar:
yaml roles/webapp/handlers/main. yml
- name: Restart nginx service: { name: nginx, state: restarted }
- name: Reload webapp systemd: { name: webapp, state: reloaded, daemon_reload: true }
Jinja2 va oʻzgaruvchan namunalar
Defolt oʻzgaruvchilarini’defaults/main’da saqlang. yml’, sezgir - Vault.
Filterlardan (’| to_nice_yaml',’| b64encode’,’| default’) va’when’shartlaridan foydalaning.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Sirlar: Ansible Vault va maxfiy menejerlar
Oʻzgaruvchan fayllarni shifrlash uchun Vault (’group _ vars/all. vault. yml`).
Tashqi menejerlardan (KMS/Secrets Manager/SSM) sirlarni tegishli modullar orqali o’qish va faqat havolalarni/ARNni Vault’da saqlash yaxshiroqdir.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Tavsiyalar:
- Foydalanishni ajrating: ishlab chiquvchilar dev/stage’ni, faqat CI’ni koʻrishadi.
- Sirlarni almashtirish va kirish auditini kiriting.
Idempotentlik va to’g "ri o’zgarishlar
’shell/command’ oʻrniga (’package’,’user’,’lineinfile’,’template’,’systemd’) modullaridan foydalaning.
Hech narsani oʻzgartirmasa, «shovqinli» vazifalarni belgilang.
Rollar uchun check mode (’-check’) va diffni qoʻllab-quvvatlang.
Beqaror vazifalar uchun:’retries’,’delay’,’until’.
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
Unumdorlik: katta fermalar va cho’qqilar
forks: parallelizmni koʻtaring (ehtiyotkorlik bilan: maqsadni ortiqcha yuklamang).
strategy = free - qoʻshnilarni kutmasdan vazifalarni bajaring.
pipelining = True в `ansible. cfg RTT ni kamaytiradi.
gather_facts: fakt kerak boʻlmagan joyda false.
uzoq muddatli operatsiyalar uchun async/poll; deploy toʻlqinlari uchun throttle/serial.
Yakka tartibdagi harakatlar uchun delegate_to va run_once (masalan, DB migratsiyasi).
Nol dauntaym patternlari
Rolling-deploy (har biri 20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
’-limit web-canary’ pleybukini ishga tushiring, metriklarni tekshiring va butun guruhga yoying.
Blue-Green
’web _ blue’ va’web _ green’xostlarining ikki guruhi; yangi to’lqinni pleybuk bilan tayyorlang, keyin trafikni (DNS/LB) community vazifasi bilan almashtiring. general. Balanschi affiliate_lb'/API.
Xavfsizlik va hardening
Hardening roli: SSH siyosati, bannerlar,’sudo’siz NOPASSWD, fayervol, auditd/rsyslog, vaqt-NTP,’fail2ban’.
SELinux/AppArmor dasturini ishga tushiring.
Bastion: SSHni faqat jump-host orqali cheklang (’ProxyJump’ga qarang).
’become: true’ ni minimallashtiring; RBACni inventar darajasida rasmiylashtiring (kim qanday pleybuklarni ishga tushirishi mumkin).
Windows va tarmoq uskunalari
Windows:’win _’modullari, WinRM ulanishi, PowerShell skriptlari - oxirgi dalil sifatida.
Network:’network _ cli ’/’ httpapi’, Cisco/Juniper/F5 uchun modullar; ’save _ when: changed’.
Test va sifat
ansible-lint + yamllint в CI.
Molecule: rollarning lokal/konteyner testlari, idempotentlikni tekshirish (ikki marta o’zgarishsiz).
Qum qutisi: alohida vaqtinchalik inventarlar/VM tasvirlari.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
CI/CD va GitOps bilan integratsiya
Namunaviy payplayn:1. Lint → Syntax check → Molecule.
2. Ilova artefaktlarini tuzish.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Oʻzgartirilgan xostlar boʻyicha report, log artefakti.
Qadam (kontseptsiya) misoli:bash ansible-galaxy collection install -r collections/requirements. yml ansible-lint ansible-playbook playbooks/deploy_webapp. yml \
-i inventories/prod/inventory. ini \
-e release_id=${GIT_SHA} --diff
Kuzatuv va audit
Vaqt va oʻzgarishlar boʻyicha hisobotlar - callback plaginlarini (json/yaml/timer/profile_tasks) ulang.
Pleybuklar daftarlarini markazlashtirilgan saqlash joyiga saqlang.
’tags:’ vazifalarini tanlab ishga tushirish va tezlashtirish uchun belgilang.
iGaming uchun tez-tez retseptlar
Web/API noda: Nginx + systemd-unit, health-checks, secrets by manager, roll-restart.
Game-services:’group _ vars’orqali mintaqalar/tenantlar boʻyicha konfiguratsiya namunalari.
To’lov konnektorlari: kalitlarga qat’iy o’rnatilgan, notify bo’yicha qayta ishga tushirish, endpointlarni post-tekshirish.
ETL joblari: CronJob skriptlarini c’cron’moduli, idempotent lock-fayl bilan joylashtirish.
Monitoring: agentlarni o’rnatish (node_exporter/otelcol), monitoringda avto-ro’yxatdan o’tkazish).
Antipatternlar
Modul mavjud boʻlgan joyda’shell/command’dan foydalanish.
’handlers’ bo’lmagan pleybuklar → ortiqcha restartlar va xizmatlarning titrashi.
Maxfiylarni ochiq’group _ vars’da saqlash.
’serial ’/’ max _ fail _ percentage’ ning yo’qligi.
Global’gather _ facts: true’va’become: true’kerak emas.
Rollar Molecule testisiz va’-check’qo’llab-quvvatlamasdan.
Butun to’lqinni to’sib qo’yadigan’async/poll’bo’lmagan uzoq buyruqlar.
Joriy etish chek-varaqasi
1. Omborxona va naming-konventsiya ramkasini kelishib oling.
2. Dinamik inventar va bastionni moslashtiring.
3. Kolleksiyalarning (webapp/hardening/monitoring) va pin versiyalarini yaratish.
4. Vault va/yoki maxfiy menejer bilan integratsiyani yoqish.
5. Idempotentlikni ta’minlash,’-check/--diff’, handlers va teglar.
6. Ansible-lint, yamllint, Molecule ni CI ga ulash.
7. Deploy patterni (rolling/canary/blue-green) va «serial» limitlarini tavsiflash.
8. Callback plaginlari, log yigʻish, oʻzgarishlar haqida hisobot qoʻshish.
9. Runbook va qaytarish va hodisalarni hujjatlashtirish.
10. Muntazam ravishda game-day o’tkazish: SSH uzilishi, nod tushishi, versiya qaytishi.
Yakunlar
Ansible yaratilgan infratuzilma va ishlayotgan oziq-ovqat mahsulotlari o’rtasidagi «so’nggi mil» ni yopadi: konfiguratsiyalar va relizlarning tez, xavfsiz va oldindan aytib bo’ladigan o’zgarishlari. Minimal qayta ishlatish birligi, dinamik inventarlar, sirlar bilan to’g’ri ishlash va nol duntaym patternlari sifatida Ansible iGaming jamoalariga Time-to-Deploy-ni qisqartirishga, tungi hodisalar sonini kamaytirishga va SLO darajasida p99 saqlashga yordam beradi.