Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Yon apwòch IaC (Enfrastrikti kòm Kòd) konsiste pa sèlman nan kòd ki estoke nan depo a, men tou nan moun yo ak pwosesis ki antoure kòd sa a. Èske li posib pou reitilize apwòch soti nan devlopman lojisyèl nan jesyon enfrastrikti ak deskripsyon? Li ta yon bon lide kenbe lide sa a nan tèt ou pandan w ap li atik la.

angle vèsyon

Sa a se yon transkripsyon mwen an pèfòmans sou DevopsConf 2019-05-28.

Slides ak videyo

Enfrastrikti kòm istwa bash

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Sipoze ou vin nan yon nouvo pwojè, epi yo di ou: "nou genyen Enfrastrikti kòm Kòd". An reyalite li vire soti Enfrastrikti kòm istwa bash oswa pou egzanp Dokimantasyon kòm istwa bash. Sa a se yon sitiyasyon trè reyèl, pou egzanp, yon ka menm jan an te dekri pa Denis Lysenko nan yon diskou Ki jan yo ranplase tout enfrastrikti a epi kòmanse dòmi byen, li te di ki jan yo te resevwa yon enfrastrikti aderan pou pwojè a soti nan istwa bash.

Avèk kèk dezi, nou ka di sa Enfrastrikti kòm istwa bash sa a se tankou kòd:

  1. repwodibilite: Ou ka pran istwa bash, kouri kòmandman yo soti nan la, epi ou ta ka, nan chemen an, jwenn yon konfigirasyon k ap travay kòm yon pwodiksyon.
  2. vèsyon: ou konnen ki moun ki te antre ak sa yo te fè, ankò, se pa yon reyalite ke sa ap mennen ou nan yon konfigirasyon k ap travay nan sòti a.
  3. istwa: istwa a nan ki moun ki te fè sa. sèlman ou pa pral kapab sèvi ak li si ou pèdi sèvè a.

Ki sa ki fè?

Enfrastrikti kòm Kòd

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Menm tankou yon ka etranj kòm Enfrastrikti kòm istwa bash ou ka rale li nan zòrèy yo Enfrastrikti kòm Kòd, Men, lè nou vle fè yon bagay ki pi konplike pase bon ansyen sèvè LAMP la, nou pral rive nan konklizyon ke kòd sa a bezwen yon jan kanmenm modifye, chanje, amelyore. Apre sa nou ta renmen konsidere paralèl ki genyen ant Enfrastrikti kòm Kòd ak devlopman lojisyèl.

SECHE

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Sou yon pwojè devlopman sistèm depo, te gen yon sous-tach detanzantan konfigirasyon SDS: nou ap pibliye yon nouvo lage - li bezwen yo dwe woule soti pou plis tès. Travay la trè senp:

  • konekte isit la atravè ssh epi egzekite lòd la.
  • kopye fichye a la.
  • korije konfigirasyon an isit la.
  • kòmanse sèvis la la
  • ...
  • PROFIT!

Pou lojik ki dekri a, bash se pi plis pase ase, espesyalman nan premye etap yo nan pwojè a, lè li se jis kòmanse. Sa a li pa mal ke ou itilize bash, men sou tan gen demann yo deplwaye yon bagay ki sanble, men yon ti kras diferan. Premye bagay ki vin nan tèt ou se kopye-kole. Epi, koulye a nou deja gen de scripts ki sanble anpil ki fè prèske menm bagay la. Apre yon tan, kantite scripts te grandi, epi nou te fè fas ak lefèt ke gen yon sèten lojik biznis pou deplwaye yon enstalasyon ki bezwen senkronize ant scripts diferan, sa a se byen konplike.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Li sanble ke gen yon pratik tankou DRY (pa repete tèt ou). Lide a se reitilize kòd ki egziste deja. Li son senp, men nou pa t 'vin jwenn sa a touswit. Nan ka nou an, se te yon lide ordinèr: separe konfigirasyon ak scripts. Moun sa yo. lojik biznis sou fason enstalasyon an deplwaye separeman, konfigirasyon separeman.

