Ansible: configurare și implementare
(Secțiunea: Tehnologie și infrastructură)
Scurt rezumat
Ansible este un instrument declarativ de configurare și orchestrare ideal pentru configurarea repetată a VM-urilor/gazdelor, serviciilor și aplicațiilor atunci când infrastructura a fost deja creată (Terraform/IaC) și trebuie să „revigorați” mediul: instalați pachete, lansați versiunea, lansați șabloane, reporniți serviciile fără downtime, aplicați politici de securitate. Cheia succesului: structura modulară (roluri/colecții), idempotența strictă, lucrul îngrijit cu secrete (Vault), inventarul dinamic, testarea și disciplina GitOps.
Când este potrivit Ansible (și cum se potrivește cu Terraform)
Terraform - creează resurse (VPC, clustere, baze de date).
Ansible - configurează sistemul de operare/software, rulează versiuni, conduce migrații, editează fișiere și servicii.
Link: Terraform iese „inventar ”/IP/secrete la artefacte, Ansible le citește într-un pas CD.
Structura depozitului (șablon recomandat)
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 (minim):
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
Stocuri: statice și dinamice
Static (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'
Dinamic
Utilizați plugin-uri cloud (sau propriul script) pentru a eticheta gazde. Variabile de mediu/etichetă → 'group _ vars'.
Roluri și colecții
Role = modul de reutilizare independent (sarcini, fișiere, șabloane, manipulatori).
Colecții - un set de roluri/plugin-uri/module. Fixați pinii versiunii în colecțiile/cerințele. yml'.
yaml collections/requirements. yml collections:
- name: community. general version: ">=8. 0. 0,<9. 0. 0"
- name: ansible. posix
Cărți de redare: script-uri idempotente
Exemplu de playbook general:yaml playbooks/site. yml
- hosts: all gather_facts: true become: true roles:
- hardening
- hosts: web become: true roles:
- webapp
"Webapp 'role (fragmente):
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
Agenţi de manipulare:
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 șabloane și variabile
Stocați variabilele implicite în 'implicite/main. yml', sensibil - în Vault.
Utilizați filtre ('| to_nice_yaml',' | b64code', '| default') și 'când' condiții.
Exemplu "nginx. conf. univ. dr
jinja2 worker_processes auto;
http {
server {
listen 80;
server_name {{ inventory_hostname }};
location / {
proxy_pass http://127. 0. 0. 1:{{ webapp_port }};
}
}
}
Secretele: Vault Ansible și manageri secreți
Vault pentru criptarea fișierelor variabile ('group _ vars/all. seif. yml ").
Este mai bine să citiți secretele managerilor externi (KMS/Secrets Manager/SSM) prin modulele corespunzătoare și să stocați numai link-uri/ARN în Vault.
yaml group_vars/all. vault. yml (ansible-vault encrypted)
webapp_db_password: "..."
jwt_signing_key: "..."
Recomandări:
- Share access: dezvoltatorii văd dev/stage, prod - numai CI.
- Activați rotația secretă și auditarea accesului.
Idempotența și modificările corecte
Utilizați module („pachet”, „utilizator”, „lineinfile”, „șablon”, „sistem”) în loc de „shell/comandă”.
Marcați sarcinile „zgomotoase” modificate _ când: false 'dacă nu schimbă nimic.
Suport modul de verificare („--check”) și diff pentru roluri.
Pentru sarcini instabile: 'retries', 'delay', 'to'.
yaml
- name: Wait for HTTP uri availability:
url: "http://localhost/health"
status_code: 200 register: health retries: 10 delay: 5 until: health. status == 200
Performanță: Ferme mari și vârfuri
furculițe: ridicați concurența (prudență: nu supraîncărcați ținta).
strategie = Executați sarcini gratuite fără a aștepta vecinii.
pipelining = Adevărat в 'ansible. cfg "reduce RTT.
gather_facts: fals în cazul în care faptele sunt inutile.
async/sondaj pentru operațiuni pe termen lung; accelerație/serial pentru desfășurarea undelor.
delegate_to și run_once pentru acțiuni unice (de exemplu, migrarea bazelor de date).
Zero modele de downtime
Desfășurare de rulare (20% fiecare)
yaml
- hosts: web serial: "20%"
max_fail_percentage: 10 roles: [webapp]
Canare
Rulați playbook cu „--limită web-canar” (un subset al grupului), verificați valorile, apoi rula la întregul grup.
Albastru-Verde
Două grupuri gazdă 'web _ blue' şi 'web _ green'; pregătiți un nou val cu un playbook, apoi schimbați traficul (DNS/LB) cu "sarcina comunității. general. affiliate_lb'/API-ţi echilibrul.
Securitate și întărire
Rol de întărire: politici SSH, bannere, 'sudo' fără NOPASSWD, firewall, auditd/rsyslog, time-NTP, 'fail2ban'.
Activați SELinux/AppArmor, gestionați politicile prin module.
Bastion: Restricționați SSH la ținte numai prin intermediul gazdei de salt (a se vedea „ProxyJump”).
Minimizați „deveni: adevărat”; elaborarea RBAC la nivel de inventar (care poate rula care playbooks).
Windows și hardware de rețea
Windows: module 'win _', conexiune WinRM, scripturi PowerShell - ca ultimul argument.
Network: 'network _ cli '/' httpapi', module pentru Cisco/Juniper/F5; atomicitatea prin „save _ when: changed”.
Testarea și calitatea
asiatic + yamllint в CI.
Moleculă: teste de rol locale/containere, verificare idempotență (dublă rulare neschimbată).
Sandbox: inventar/imagini temporare VM individuale.
yaml provisioner:
name: ansible verifier:
name: ansible scenario:
name: default
Integrarea cu CI/CD și GitOps
Conductă tipică:1. Verificarea sintaxei → Lint → Molecule.
2. Artefacte de aplicare a clădirii.
3. Implementare: 'ansible-playbook -i inventaries/prod site. yml --limit web --tags display '.
4. Raport despre gazde schimbate, artefact de jurnale.
Exemplu pas (concept):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
Observabilitate și audit
Conectați plugin-uri de apel înapoi (json/yaml/timer/profile_tasks) - rapoarte privind timpul și modificările.
Salvați jurnalele de redare pentru stocarea centralizată.
Etichete „etichete:” sarcini pentru rularea selectivă și accelerarea investigațiilor.
Rețete frecvente pentru iGaming
Nod web/API: Nginx + unitate de sistem, verificări de sănătate, secrete de la manager, roll-restart.
Servicii de joc: șabloane de configurare pe regiuni/chiriași prin "group _ vars'.
Conectori de plată: cei stricți pentru chei, reporniți prin notificare, după verificarea punctelor finale.
Locuri de muncă ETL: implementarea scripturilor CronJob cu modulul 'cron', fișier de blocare idempotent.
Monitorizare: instalarea agenților (node_exporter/otelcol), auto-înregistrare în monitorizare.
Antipatterns
Folosind 'shell/command' unde există un modul.
Cărți de redare fără „manipulatori” → reporniri inutile și jitter de serviciu.
Stocarea secretelor în public 'group _ vars'.
Absența epuizării valurilor de producție "serial "/" max _ fail _ procentual 'during.
Global 'aduna _ fapte: adevărat' și 'deveni: adevărat' inutil.
Roluri fără teste molecule și fără suport „--check”.
Comenzi lungi fără "async/poll' care blochează întregul val.
Lista de verificare a implementării
1. Conveniți asupra cadrului de depozitare și a convențiilor de denumire.
2. Configurați inventarul dinamic și bastionul.
3. Creați roluri (webapp/întărire/monitorizare) și versiuni de pini ale colecțiilor.
4. Activaţi Vault şi/sau integrarea cu Managerul secret.
5. Asigurați idempotență, „--check/--diff”, manipulatori și etichete.
6. Conectați scame ansibile, yamllint, molecule la CI.
7. Descrieți modelul de implementare (rulare/canar/albastru-verde) și limitele „serial”.
8. Adăugați plugin-uri de apel, colectarea jurnalului, schimbarea raportului.
9. Runbooks rollback document și acțiuni incidente.
10. Țineți în mod regulat ziua de joc: pauză SSH, cădere nod, versiunea rollback.
Rezultate
Ansible închide „ultima milă” dintre infrastructura creată și vânzările care funcționează: modificări rapide, sigure și previzibile ale configurațiilor și lansărilor. Cu un rol de unitate minimă de reutilizare, inventar dinamic, manipulare secretă corectă și modele verificate zero-downtime, Ansible ajută echipele iGaming să reducă timpul de implementare, să reducă incidentele nocturne și să păstreze p99 la nivelul SLO.