Ansible: yapılandırma ve dağıtım
(Bölüm: Teknoloji ve Altyapı)
Kısa Özet
Ansible, altyapı zaten oluşturulduğunda (Terraform/IaC) VM'lerin/ana bilgisayarların, hizmetlerin ve uygulamaların tekrar tekrar yapılandırılması için ideal olan bildirimsel bir yapılandırma ve düzenleme aracıdır ve ortamı "canlandırmanız" gerekir: paketleri yükleyin, piyasaya sürün, şablonları kullanıma sunun, hizmet dışı kalmadan hizmetleri yeniden başlatın, güvenlik politikaları uygulayın. Başarının anahtarı: modüler yapı (roller/koleksiyonlar), sıkı idempotence, sırlarla temiz çalışma (Vault), dinamik envanter, test ve GitOps disiplini.
Ansible ne zaman uygundur (ve Terraform ile nasıl uyum sağlar)
Terraform - kaynaklar oluşturur (VPC, kümeler, veritabanları).
Ansible - işletim sistemini/yazılımı yapılandırır, sürümleri kullanıma sunar, geçişleri yönlendirir, dosyaları ve hizmetleri düzenler.
Link: Terraform, 'envanter'/IP/sırları eserlere çıkarır, Ansible bunları bir CD adımında okur.
Depo yapısı (önerilen ş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
Envanterler: statik ve 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
Ana bilgisayarları etiketlemek için bulut eklentilerini (veya kendi komut dosyanızı) kullanın. Çevre/etiket değişkenleri - 'group _ vars'.
Roller ve Koleksiyonlar
Rol = bağımsız yeniden kullanım modülü (görevler, dosyalar, şablonlar, işleyiciler).
Koleksiyonlar - bir dizi rol/eklenti/modül. Koleksiyonlardaki/gereksinimlerdeki sürüm pinlerini düzeltin. yml '.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: Idempotent senaryoları
Genel bir oyun kitabı örneği:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
'Webapp' role (fragmanlar):
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
İşleyiciler:
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 ve Değişkenler
Varsayılan değişkenleri 'defaults/main'de saklayın. Yml ', hassas - Vault içinde.
Filtreleri ('| to_nice_yaml',' | b64encode', '| default') ve'ne zaman 'koşullarını kullanın.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Sırlar: Ansible Vault ve Gizli Yöneticiler
Değişken dosyaları şifrelemek için Vault ('group _ vars/all. Kasa dairesi. yml ').
Harici yöneticilerden (KMS/Secrets Manager/SSM) gelen sırları ilgili modüller aracılığıyla okumak ve yalnızca Vault'ta bağlantılar/ARN depolamak daha iyidir.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Öneriler:
- Erişimi paylaşın: geliştiriciler dev/stage, prod - only CI.
- Gizli rotasyonu ve erişim denetimini etkinleştirin.
Idempotency ve doğru değişiklikler
Shell/command yerine modülleri ('package', 'user', 'lineinfile', 'template', 'systemd') kullanın.
"Gürültülü" görevleri, hiçbir şeyi değiştirmezlerse 'değişti _ ne zaman: yanlış'olarak işaretleyin.
Destek kontrol modu ('--check') ve roller için diff.
Kararsız görevler için: '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
Performans: Büyük çiftlikler ve zirveler
çatallar: eşzamanlılığı yükseltir (dikkat: hedefi aşırı yüklemeyin).
strategy = free-Komşular beklemeden görevleri yürütmek.
Pipelining = True в 'ansible. cfg 'RTT'yi azaltır.
gather_facts: gerçeklerin gereksiz olduğu yerlerde yanlış.
Uzun vadeli operasyonlar için async/poll; Dağıtım dalgaları için gaz/seri.
Tek eylemler için delegate_to ve run_once (örneğin, veritabanı geçişi).
Sıfır kesinti süresi desenleri
Rolling Dağıtımı (her biri %20)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Kanarya
Playbook'u '--limit web-canary' (grubun bir alt kümesi) ile çalıştırın, metrikleri kontrol edin, ardından tüm gruba dağıtın.
Mavi-Yeşil
İki ana grup 'web _ blue've' web _ green '; Bir playbook ile yeni bir dalga hazırlayın, ardından trafiği (DNS/LB) 'topluluk göreviyle değiştirin. General. Dengeleyicini affiliate_lb'/API.
Güvenlik ve sertleştirme
Sertleştirme rolü: SSH politikaları, afişler, NOPASSWD olmadan 'sudo', güvenlik duvarı, auditd/rsyslog, time-NTP, 'fail2ban'.
SELinux/AppArmor'u etkinleştirin, modüller aracılığıyla politikaları yönetin.
Bastion: SSH'yi yalnızca jump-host üzerinden hedeflerle sınırlayın (bkz. 'ProxyJump').
'Oluştur: gerçek' minimize; RBAC'yi envanter seviyesinde çizin (kim hangi oyun kitaplarını çalıştırabilir).
Windows ve ağ donanımı
Windows: modüller 'win _', WinRM bağlantısı, PowerShell komut dosyaları - son argüman olarak.
Ağ: 'network _ cli'/' httpapi', Cisco/Juniper/F5 için modüller; 'save _ when: changed' aracılığıyla atomicity.
Test ve kalite
Ansible-tiftik + yamllint в CI.
Molekül: Lokal/konteyner rol testleri, idempotency kontrolü (çift çalışma değişmeden).
Sandbox: bireysel VM geçici envanter/görüntüler.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
CI/CD ve GitOps ile entegrasyon
Tipik boru hattı:1. Lint - Sözdizimi kontrolü - Molekül.
2. Bina uygulama eserleri.
3. Dağıtım: 'ansible-playbook -i envanterler/prod sitesi. yml --limit web --tags deploy '.
4. Değişen ana bilgisayarların raporu, günlüklerin eseri.
Örnek adım (konsept):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
Gözlemlenebilirlik ve denetim
Connect callback eklentileri (json/yaml/timer/profile_tasks) - zaman ve değişiklikler hakkında raporlar.
Playbook kayıtlarını merkezi depolamaya kaydedin.
Etiket 'etiketler:' Seçici çalışır ve soruşturmaları hızlandırmak için görevler.
iGaming için sık tarifler
Web/API düğümü: Nginx + systemd-unit, sağlık kontrolleri, yöneticiden sırlar, roll-restart.
Oyun hizmetleri: 'group _ vars' aracılığıyla bölge/kiracılara göre yapılandırma şablonları.
Ödeme konektörleri: tuşlar için sıkı olanlar, bildirim ile yeniden başlatma, uç noktaların kontrolü sonrası.
ETL işleri: CronJob komut dosyalarını 'cron' modülü, idempotent kilit dosyası ile dağıtmak.
İzleme: Ajanların kurulumu (node_exporter/otelcol), izlemede otomatik kayıt.
Antipatterns
Modülün olduğu yerde 'kabuk/komut' kullanılıyor.
Playbook'suz 'işleyiciler' - gereksiz yeniden başlatmalar ve servis jitter.
Sırların herkese açık 'group _ vars' içinde saklanması.
Üretim dalgası tükenmesi sırasında 'seri'/' max _ fail _ percent' eksikliği.
Global 'gather _ facts: true've' become: true 'gereksiz yere.
Molecule testi olmayan ve '--check' desteği olmayan roller.
Tüm dalgayı engelleyen 'async/poll' içermeyen uzun komutlar.
Uygulama kontrol listesi
1. Arşiv çerçevesi ve adlandırma kuralları üzerinde anlaşın.
2. Dinamik envanter ve kaleyi yapılandırın.
3. Koleksiyonların rollerini (webapp/sertleştirme/izleme) ve pin sürümlerini oluşturun.
4. Kasa ve/veya Gizli Yönetici ile entegrasyonu etkinleştirin.
5. Idempotency, '--check/--diff', işleyicileri ve etiketleri sağlayın.
6. Ansible-tiftik, yamllint, Molekül'ü CI'ye bağlayın.
7. Dağıtım desenini (yuvarlanma/kanarya/mavi-yeşil) ve 'seri' sınırlarını açıklayın.
8. Geri arama eklentileri, günlük koleksiyonu, değişiklik raporu ekleyin.
9. Belge geri alma çalışma kitapları ve olay eylemleri.
10. Düzenli olarak oyun günü tutun: SSH molası, düğüm bırakma, sürüm geri alma.
Sonuçlar
Ansible, oluşturulan altyapı ile işe yarayan satışlar arasındaki "son mili" kapatır: yapılandırmalarda ve sürümlerde hızlı, güvenli ve öngörülebilir değişiklikler. Minimal bir yeniden kullanım birimi, dinamik envanter, doğru gizli işleme ve doğrulanmış sıfır kesinti modelleri olarak Ansible, iGaming ekiplerinin Dağıtım Süresini azaltmasına, gece olaylarını azaltmasına ve SLO düzeyinde p99 tutmasına yardımcı olur.