Ansible 'կազմաձևումը և դոպլան
(Բաժին ՝ Տեխնոլոգիաներ և ենթակառուցվածքներ)
Live ռեզյումե
Ansible-ը միգրացիոն և նվագախմբային գործիք է, որը կատարյալ հարմար է կրկնվող VM/հանրակացարանների, ծառայությունների և ծրագրերի համար, երբ ենթակառուցվածքն արդեն ստեղծվել է (Terraform/IaC) և պետք է «վերակենդանացնել» շրջապատը 'տեղադրել փաթեթներ, փաթաթել մասունքները, շրջել ձևանմուշները, վերաշարադրել ծառայությունները առանց duntaim, օգտագործել անվտանգության քաղաքականությունները։ Հաջողության բանալին 'մոդուլային կառուցվածք (դերեր/հավաքածուներ), խիստ գաղափարախոսություն, գաղտնիքների հետ կոկիկ աշխատանք (Vox), դինամիկ շահառուներ, թեստավորում և GitOps կարգապահություն։
Երբ տեղավորվում է Ansible (և ինչպես է այն համակցվում Terraform-ի հետ)
Terraform-ը ստեղծում է ռեսուրսներ (MSC, կլաստերներ, BD)։
Ansible-ը հայտարարում է OS/PO-ը, նետում տարբերակները, հետապնդում է կոդերը, կառավարում ֆայլերը և ծառայությունները։
Կապը 'Terraform-ը բերում է «entory »/IP/գաղտնիքները արտեֆակտներում, Ansible-ը կարդում է դրանք CD-2019-ում։
Ռեպոզորիայի կառուցվածքը (առաջարկվող ձևանմուշը)
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 "։
Դերեր և հավաքածուներ
Դերը = անկախ երկրորդ օգտագործման մոդուլը (առաջադրանքներ, ֆայլեր, ձևանմուշներ, handlers)։
Հավաքածուները դերերի/plagins/մոդուլների հավաքածու են։ Տարբերակների պինները գրանցեք «collections/requirements» -ում։ yml`.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Playbooks 'idempotent սցենարներ
Ընդհանուր պլեյբուկի օրինակ
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
Handlers
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 և 108 ձևանմուշները
Պահեք դեֆոլտ բջիջները 'ww.aul.ru/main։ yml ', զգայուն' Vox-ում։
Օգտագործեք ֆիլտրեր («wwww.to _ nice _ yaml», «www.b64encode», «wwwwen») և «when» պայմանները։
Օրինակ 'nginx։ conf. j2`:jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Գաղտնիքները ՝ Ansible Vance և գաղտնիքների ղեկավարներ
Փոփոխականների ֆայլերը կոդավորելու համար ("group _ vars/all. vault. yml`).
Ավելի լավ է կարդալ արտաքին ղեկավարների գաղտնիքները (KFC/Secrets System/SSM) համապատասխան մոդուլների միջոցով և պահել Vox-ում միայն հղում/ARN։
Ծածկագրված ֆայլը (կառուցվածքի օրինակ)
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Առաջարկություններ
Բաժանեք հասանելիությունը 'զարգացողները տեսնում են dev/stage, prod միայն CI-ն։
Միացրեք գաղտնիքների ռոտացիան և հասանելիության աուդիտը։
Idempotenty և ճիշտ փոփոխություններ
Օգտագործեք մոդուլներ («package», «user», «lineinfile», «template», «shell/command») փոխարեն։
Խոչընդոտեք «աղմկոտ» առաջադրանքները «changed _ when: false», եթե նրանք ոչինչ չեն փոխում։
Աջակցեք k mode («--check») և diff դերերի համար։
Անկայուն առաջադրանքների համար '«retries», «www.ay», «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 ալիքների համար։
degate _ to և run _ once միասնական գործողությունների համար (օրինակ, BD խմբակցությունը)։
Զրոյական dauntaima
Rolling-depla (20%)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canary
«-limit web-canary» (խմբի ենթաօրենսդրությունը), ռուսական մետրերը, ապա բաժանեք ամբողջ խմբին։
Blue-Green
Երկու խմբեր «web _ blue» և «web _ green»; Պլեյբուսով պատրաստեք նոր ալիք, ապա անջատեք հյուրանոցները (CSA/LB) «community» առաջադրանքը։ general. affiliate _ lb '/API ձեր հավասարակշռիչ։
Անվտանգություն և hardening
Hardening-ի դերը 'SSH քաղաքականությունը, բանները, «sudo» առանց NOPASSWD, ֆայերվոլ, auditd/rsyslog, ժամանակ-NTP, «fail2ban»։
Միացրեք SELinux/ApPARmor-ը, կառավարեք քաղաքական գործիչները մոդուլների միջոցով։
Բաստիոն 'սահմանափակեք SSH նպատակներին միայն jump-host-ի միջոցով (տե՛ ս «ProxyJump»)։
Նվազագույնի հասցրեք 'become: 108'; Նախագծեք RBAC-ը բուլղարների մակարդակում (ով կարող է սկսել ինչ պլեյբուսներ)։
Windows և ցանցային սարքավորումներ
Windows: մոդուլներ 'win _', WinRM, PowerShell-ջութակները 'որպես վերջին փաստարկ։
Network: «network _ cli »/« httpapi», Cisco/Juniper/F5 մոդուլներ; Ատոմականությունը «save _ wen: changed» -ի միջոցով։
Փորձարկումը և որակը
ansible-lint + yamllint в CI.
Molecule: տեղական/բեռնարկղային դերերի թեստեր, idempotenty ստուգում (կրկնակի պրոթոն անփոփոխ)։
Ավազը 'առանձին ժամանակավոր ռոտարիներ/VM պատկերներ։
Օրինակ Molecule (հատված)
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Ինտեգրումը CI/CD և GitOps-ի հետ
Տիպիկ pline
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-plagins (json/yaml/timer/profile _ tasks) - ժամանակի և փոփոխությունների հաշվետվություններ։
Պահպանեք պլեյբուսների լույսերը կենտրոնացված պահեստում։
Նշեք առաջադրանքները 'tags: ' ընտրության գործարկման և արագացման համար։
Հաճախակի բաղադրատոմսեր iGaming-ի համար
Web/API noda: Nginx + wwww.emd-unit, health-winks, secrets ղեկավարից, roll-restart։
Game-ծառայությունները 'ռեգիոնների/տենանտների ձևանմուշները' «group _ vars» -ի միջոցով։
Հիբրիդային գրասենյակները 'խիստ պղպջակներ, որոնք վերագործարկվում են notify-ի վրա, էնդպոինտների հետադարձ ստուգում։
ETL-ջոբները ՝ www.Cast Job-ջութակները c 'cript' em, idempotent dik-ֆայլը։
Տե՛ ս գործակալների տեղադրումը (node _ exporter/otelcol), auto-2019 դիտարկման մեջ։
Antipatterny
«Shell/command» օգտագործումը, որտեղ կա մոդուլ։
Պլեյբուսները առանց «handlers» են ավելցուկ ռեստարտներ և ծառայությունների խմորումը։
Գաղտնիքների պահպանումը բաց «group _ vars» -ում։
«Serial »/« max _ fail _ percentage» -ի բացակայությունը, երբ ավելացնում է prod ալիքները։
Գլոբալ "gather _ facts" ՝ www.ru "և" become: www.ru "առանց անհրաժեշտության։
Դերերը առանց Molecule թեստերի և առանց աջակցության «--check»։
Երկար թիմեր առանց «async/poll», որոնք արգելափակում են ամբողջ ալիքը։
Ներդրման թուղթ
1. Համաձայնեք ռեպոզիտորիայի և naming-կոնվենցիայի շրջանակը։
2. Պարեք դինամիկ կիսագնդի և bastion։
3. Դերերը (webapp/hardening/monitoring) և հավաքածուների տարբերակները։
4. Միացրեք Vulti/կամ ինտեգրումը գաղտնիքների մենեջերի հետ։
5. Ապահովել idempotenty, ----check/---diff ", handlers և tegi։
6. Միացրեք ansible-lint, yamlint, Molecule-ը CI-ում։
7. Նկարագրեք pattern deploa (rolling/canary/blue-green) և limits 'serial "։
8. Ավելացնել callback-plagins, լոգարանների հավաքումը, փոփոխությունների զեկույցը։
9. Փաստաթղթավորել runbook-ը և արձագանքը և գործողությունները միջադեպերի ժամանակ։
10. Պարբերաբար game-day-ը 'SSH-ի փլուզումը, նոդայի անկումը, տարբերակները։
Արդյունքները
Ansible-ը փակում է «վերջին ողորմությունը» ստեղծված ենթակառուցվածքի և աշխատանքային երկարության միջև 'արագ, անվտանգ և կանխատեսելի միգրացիաների և ֆորումների փոփոխությունները։ Դերի հետ, որպես կրկնվող օգտագործման նվազագույն միավորը, դինամիկ բուլղարները, գաղտնիքների հետ ճիշտ աշխատանքը և զրոյական dauntaim Ansible-ի փամփուշտները օգնում են iGaming-թիմերին կրճատել Time-to-Deploy-ը, նվազեցնել գիշերային պարամետրերի քանակը և պահել p99 SLO մակարդակում։