Ansible: конфигурация жана деплой
(Бөлүк: Технология жана инфраструктура)
Кыскача резюме
Ansible - жарыя конфигурациялоо жана оркестрлөө куралы, VM/хостторду, кызматтарды жана тиркемелерди кайталап конфигурациялоо үчүн идеалдуу, инфраструктура буга чейин түзүлгөн (Terraform/IaC) жана айлана-чөйрөнү "жандандыруу" керек: пакеттерди орнотуу, релизди чыгаруу, шаблондорду тоголотуу, даунтайм жок кызматтарды кайра баштоо, коопсуздук саясатын колдонуу Ийгиликтин ачкычы: модулдук түзүлүш (ролдор/коллекциялар), катуу демпотенттик, сырлар менен тыкан иштөө (Vault), динамикалык инвентаризация, тестирлөө жана GitOps-тартип.
Ansible ылайыктуу болгондо (жана ал Terraform менен айкалышкан)
Terraform - ресурстарды (VPC, кластерлер, DD) түзөт.
Ansible - OS/программаны конфигурациялайт, версияларды чыгарат, миграцияны айдайт, файлдарды жана кызматтарды башкарат.
Link: Terraform чыгарат 'inventory '/IP/сырлар артефакттар, Ansible аларды окуп CD-кадам.
Репозиторийдин түзүлүшү (сунушталган үлгү)
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 (минималдуу):
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
Инвентаризация: статикалык жана динамикалык
Статикалык (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'
Динамикалык
Колдонуңуз булут плагиндер (же өз скрипт) тег боюнча ээсин тартуу. Чөйрө/тег өзгөрмөлөрү → 'group _ vars'.
Ролдору жана жыйнактары
Роль = көз карандысыз кайра колдонуу модулу (тапшырмалар, файлдар, шаблондор, хендлерлер).
Коллекциялар - ролдордун/плагиндердин/модулдардын жыйындысы. Pin версиялары 'collections/requirements. yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks: Демпотенттик скрипттер
жалпы playbook мисал:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
Ролу 'webapp' (үзүндүлөр):
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
Хендлерлер:
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 жана өзгөрмө үлгүлөрү
Дефолт өзгөрмөлөрүн 'defaults/main. yml ', сезимтал - Vault.
Фильтрлерди ('| to_nice_yaml',' | b64encode ',' | default ') жана' when 'шарттарын колдонуңуз.
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Сырлар: Ansible Vault жана сыр менеджерлери
Vault өзгөрмө файлдарды шифрлөө үчүн ('group _ vars/all. vault. yml`).
Тышкы менеджерлердин сырларын (KMS/Secrets Manager/SSM) тиешелүү модулдар аркылуу окуп, Vault гана шилтемелерди/ARN сактоо жакшы.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Сунуштар:
- Кирүү бөлүшүү: Иштеп dev/этап көрүп, прод - гана CI.
- Сырларды айлантуу жана кирүү аудитин киргизиңиз.
Демпотенттик жана туура өзгөрүүлөр
'shell/command' ордуна модулдарды ('package', 'user', 'lineinfile', 'template', 'systemd') колдонуңуз.
Эгер алар эч нерсени өзгөртпөсө, "ызы-чуу" милдеттерди 'changed _ when: false' деп белгилеңиз.
ролдору үчүн check mode ('--check') жана diff колдоо.
туруксуз тапшырмалар үчүн: '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
Аткаруу: ири чарбалар жана чокулары
forks: параллелизмди көтөрүү (этияттык менен: максатты ашыкча эмес).
strategy = free - кошуналарды күтпөстөн тапшырмаларды аткарыңыз.
pipelining = True в `ansible. cfg 'RTT азайтат.
gather_facts: чындык кереги жок жерде жалган.
узак мөөнөттүү операциялар үчүн async/poll; throttle/деплой толкундары үчүн сериясы.
delegate_to жана жекече аракеттер үчүн run_once (мисалы, БДнын миграциясы).
Нөл даунтайм үлгүлөрү
Rolling-deploy (20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
playbook с '--limit web-canary' (топтун бир бөлүгү) чуркап, өлчөө текшерип, андан кийин бүт топко жайылып.
Blue-Green
Эки хостинг тобу 'web _ blue' жана 'web _ green'; playbuck жаңы толкун даярдоо, андан кийин трафик (DNS/LB) тапшырма 'community. general. affiliate_lb'/API балансчы.
Коопсуздук жана hardening
hardening ролу: SSH-саясат, баннерлер, 'sudo' жок NOPASSWD, firewall, auditd/rsyslog, убакыт-NTP, 'fail2ban'.
SELinux/AppArmor кирет, модулдары аркылуу саясатты башкаруу.
Бастион: SSHти максаттарга jump-host аркылуу гана чектеңиз (караңыз 'ProxyJump').
Минималдаштыруу 'become: true'; инвентаризация деъгээлинде RBAC (ким ойнотмо баштаса болот).
Windows жана тармактык жабдуулар
Windows: 'win _' модулдары, WinRM байланышы, PowerShell скрипттери - акыркы аргумент катары.
Network: 'network _ cli '/' httpapi', Cisco/Juniper/F5 модулдары; атомдук 'save _ when: changed' аркылуу.
Тестирлөө жана сапаты
ansible-lint + yamllint в CI.
Molecule: жергиликтүү/контейнердик ролдорду тестирлөө, Идемпотенттикти текшерүү (өзгөрүүсүз Double прогон).
Sandbox: өзүнчө убактылуу жабдуулар/VM сүрөттөр.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
CI/CD жана GitOps менен интеграция
Типтүү пайплайн:1. Lint → Syntax check → Molecule.
2. Колдонмо артефакттарын куруу.
3. Deploy: `ansible-playbook -i inventories/prod site. yml --limit web --tags deploy`.
4. Өзгөргөн хосттар боюнча репортаж, блог артефакты.
Кадам үлгүсү (түшүнүк):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
Байкоо жана аудит
Connect callback плагиндер (json/yaml/timer/profile_tasks) - убакыт жана өзгөрүүлөр боюнча отчеттор.
Плейбуктардын логторун борборлоштурулган сактагычка сактаңыз.
Максаттарды белгилөө 'tags:' тандап баштоо жана иликтөөлөрдү тездетүү үчүн.
iGaming үчүн тез-тез рецепттер
Web/API Nod: Nginx + systemd-unit, health-checks, secrets менеджери, roll-restart.
Game-Services: 'group _ vars' аркылуу региондор/тенанттар боюнча конфигурациялардын шаблондору.
Төлөм коннекторлору: ачкычтарга катуу permisheny, notify боюнча кайра баштоо, пост-текшерүү эндпоинттери.
ETL Jobs: жайгаштыруу CronJob скрипт c 'cron' модулу, idempotent lock file.
Мониторинг: агенттерди орнотуу (node_exporter/otelcol), мониторингде авто-каттоо.
Антипаттерндер
'shell/command' модулу бар жерде колдонуу.
Playbook жок 'handlers' → ашыкча кайра жана титиреп кызмат.
Ачык 'group _ vars' жашыруун сактоо.
Жок 'serial '/' max _ fail _ percentage' деплой прод-толкун.
Global 'gather _ facts: true' жана 'become: true' кереги жок.
Molecule тесттери жок жана '-check' колдоосу жок ролдор.
'async/poll' жок узун командалар, бүт толкун бөгөттөп.
Киргизүү чек-тизмеси
1. Репозиторийдин жана naming-конвенциянын алкагын макулдашуу.
2. Динамикалык жабдуулар жана bastion орнотуу.
3. ролдорду баштоо (webapp/hardening/monitoring) жана жыйнактардын PIN нускасын.
4. Vault жана/же Secret Manager менен интеграцияны күйгүзүү.
5. Демпотенттикти камсыз кылуу, '--check/--diff', handlers жана tags.
6. ansible-lint, yamllint, Molecule ди туташтыруу.
7. Description pattern deploi (rolling/canary/blue-green) жана лимиттери 'serial'.
8. Кошуу callback плагиндер, жыйноо, өзгөрүүлөр жөнүндө отчет.
9. Runbook документтештирүү жана кайра жана окуялар боюнча иш-аракеттер.
10. Үзгүлтүксүз оюн-күнү өткөрүү: SSH үзүлүшү, Nodes кулап, кайра чыгаруу.
Жыйынтыктар
Ansible түзүлгөн жана азык-түлүк ортосундагы "акыркы миля" жабат: тез, коопсуз жана алдын ала өзгөрүүлөр конфигурацияларды жана релиздерди. Минималдуу кайра колдонуу бирдиги, динамикалык инвентаризация, сырлар менен туура иштөө жана текшерилген нөлдүк даунтайм үлгүлөрү катары роль менен Ansible iGaming командаларына Time-to-Deploy кыскартууга, түнкү инциденттердин санын азайтууга жана p99 SLO деңгээлинде сактоого жардам берет.