Om din IT-infrastruktur vĂ€xer för snabbt, kommer du förr eller senare att stĂ„ inför valet â att linjĂ€rt öka personalresurserna för att stödja den, eller att börja automatisera. Fram till en viss punkt levde vi i den första paradigmen, och sedan började den lĂ„nga vĂ€gen mot Infrastructure-as-Code.

SjÀlvklart Àr NSPK inte en startup, men en sÄdan atmosfÀr rÄdde i företaget under de första Ären, och det var mycket intressanta Är. Jag heter , jag har i över 10 Är stöttat Linux-infrastruktur med höga tillgÀnglighetskrav. Jag gick med i NSPK i januari 2016 och fick tyvÀrr inte uppleva företagets början, men jag kom in pÄ en tid med stora förÀndringar.
Ăverlag kan man sĂ€ga att vĂ„rt team levererar tvĂ„ produkter för företaget. Första produkten Ă€r infrastrukturer. E-posten mĂ„ste gĂ„, DNS mĂ„ste fungera, och domĂ€nkontrollerna mĂ„ste slĂ€ppa in er pĂ„ servrar som inte fĂ„r falla. Företagets IT-landskap Ă€r enormt! Detta Ă€r affĂ€rs- och mission-critical system, vissa har tillgĂ€nglighetskrav pĂ„ 99,999. Den andra produkten Ă€r sjĂ€lva servrarna, bĂ„de fysiska och virtuella. De befintliga mĂ„ste övervakas och nya mĂ„ste regelbundet levereras till kunder frĂ„n mĂ„nga avdelningar. I den hĂ€r artikeln vill jag fokusera pĂ„ hur vi utvecklade infrastrukturen som ansvarar för livscykeln servrar.
Framstegens början
I början av vÄr resa sÄg vÄr teknikstack ut sÄ hÀr:
OS CentOS 7
DomÀnkontroller FreeIPA
Automatisering â Ansible(+Tower), Cobbler
Allt detta var fördelat pÄ 3 domÀner, spridda över flera datacenter. I ett datacenter fanns kontorssystem och testmiljöer, i de andra PROD.
Skapandet av servrar sÄg vid nÄgot tillfÀlle ut sÄ hÀr:

