Ansible: konfiqurasiya və deploy
(Bölmə: Texnologiya və Infrastruktur)
Qısa xülasə
Ansible, VM/hostların, xidmətlərin və tətbiqlərin yenidən qurulması üçün ideal bir konfiqurasiya və orkestr vasitəsidir, infrastruktur artıq yaradılmışdı (Terraform/IaC) və ətrafı «canlandırmaq» lazımdır: paketləri quraşdırmaq, buraxmaq, şablonları yaymaq, downtime olmadan xidmətləri yenidən başlatmaq, təhlükəsizlik siyasətlərini tətbiq etmək Uğurun açarı: modul strukturu (rollar/kolleksiyalar), ciddi idempotentlik, sirlər (Vault), dinamik inventarlar, test və GitOps intizamı.
Ansible uyğun olduqda (və Terraform ilə necə birləşir)
Terraform - resurslar (VPC, klasterlər, DB) yaradır.
Ansible - OS/proqram konfiqurasiyası, versiyaları çıxarır, miqrasiyanı idarə edir, faylları və xidmətləri idarə edir.
Bağlama: Terraform 'inventory '/IP/sirləri artefaktlara çıxarır, Ansible onları CD addımda oxuyur.
Anbar strukturu (tövsiyə olunan şablon)
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 (minimum):
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
Inventar: statik və 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
Cloud plugins istifadə edin (və ya öz script) tagged hosts çəkmək üçün. Mühit/etiket dəyişənləri → 'group _ vars'.
Rollar və kolleksiyalar
Rol = müstəqil təkrar istifadə modulu (tapşırıqlar, fayllar, şablonlar, handlerlər).
Kolleksiyalar - rollar/plaginlər/modullar dəsti. Pin versiyası 'collections/requirements qeyd. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: idempotent ssenariləri
Ümumi playbook nümunəsi:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
'Webapp' rolu (fraqmentlər):
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
Hendlerlər:
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 şablonları və dəyişənlər
Defolt dəyişənlərini 'defaults/main-də saxlayın. yml ', həssas - Vault.
Filtrlərdən ('| to_nice_yaml',' | b64encode ',' | default ') və' when 'şərtlərindən istifadə edin.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Secrets: Ansible Vault və Secrets Managers
Dəyişən faylları ('group _ vars/all. vault. yml`).
Müvafiq modullar vasitəsilə xarici menecerlərdən (KMS/Secrets Manager/SSM) gizli oxumaq və yalnız link/ARN saxlamaq daha yaxşıdır.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Tövsiyələr:
- Paylaşın: developers dev/stage görür, prod - yalnız CI.
- Sirlərin rotasiyasını və giriş auditini daxil edin.
İdempotentlik və düzgün dəyişikliklər
«shell/command» əvəzinə modulları ('package', 'user', 'lineinfile', 'template', 'systemd') istifadə edin.
«Səs-küylü» vəzifələri 'changed _ when: false' qeyd edin.
Rollar üçün check mode ('--check') və diff saxlayın.
Qeyri-sabit tapşırıqlar üçün: '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
Məhsuldarlıq: böyük fermalar və zirvələr
forks: paralelliyi qaldırın (ehtiyatla: hədəfi həddən artıq yükləməyin).
strategy = free - qonşu gözləmədən tapşırıqları yerinə yetirin.
pipelining = True в `ansible. cfg 'RTT azaldır.
gather_facts: fakt lazım deyil false.
uzunmüddətli əməliyyatlar üçün async/poll; deploi dalğaları üçün throttle/serial.
Tək hərəkətlər üçün delegate_to və run_once (məsələn, DB miqrasiyası).
Sıfır endirim nümunələri
Rolling deploy (hər biri 20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
Playbook c '--limit web-canary' (qrupun alt çoxluğu) başlayın, metrikləri yoxlayın, sonra bütün qrupa yayın.
Blue-Green
Hostların iki qrupu 'web _ blue' və 'web _ green'; pleybukla yeni dalğa hazırlayın, sonra trafiki (DNS/LB) community vəzifəsi ilə dəyişdirin. general. affiliate_lb'/API balansı.
Təhlükəsizlik və hardening
Hardening rolu: SSH siyasəti, bannerlər, 'sudo' olmadan NOPASSWD, firewall, auditd/rsyslog, time-NTP, 'fail2ban'.
SELinux/AppArmor-u açın, modullar vasitəsilə siyasətləri idarə edin.
Bastion: SSH-ni yalnız jump-host vasitəsilə hədəflərə məhdudlaşdırın (bax 'ProxyJump').
Minimum 'become: true'; RBAC-ı inventar səviyyəsində tərtib edin (kim hansı playbukları işə sala bilər).
Windows və şəbəkə avadanlıqları
Windows: 'win _' modulları, WinRM bağlantısı, PowerShell skriptləri - son arqument kimi.
Network: 'network _ cli '/' httpapi', Cisco/Juniper/F5 üçün modullar; 'save _ when: changed' vasitəsilə atom.
Test və keyfiyyət
ansible-lint + yamllint в CI.
Molecule: yerli/konteyner rolları testləri, idempotentlik testi (dəyişməz ikiqat qaçış).
Qum qutusu: ayrı-ayrı müvəqqəti inventarlar/VM şəkilləri.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
CI/CD və GitOps ilə inteqrasiya
Tipik paypline:1. Lint → Syntax check → Molecule.
2. Tətbiq artefaktlarının qurulması.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Dəyişdirilmiş host, log artefaktı ilə reportaj.
Addım nümunəsi (konsepsiya):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
Müşahidə və audit
Callback pluginləri (json/yaml/timer/profile_tasks) - vaxt və dəyişiklik hesabatları.
Pleybuk qeydlərini mərkəzləşdirilmiş anbarda saxlayın.
Tapşırıqları 'tags:' seçici başlanğıclar və araşdırmaları sürətləndirmək üçün qeyd edin.
iGaming üçün tez-tez reseptlər
Web/API nod: Nginx + systemd-unit, health-checks, menecerdən secrets, roll-restart.
Game Services: 'group _ vars' vasitəsilə region/tenant konfiqurasiya şablonları.
Ödəniş konnektorları: açarlara ciddi permishenlər, notify ilə yenidən başlamaq, end-pointlərin post-yoxlanılması.
ETL Jobs: CronJob skriptlərinin c 'cron' modulu ilə yerləşdirilməsi, idempotent lock faylı.
Monitorinq: agentlərin quraşdırılması (node_exporter/otelcol), monitorinqdə avto qeydiyyat.
Antipatternlər
Modul olan yerdə 'shell/command' istifadə edin.
'handlers' olmadan playbook → əlavə restarts və titrəmə xidmətləri.
Sirləri açıq 'group _ vars' saxlayın.
'serial '/' max _ fail _ percentage' yoxluğu.
Qlobal 'gather _ facts: true' və 'become: true' ehtiyac olmadan.
Molecule testləri olmadan və '-check' dəstəyi olmadan rollar.
Bütün dalğanı bloklayan 'async/poll' olmadan uzun komandalar.
Giriş çek siyahısı
1. Anbar çərçivəsi və naming konvensiyaları ilə razılaşın.
2. Dinamik inventar və bastion konfiqurasiya.
3. Rollar (webapp/hardening/monitoring) və pin versiyası kolleksiyaları.
4. Vault və/və ya Secret Manager ilə inteqrasiyanı daxil edin.
5. İdempotentliyi təmin edin, '--check/--diff', handlers və tags.
6. CI-yə ansible-lint, yamllint, molecule qoşun.
7. Deploy nümunəsini (rolling/canary/blue-green) və 'serial' limitlərini təsvir edin.
8. Əlavə callback plugins, qeydlərin toplanması, dəyişiklik hesabatı.
9. Runbook və geri və hadisələr zamanı fəaliyyət sənədləşdirin.
10. müntəzəm oyun-day həyata: SSH qırılması, nod düşməsi, geri versiyası.
Nəticələr
Ansible yaradılan infrastruktur və işləyən qida arasında "son mil 'i bağlayır: konfiqurasiya və buraxılışlarda sürətli, təhlükəsiz və proqnozlaşdırıla bilən dəyişikliklər. Minimum təkrar istifadə vahidi, dinamik inventar, sirlər və yoxlanılmış sıfır endirim nümunələri ilə düzgün işləmə rolu ilə Ansible iGaming komandalarına Time-to-Deploy-u azaltmağa, gecə hadisələrinin sayını azaltmağa və p99-u SLO səviyyəsində saxlamağa kömək edir.