SOLID pou CFM

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Apre yon tan pwojè a te grandi ak kontinyasyon natirèl se te aparisyon Ansible. Rezon prensipal ki fè aparans li se ke gen ekspètiz nan ekip la e ke bash pa fèt pou lojik konplèks. Ansible tou te kòmanse genyen lojik konplèks. Pou anpeche lojik konplèks vire nan dezòd, gen prensip òganizasyon kòd nan devlopman lojisyèl SOLID Epitou, pou egzanp, Grigory Petrov nan rapò a "Poukisa yon espesyalis IT bezwen yon mak pèsonèl" te poze kesyon ke yon moun fèt nan yon fason ke li pi fasil pou li opere ak kèk antite sosyal, nan devlopman lojisyèl sa yo. se objè yo. Si nou konbine de lide sa yo epi kontinye devlope yo, n ap remake ke nou ka itilize tou SOLID pou rann li pi fasil pou kenbe ak modifye lojik sa a nan lavni.

Prensip Responsablite sèl la

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Chak klas fè yon sèl travay.

Pa bezwen melanje kòd epi fè monolitik monstr espageti diven. Enfrastrikti a ta dwe konpoze de brik senp. Li sanble ke si ou fann liv la Ansible an ti moso, li wòl Ansible, Lè sa a, yo pi fasil yo kenbe.

Prensip la louvri fèmen

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Prensip louvri/fèmen.

  • Ouvè a ekstansyon: vle di ke konpòtman an nan yon antite ka pwolonje pa kreye nouvo kalite antite.
  • Fèmen pou chanje: Kòm rezilta pwolonje konpòtman yon antite, pa ta dwe fè okenn chanjman nan kòd ki sèvi ak antite sa yo.

Okòmansman, nou te deplwaye enfrastrikti tès la sou machin vityèl, men akòz lefèt ke lojik biznis la nan deplwaman te separe de aplikasyon an, nou te ajoute woule soti nan baremetall san okenn pwoblèm.

Prensip Sibstitisyon Liskov

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Prensip sibstitisyon Barbara Liskov a. objè nan yon pwogram yo dwe ranplase ak sikonstans subtip yo san yo pa chanje ekzekisyon kòrèk pwogram nan

Si ou gade nan li pi laj, se pa yon karakteristik nan nenpòt pwojè patikilye ki ka aplike la SOLID, li se jeneralman sou CFM, pou egzanp, sou yon lòt pwojè li nesesè deplwaye yon aplikasyon Java bwat sou tèt divès Java, serveurs aplikasyon, baz done, OS, elatriye. Sèvi ak egzanp sa a, mwen pral konsidere plis prensip SOLID

Nan ka nou an, gen yon akò nan ekip enfrastrikti a ke si nou te enstale wòl imbjava oswa oraclejava, Lè sa a, nou gen yon ègzèkutabl binè java. Sa a se nesesè paske Wòl en depann sou konpòtman sa a yo espere java. An menm tan an, sa pèmèt nou ranplase yon aplikasyon/vèsyon java ak yon lòt san nou pa chanje lojik deplwaman aplikasyon an.

Pwoblèm nan isit la chita nan lefèt ke li enposib aplike sa a nan Ansible, kòm yon rezilta nan ki kèk akò parèt nan ekip la.

Prensip Segregasyon Entèfas

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Prensip separasyon entèfas: "Anpil koòdone espesifik kliyan yo pi bon pase yon sèl koòdone jeneral.

Okòmansman, nou te eseye mete tout varyasyon deplwaman aplikasyon an nan yon sèl liv Ansible, men li te difisil pou sipòte, ak apwòch la lè nou gen yon koòdone ekstèn espesifye (kliyan an espere pò 443), Lè sa a, yon enfrastrikti ka reyini nan men moun. brik pou yon aplikasyon espesifik.

Prensip Envèsyon Depandans lan

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Prensip la nan envèrsyon depandans. Modil nan nivo ki pi wo yo pa ta dwe depann de modil nan nivo ki pi ba yo. Tou de kalite modil yo dwe depann sou abstraksyon. Abstraksyon pa ta dwe depann sou detay. Detay yo dwe depann de abstraksyon.

Isit la egzanp lan pral baze sou yon antimodèl.

  1. Youn nan kliyan yo te gen yon nwaj prive.
  2. Nou te bay lòd pou machin vityèl andedan nwaj la.
  3. Men, akòz nati nwaj la, deplwaman aplikasyon an te mare ak ki hypervisor VM a te sou.

Moun sa yo. Lojik deplwaman aplikasyon wo nivo koule ak depandans nan nivo ki pi ba nan hypervisor la, e sa te vle di pwoblèm lè yo reitilize lojik sa a. Pa fè l konsa.