I mallen för VM CentOS minimal och den nödvÀndiga minimigrÀnsen som en korrekt /etc/resolv.conf, resten kommer via Ansible.
CMDB â Excel.
Om servern Ă€r fysisk, installeras operativsystemet direkt istĂ€llet för att kopiera en virtuell maskin till den, med hjĂ€lp av Cobbler â MAC-adresserna för den mĂ„lservern lĂ€ggs till i Cobbler-konfigurationen, servern fĂ„r IP-adress via DHCP, och sedan installeras operativsystemet.
I början försökte vi till och med göra nÄgon slags configuration management i Cobbler. Men med tiden började det orsaka problem med portabilitet av konfigurationer bÄde till andra datacenter och i Ansible-kod för att förbereda VM.
MÄnga av oss uppfattade Ansible som en bekvÀm utvidgning av Bash och var inte försiktiga med att anvÀnda konstruktioner med shell, sed. I stort sett var det Bashsible. Detta ledde till att om en playbook av nÄgon anledning inte fungerade pÄ servern, var det enklare att ta bort servern, justera playbooken och köra om. Det fanns i praktiken ingen versionering av skripten, inte heller nÄgon bÀrbarhet i konfigurationerna.
Till exempel ville vi Àndra en konfiguration pÄ alla servrar:
- Ăndrar konfigurationen pĂ„ befintliga servrar i den logiska segmentet/datacentret. Ibland inte pĂ„ en dag â tillgĂ„ngskrav och storhetens lag tillĂ„ter inte att alla Ă€ndringar tillĂ€mpas pĂ„ en gĂ„ng. Vissa Ă€ndringar kan potentiellt vara destruktiva och krĂ€ver omstart av nĂ„got â frĂ„n tjĂ€nster till sjĂ€lva operativsystemet.
- Fixar i Ansible
- Fixar i Cobbler
- Upprepa N gÄnger för varje logiskt segment/datacenter
För att alla Àndringar ska gÄ smidigt mÄste man ta hÀnsyn till mÄnga faktorer, och Àndringar sker hela tiden.
- Refaktorering av ansible-kod, konfigurationsfiler
- Ăndring av interna bĂ€sta metoder
- Ăndringar efter utvĂ€rdering av incidenter/olyckor
- Ăndring av sĂ€kerhetsstandarder, bĂ„de interna och externa. Till exempel PCI DSS kompletteras varje Ă„r med nya krav.
TillvÀxt av infrastrukturen och början av resan
Antalet servrar/logiska domÀner/datacenter ökade, liksom antalet fel i konfigurationerna. Vid nÄgot tillfÀlle kom vi fram till tre omrÄden som vi behövde utveckla konfigurationshantering Ät:
- Automatisering. SÄ mycket som möjligt, bör vi undvika den mÀnskliga faktorn i repetitiva operationer.
- Repetitivitet. Det Ă€r mycket enklare att hantera infrastrukturen nĂ€r den Ă€r förutsĂ€gbar. Konfigurationen av servrar och verktyg för deras förberedelse bör vara densamma överallt. Det Ă€r ocksĂ„ viktigt för produktteam â applikationen mĂ„ste garanteras hamna i produktionsmiljö efter testning, instĂ€lld pĂ„ samma sĂ€tt som testmiljön.
- Enkelhet och transparens i att göra Àndringar i konfigurationshanteringen.
Det kvarstÄr bara att lÀgga till ett par verktyg.
Som kodförvaring valde vi GitLab CE, inte minst för dess inbyggda CI/CD-moduler.
För hemlighetslagring â Hashicorp Vault, ocksĂ„ för dess utmĂ€rkta API.
Testkonfigurationer och Ansible-roller â Molecule + Testinfra. Tester gĂ„r mycket snabbare om du ansluter mitogen till Ansible. Samtidigt började vi skriva vĂ„r egen CMDB och orkestrator för automatisk distribution (pĂ„ bilden ovanför Cobbler), men det Ă€r en helt annan historia som min kollega och huvudutvecklare av dessa system kommer att berĂ€tta om i framtiden.
VÄrt val:
Molecule + Testinfra
Ansible + Tower + AWX
VĂ€rlden av servrar + DITNET (Egen utveckling)
Cobbler
Gitlab + GitLab-runner
Hashicorp Vault

Förresten om Ansible-roller. Till en början fanns det bara en, men efter flera refaktoriseringar blev det 17. Jag rekommenderar starkt att dela upp monoliten i idempotenta roller som kan köras separat, och ni kan dessutom lĂ€gga till taggar. Vi delade upp rollerna baserat pĂ„ funktionalitet â nĂ€tverk, loggning, paket, hĂ„rdvara, molekyl osv. Och i allmĂ€nhet följde vi strategin nedan. Jag pĂ„stĂ„r inte att detta Ă€r den enda sanna metoden, men det fungerade för oss.
- Kopiera servrar frĂ„n "guldbilden" â en dĂ„lig idĂ©!De huvudsakliga nackdelarna Ă€r att du helt enkelt inte vet i vilket skick bilderna Ă€r just nu, och att alla Ă€ndringar kommer att pĂ„verka alla bilder i alla virtualiseringsfarmar.
- AnvÀnd standardkonfigurationsfiler sÄ lite som möjligt och kom överens med andra avdelningar om att du ansvarar för de huvudsakliga systemfilerna, till exempel:
- LÀmna /etc/sysctl.conf tom, instÀllningarna bör ligga i /etc/sysctl.d/. Din standard i en fil, anpassningar för applikationen i en annan.
- AnvÀnd override-filer för att redigera systemd-enheter.
- Mallar alla konfigurationer och lÀgg in dem helt, sÄ mycket som möjligt inga sed- eller liknande kommandon i playbooks.
- Refaktorisera koden för konfigurationshanteringssystemet:
- Dela upp uppgifterna i logiska enheter och skriv om monoliten till roller.
- AnvÀnd linters! Ansible-lint, yaml-lint, osv.
- Ăndra tillvĂ€gagĂ„ngssĂ€tt! Ingen bashsible. Det behöver beskrivas hur systemets tillstĂ„nd ska vara.
- För alla Ansible-roller mÄste tester skrivas i Molecule och rapporter genereras en gÄng om dagen.
- I vÄrt fall, efter att testerna (mer Àn 100) förbereddes, hittades omkring 70 000 fel. Det tog flera mÄnader att rÀtta till.

