Ansible: конфигурация және деплой
(Бөлім: Технологиялар және Инфрақұрылым)
Қысқаша түйіндеме
Ansible - конфигурация мен оркестрдің декларативті құралы, VM/хосттарды, сервистерді және қосымшаларды қайталап баптау үшін өте ыңғайлы, инфрақұрылым құрылып қойған кезде (Terraform/IaC) және ортаны «жандандыру» қажет: пакеттерді орнату, релизді шығару, үлгілерді жылжыту, сервистерді тапсырусыз қайта іске қосу, қауіпсіздік саясатын қолдану Табыстың кілті: модульдік құрылым (рөлдер/коллекциялар), қатаң іспеттілік, құпиялармен ұқыпты жұмыс (Vault), динамикалық мүкәммал, тестілеу және GitOps-тәртіп.
Ansible орынды болғанда (және ол Terraform-мен қалай үйлеседі)
Terraform - ресурстарды (VPC, кластерлер, БД) құрады.
Ansible - OS/бағдарламалық жасақтаманы конфигурациялайды, нұсқаларды шығарады, көші-қонды басқарады, файлдар мен сервистерді басқарады.
Байлам: 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: іспеттес сценарийлер
Жалпы плейбук мысалы: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) құпияларды тиісті модульдер арқылы оқып, тек сілтемелерді/ARN Vault-да сақтаған дұрыс.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Ұсынымдар:
- Ортақ пайдаланыңыз: әзірлеушілер dev/stage, тек 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: фактілер қажет емес жерде false.
ұзақ операцияларға арналған async/poll; throttle/serial деплой толқындарына арналған.
Дара іс-қимылдар үшін delegate_to мен run_once (мысалы, ДБ көші-қоны).
Нөлдік даунтайм паттерндері
Rolling-деплой (20% -дан)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
'--limit web-canary' (топтың кіші тобы) ойнатқышын іске қосыңыз, өлшемдерін тексеріңіз, содан кейін бүкіл топқа таратыңыз.
Blue-Green
Хосттардың екі тобы 'web _ blue' және 'web _ green'; ойнатқышпен жаңа толқынды дайындаңыз, одан кейін трафикті (DNS/LB) community тапсырмасымен ауыстырып қосыңыз. general. Теңгерімшіңіздің affiliate_lb'/API.
Қауіпсіздік және hardening
hardening рөлі: SSH саясаты, баннерлер, 'sudo' жоқ NOPASSWD, файервол, 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: рөлдердің жергілікті/контейнерлік тестілері, теңсіздікті тексеру (өзгеріссіз екі рет өту).
Құмсалғыш: 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
Бақылау және аудит
Қосыңыз callback плагиндер (json/yaml/timer/profile_tasks) - уақыт және өзгерістер бойынша есептер.
Плейбуктердің логтарын орталықтандырылған сақтау орнына сақтаңыз.
'tags:' тапсырмаларын таңдаңыз.
iGaming үшін жиі рецептер
Web/API нода: Nginx + systemd-юнит, health-checks, secrets из менеджера, roll-restart.
Game-services: 'group _ vars' арқылы өңірлер/тенанттар бойынша пішіндер үлгілері.
Төлем коннекторлары: кілттерге қатаң пермиширленген, notify бойынша қайта іске қосу, эндпоинттерді пост-тексеру.
ETL джобтары: CronJob скрипттерін c 'cron' модулімен орналастыру, idempotent lock файлы.
Мониторинг: агенттерді орнату (node_exporter/otelcol), мониторингте авто-тіркеу).
Антипаттерндер
Модуль бар жерде 'shell/command' пайдалану.
'handlers' жоқ ойнатқыштар → артық қайта құру және сервистердің дірілдеуі.
Құпияларды 'group _ vars' ашық күйінде сақтау.
«serial »/« max _ fail _ percentage» болмауы.
Жаһандық 'gather _ facts: true' және 'become: true' қажет емес.
Molecule тестісіз және '--check' қолдауынсыз рөлдер.
Бүкіл толқынды бұғаттайтын 'async/poll' жоқ ұзақ командалар.
Енгізу чек-парағы
1. Репозиторий қаңқасы мен naming-конвенцияны келісіңіз.
2. Динамикалық мүкәммал мен bastionды теңшеңіз.
3. Рөлдерді (webapp/hardening/monitoring) және жинақтың пин нұсқасын бастау.
4. Vault және/немесе құпия менеджермен біріктіруді қосу.
5. Сәйкестікті қамтамасыз ету, '--check/--diff', handlers және тегтер.
6. CI бағдарламасына ansible-lint, yamllint, Molecule қосу.
7. Деплой паттернін (rolling/canary/blue-green) және 'serial' лимиттерін сипаттау.
8. callback плагиндерін қосу, логтарды жинау, өзгерістер туралы есеп беру.
9. Оқиғалар кезінде runbook және кері қайтару әрекеттерін құжаттау.
10. Тұрақты түрде game-day: SSH үзілісі, тұнбаның құлауы, нұсқаның кері қайтуы.
Қорытынды
Ansible құрылған инфрақұрылым мен жұмыс істейтін азық-түлік арасындағы «соңғы милді» жабады: конфигурациялар мен релиздердің жылдам, қауіпсіз және болжамды өзгерістері. Қайталап пайдаланудың ең аз бірлігі, динамикалық құрал-саймандар, құпиялармен дұрыс жұмыс істеу және тексерілген нөлдік даунтайм паттерндері ретінде рөлмен Ansible iGaming командаларына Time-to-Deploy-ды қысқартуға, түнгі оқиғалардың санын азайтуға және SLO деңгейінде p99 ұстауға көмектеседі.