Entèaksyon

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Enfrastrikti kòm kòd se pa sèlman sou kòd, men tou sou relasyon ki genyen ant kòd ak moun, sou entèraksyon ant devlopè enfrastrikti.

Faktè otobis

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Ann sipoze ke ou gen Vasya sou pwojè ou a. Vasya konnen tout bagay sou enfrastrikti ou, kisa ki pral rive si Vasya toudenkou disparèt? Sa a se yon sitiyasyon trè reyèl, paske li ta ka frape pa yon otobis. Pafwa li rive. Si sa rive ak konesans sou kòd la, estrikti li yo, ki jan li fonksyone, aparans ak modpas pa distribye nan mitan ekip la, Lè sa a, ou ka rankontre yon kantite sitiyasyon dezagreyab. Pou minimize risk sa yo epi distribye konesans nan ekip la, ou ka itilize divès apwòch

Pè Devopsing

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Se pa tankou kòm yon blag, ke admin yo bwè byè, chanje modpas, ak yon analogue nan pwogramasyon pè. Moun sa yo. de enjenyè chita sou yon sèl òdinatè, yon sèl klavye epi kòmanse mete kanpe enfrastrikti ou ansanm: mete kanpe yon sèvè, ekri yon wòl Ansible, elatriye. Li son bèl, men li pa t travay pou nou. Men, ka espesyal nan pratik sa a te travay. Yon nouvo anplwaye te rive, mentor li pran yon travay reyèl ansanm ak li, travay epi transfere konesans.

Yon lòt ka espesyal se yon apèl ensidan. Pandan yon pwoblèm, yon gwoup moun ki nan sèvis ak moun ki enplike rasanble, yo nonmen yon sèl lidè, ki pataje ekran l 'ak vwa tren an nan panse. Lòt patisipan yo swiv panse lidè a, espyone ke trik nouvèl nan konsole a, tcheke ke yo pa te rate yon liy nan boutèy la, epi aprann nouvo bagay sou sistèm nan. Apwòch sa a te travay pi souvan pase pa.

Revizyon Kòd

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Subjektif, li te pi efikas pou gaye konesans sou enfrastrikti a ak fason li fonksyone lè l sèvi avèk revizyon kòd:

  • Enfrastrikti a dekri pa kòd nan depo a.
  • Chanjman fèt nan yon branch separe.
  • Pandan yon demann fizyon, ou ka wè delta nan chanjman nan enfrastrikti a.

Mete aksan sou isit la se ke revizyon yo te chwazi youn pa youn, dapre yon orè, i.e. ak kèk degre nan pwobabilite ou pral monte nan yon nouvo moso nan enfrastrikti.

Kòd Style

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Apre yon tan, diskisyon yo te kòmanse parèt pandan revizyon, paske... evalyatè yo te gen pwòp style yo ak wotasyon evalè yo anpile yo ak diferan estil: 2 espas oswa 4, camelCase oswa snake_case. Li pa t posib pou aplike sa a touswit.

  • Premye lide a se te rekòmande pou itilize linter, apre tout, tout moun se yon enjenyè, tout moun entelijan. Men, editè diferan, OS, yo pa pratik
  • Sa a te evolye nan yon bot ki te ekri nan kanson pou chak komèt pwoblèm ak tache pwodiksyon an linter. Men, nan pifò ka yo te gen bagay ki pi enpòtan yo fè ak kòd la te rete unfixed.

Sou entènèt jwèt Green Bati Mèt

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Tan pase, epi nou te rive nan konklizyon ke komèt ki pa pase sèten tès yo pa ka pèmèt yo nan mèt la. Voila! Nou envante Green Build Master, ki te pratike nan devlopman lojisyèl pou yon tan long:

  • Devlopman an fèt nan yon branch separe.
  • Tès yo ap kouri sou fil sa a.
  • Si tès yo echwe, kòd la pa pral antre nan mèt la.

Pran desizyon sa a te trè douloure, paske... te lakòz anpil konfli, men li te vo li, paske. Revi yo te kòmanse resevwa demann pou fusions san diferans nan style, ak sou tan kantite zòn pwoblèm yo te kòmanse diminye.