VÄr implementering
SÄ, Ansible-rollerna var klara, mallade och kontrollerade av linters. Och Àven git var uppe överallt. Men frÄgan om tillförlitlig kodleverans till olika segment förblev öppen. Vi beslutade att synkronisera med skript. SÄ hÀr ser det ut:

Efter att Ă€ndringen har anlĂ€nt, startas CI, en testserver skapas, roller körs och testas med Molecule. Om allt ser bra ut, gĂ„r koden till produktionsgrenen. Men vi tillĂ€mpar inte ny kod pĂ„ existerande servrar automatiskt. Detta Ă€r en slags stoppmekanism som behövs för att sĂ€kerstĂ€lla hög tillgĂ€nglighet i vĂ„ra system. NĂ€r infrastrukturen blir enorm, spelar ocksĂ„ storhetens lag in â Ă€ven om du Ă€r sĂ€ker pĂ„ att förĂ€ndringen Ă€r harmlös, kan den leda till sorgliga konsekvenser.
Det finns mÄnga alternativ för att skapa servrar. Vi valde till slut anpassade skript i Python. Och för CI anvÀnder vi Ansible:
- name: create1.yml - Skapa en VM frÄn en mall
vmware_guest:
hostname: "{{datacenter}}".domain.ru
username: "{{ username_vc }}"
password: "{{ password_vc }}"
validate_certs: no
cluster: "{{cluster}}"
datacenter: "{{datacenter}}"
name: "{{ name }}"
state: poweredon
folder: "\/{{folder}}"
template: "{{template}}"
customization:
hostname: "{{ name }}"
domain: domain.ru
dns_servers:
- "{{ ipa1_dns }}"
- "{{ ipa2_dns }}"
networks:
- name: "{{ network }}"
type: static
ip: "{{ip}}"
netmask: "{{netmask}}"
gateway: "{{gateway}}"
wake_on_lan: True
start_connected: True
allow_guest_control: True
wait_for_ip_address: yes
disk:
- size_gb: 1
type: thin
datastore: "{{datastore}}"
- size_gb: 20
type: thin
datastore: "{{datastore}}"SÄ hÀr har vi kommit fram, systemet fortsÀtter att leva och utvecklas.
- 17 Ansible-roller för serverkonfiguration. Varje roll Àr avsedd för att lösa en specifik logisk uppgift (loggning, revision, anvÀndarautentisering, övervakning osv.).
- Testning av roller. Molecule + TestInfra.
- Egenutveckling: CMDB + Orkestrator.
- Serverns skapande tar cirka 30 minuter, Àr automatiserat och pÄverkas praktiskt taget inte av köer av uppgifter.
- Samma tillstĂ„nd/namn pĂ„ infrastrukturen i alla segment â playbooks, repository, virtualiseringselement.
- Daglig kontroll av serverstatus med rapportgenerering om avvikelser frÄn standard.
Jag hoppas att min berÀttelse kommer att vara anvÀndbar för dem som Àr i början av sin resa. Vilken automatiseringsstack anvÀnder ni?
KĂ€lla: habr.com