Tès IaC

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Anplis de tcheke style, ou ka sèvi ak lòt bagay, pou egzanp, yo tcheke ke enfrastrikti ou ka aktyèlman deplwaye. Oswa tcheke ke chanjman nan enfrastrikti pa pral mennen nan pèt lajan. Poukisa sa ta ka bezwen? Kesyon an se konplèks ak filozofik, li pi bon reponn ak yon istwa ki yon jan kanmenm te gen yon oto-scaler sou Powershell ki pa t 'tcheke kondisyon yo fwontyè => plis VM yo te kreye pase sa nesesè => kliyan an te depanse plis lajan pase te planifye. Sa a se pa trè bèl, men li ta byen posib trape erè sa a nan premye etap yo.

Youn ta ka mande, poukisa fè enfrastrikti konplèks menm plis konplèks? Tès pou enfrastrikti, jis tankou pou kòd, yo pa sou senplifikasyon, men sou konnen ki jan enfrastrikti ou ta dwe travay.

Piramid Tès IaC

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Tès IaC: analiz estatik

Si ou deplwaye tout enfrastrikti a nan yon fwa epi tcheke si li fonksyone, ou ka jwenn ke li pran anpil tan epi li mande anpil tan. Se poutèt sa, baz la dwe yon bagay ki travay byen vit, gen yon anpil nan li, epi li kouvri yon anpil nan kote primitif.

Bash se difisil

Ann gade yon egzanp trivial. chwazi tout fichye ki nan anyè aktyèl la epi kopye nan yon lòt kote. Premye bagay ki vin nan tèt ou:

for i in * ; do 
    cp $i /some/path/$i.bak
done

E si gen yon espas nan non fichye a? Oke, ok, nou entelijan, nou konnen ki jan yo sèvi ak quotes:

for i in * ; do cp "$i" "/some/path/$i.bak" ; done

Byen fè? Non! E si pa gen anyen nan anyè a, i.e. globbing pa pral travay.

find . -type f -exec mv -v {} dst/{}.bak ;

Byen fè kounye a? Non... Bliye sa ki ka nan non fichye a n.

touch x
mv x  "$(printf "foonbar")"
find . -type f -print0 | xargs -0 mv -t /path/to/target-dir

Zouti analiz estatik

Pwoblèm nan etap anvan an ta ka kenbe lè nou bliye quotes yo, pou sa a gen anpil remèd nan lanati. Shellcheck, an jeneral gen anpil nan yo, epi gen plis chans ou ka jwenn yon linter pou chemine ou anba IDE ou.

Lang
Zouti

frape
Shellcheck

Ruby
RuboCop

python
pilint

ansible
Ansible Lint

Tès IaC: Tès inite yo

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Kòm nou te wè nan egzanp anvan an, linters yo pa omnipoten epi yo pa ka montre tout zòn pwoblèm yo. Anplis de sa, pa analoji ak tès nan devlopman lojisyèl, nou ka sonje tès inite yo. Ki sa ki imedyatman vin nan tèt ou se shunit, Junit, rspec, pytest. Men, kisa pou w fè ak ansible, chef, saltstack ak lòt moun tankou yo?

Nan kòmansman an trè nou te pale de SOLID e ke enfrastrikti nou an ta dwe konpoze de ti brik. Lè yo rive.

  1. Se enfrastrikti a divize an ti brik, pou egzanp, wòl Ansible.
  2. Gen kèk kalite anviwònman deplwaye, kit se docker oswa yon VM.
  3. Nou aplike wòl Ansible nou an nan anviwònman tès sa a.
  4. Nou tcheke ke tout bagay te travay jan nou te espere (nou fè tès).
  5. Nou deside ok ou pa ok.

Tès IaC: Zouti Tès Inite

Kesyon, ki tès pou CFM? Ou ka tou senpleman kouri script la, oswa ou ka itilize solisyon pare pou sa a:

Pkm
Zouti

Ansible
Testinfra

Chef
Enspèk

Chef
Serverspec

pil sèl
Goss

Egzanp pou testinfra, tcheke ke itilizatè yo test1, test2 egziste epi yo nan yon gwoup sshusers:

def test_default_users(host):
    users = ['test1', 'test2' ]
    for login in users:
        assert host.user(login).exists
        assert 'sshusers' in host.user(login).groups

Ki sa yo chwazi? Kesyon an konplèks ak Limit, isit la se yon egzanp chanjman nan pwojè sou github pou 2018-2019:

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Kad tès IaC

Kesyon an rive: ki jan yo mete li tout ansanm ak lanse li? Kapab pran li epi fè li tèt ou si gen yon kantite ase nan enjenyè. Oswa ou ka pran solisyon pare yo, byenke pa gen anpil nan yo:

Pkm
Zouti

Ansible
Molekil

Chef
Tès Kitchen

Terraform
Terratest

Egzanp chanjman nan pwojè sou github pou 2018-2019:

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Molekil vs. Testkitchen

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Okòmansman nou te eseye itilize testkitchen:

  1. Kreye yon VM nan paralèl.
  2. Aplike wòl Ansible.
  3. Kouri enspeksyon.

Pou 25-35 wòl li te travay 40-70 minit, ki te long.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Pwochen etap la se tranzisyon an nan jenkins/docker/ansible/molecule. Idyolojik tout bagay se menm bagay la

  1. Lint playbooks.
  2. Ranje wòl yo.
  3. Lanse veso
  4. Aplike wòl Ansible.
  5. Kouri testenfra.
  6. Tcheke idempotans.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Liting pou wòl 40 ak tès pou yon douzèn te kòmanse pran apeprè 15 minit.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Ki sa yo chwazi depann de anpil faktè, tankou chemine yo itilize a, ekspètiz nan ekip la, elatriye. isit la tout moun deside poukont yo kijan pou yo fèmen kesyon tès inite a

Tès IaC: Tès Entegrasyon

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Pwochen etap la nan piramid tès enfrastrikti yo pral tès entegrasyon. Yo sanble ak tès inite yo:

  1. Enfrastrikti a divize an ti brik, pa egzanp wòl Ansible.
  2. Gen kèk kalite anviwònman deplwaye, kit se docker oswa yon VM.
  3. Pou anviwònman tès sa a aplike anpil Wòl Ansible.
  4. Nou tcheke ke tout bagay te travay jan nou te espere (nou fè tès).
  5. Nou deside ok ou pa ok.

Apeprè pale, nou pa tcheke pèfòmans nan yon eleman endividyèl nan sistèm nan tankou nan tès inite yo, nou tcheke ki jan sèvè a se configuré kòm yon antye.

Tès IaC: Tès bout pou bout

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Nan tèt piramid la, nou ap akeyi pa tès Fen a Fen. Moun sa yo. Nou pa tcheke pèfòmans yon sèvè separe, yon script separe, oswa yon brik separe nan enfrastrikti nou an. Nou tcheke ke anpil sèvè konekte ansanm, enfrastrikti nou an ap travay jan nou espere li. Malerezman, mwen pa janm wè solisyon ki pare yo nan bwat, pwobableman paske... Enfrastrikti a souvan inik ak difisil pou modèl ak kreye yon fondasyon pou tès yo. Kòm yon rezilta, tout moun kreye pwòp solisyon yo. Gen yon demann, men pa gen okenn repons. Se poutèt sa, mwen pral di ou sa ki gen nan lòd pouse lòt moun nan panse son oswa fwote nen mwen nan lefèt ke tout bagay te envante depi lontan anvan nou.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Yon pwojè ki gen yon istwa rich. Yo itilize li nan gwo òganizasyon e pwobableman chak nan nou te endirèkteman kwaze chemen ak li. Aplikasyon an sipòte anpil baz done, entegrasyon, elatriye. Konnen ki sa enfrastrikti a ta ka sanble se yon anpil nan dosye Docker-konpoze, epi konnen ki tès yo kouri nan ki anviwònman se Jenkins.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Konplo sa a te travay pou yon tan long, jouk nan kad la rechèch nou pa eseye transfere sa a nan Openshift. Kontenè yo rete menm jan an, men anviwònman lansman an chanje (bonjou DRY ankò).

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Lide rechèch la te ale pi lwen, ak nan openshift yo te jwenn yon bagay tankou APB (Ansible Playbook Bundle), ki pèmèt ou pake konesans sou ki jan yo deplwaye enfrastrikti nan yon veso. Moun sa yo. gen yon pwen konesans ki ka repete e ki ka teste sou fason pou deplwaye enfrastrikti a.

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Tout bagay sa a sonnen bon jiskaske nou kouri nan yon enfrastrikti eterojèn: nou te bezwen Windows pou tès yo. Kòm yon rezilta, konesans nan ki sa, ki kote, ki jan yo deplwaye, ak tès se nan jenkins.

konklizyon

Sa mwen te aprann nan tès 200 liy nan kòd enfrastrikti

Enfrastrikti kòm Kòd se

  • Kòd nan depo a.
  • Entèaksyon imen.
  • Tès enfrastrikti.

lyen

Sous: www.habr.com

Add nouvo kòmantè