
See on tÔlgendus jÀrgnevaga :
Alates teisest commit'ist muutub iga kood legacy'ks, kuna algsed ideed hakkavad lahknema karmist reaalsusest. See ei ole hea ega halb, see on fakt, millega on raske vaielda ja millega on vaja koos eksisteerida. Osana sellest protsessist on refaktooring. Refaktooring infrastruktuuri kui koodi. Alustame lugu, kuidas refaktoerida Ansible aasta jooksul ja mitte vaimselt alla jÀÀda.
Legacy tekkimine
PĂ€ev â 1: Null patsient

Olid ĂŒks projekt. Sellel oli Dev arendusmeeskond ja Ops insenerid. Nad lahendasid sama ĂŒlesande: kuidas servereid ĂŒles seada ja rakendust kĂ€ivitada. Probleem oli selles, et iga meeskond lahendas seda ĂŒlesannet omamoodi. Projektil otsustati kasutada Ansible'i teadmiste sĂŒnkroniseerimiseks Dev ja Ops meeskondade vahel.
PĂ€ev â 89: Legacy tekkimine

Ilma et me seda mÀrkaksime, soovisime teha nii hÀsti kui vÔimalik, kuid tulemuseks oli legacy. Kuidas see nii juhtub?
- Meil on siin kiire ĂŒlesanne, teeme rĂ€paste nipiga â hiljem parandame.
- Dokumentatsiooni ei pea kirjutama, ja nii on kÔik selge, mis siin toimub.
- Ma tean Ansible'it / Pythonit / Bashi / Terraformi! Vaata, kuidas ma suudan ennast kokku vÔtta!
- Ma Full Stack Overflow arendaja kopeerisin selle stackoverflow'ist, ei tea, kuidas see töötab, aga see nĂ€eb Ă€ge vĂ€lja ja lahendab ĂŒlesande.
LÔpuks vÔib saada arusaamatut koodi, mille kohta ei ole dokumentatsiooni, ei ole selge, mida see teeb, kas see on vajalik, kuid probleem on see, et peate seda arendama, tÀiendama, lisama tugistruktuure, halvendades olukorda veel rohkem.
- hosts: localhost
tasks:
- shell: echo -n Z >> a.txt && cat a.txt
register: output
delay: 1
retries: 5
until: not output.stdout.find("ZZZ")PĂ€ev â 109: Probleemi teadvustamine

Alguses kavandatud ja ellu viidud IaC mudel lÔpetab vastamast kasutajate / Àri / teiste meeskondade nÔudmistele, aeg, mis kulub infrastruktuuri muutmiseks, ei ole enam vastuvÔetav. Sellel hetkel saab selgeks, et on aeg samme astuda.
IaC refaktoreerimine
PĂ€ev â 139: Kas teil on tĂ”esti vaja refaktoreerimist?

Enne refaktoreerimisse hĂŒppamist peate vastama mitmele olulisele kĂŒsimusele:
- Miks te seda kÔike vajate?
- Kas teil on aega?
- Kas teadmised on piisavad?
Kui te ei oska kĂŒsimustele vastata, siis lĂ”ppeb refaktoreerimine algamata vĂ”i vĂ”ib see ainult hullemaks minna. Kuna kokemused on olnud. ), siis tuli projektilt abi kĂŒsimine rollide korrigeerimiseks ja nende katmiseks testidega.
PĂ€ev nr 149: Refaktoreerimise ettevalmistamine

Esimene samm on valmistuda. MÀÀrata, mida me teeme. Selleks suhtleme, leiame probleemsed kohad ja kaalume lahendusviise. Saadud kontseptide kohta fikseerime midagi, nĂ€iteks artikli confluence'is, et kui tekib kĂŒsimus "kuidas paremini?" vĂ”i "kuidas Ă”igesti?" ei kaotaks me kurssi. Meie puhul jĂ€rgisime ideed jaga ja valitse: jagame infrastruktuuri vĂ€ikesteks tĂŒkkideks / tellisteks. Selline lĂ€henemine vĂ”imaldab vĂ”tta isoleeritud infrastruktuuri osa, mĂ”ista, mida see teeb, katab selle testidega ja muuta seda kartmata, et midagi katki lĂ€heb.

Seega muutub infrastruktuuri testimine sillaks, ja siin tasub mainida infrastruktuuri testimise pĂŒramiidi. Just sama idee nagu arenduses, kuid infrastruktuuri jaoks: liigume odavatelt kiirtestidest, mis kontrollivad lihtsaid asju, nĂ€iteks vahemaid, kallimatele tĂ€istekstidele, mis juurutavad terviklikku infrastruktuuri.
Ansible'i testimise katsed
Enne kui hakkame kirjeldama, kuidas katsetasime Ansible'it projektis, rÀÀgin katsetustest ja lÀhenemistest, mida varem kasutasin, et mÔista otsuste konteksti.
PĂ€ev â -997: SDS provision

Esimest korda tuli Ansible'it testida SDS (Software Defined Storage) arendusprojektis. Sellel teemal on eraldi artikkel.
, kuid lĂŒhidalt öeldes saime pöördepaadi testimise, milleks kulutasime ĂŒhe rolli testimisele 60-90 minutit, mis on liiga kaua. Aluseks olid e2e testid, st seadistasime tĂ€ieliku paigalduse ja seejĂ€rel testisime seda. Lisaks raskendas meie enda lahenduse vĂ€ljamĂ”tlemine. Kuid tuleb tunnistada, et see lahendus töötas ja vĂ”imaldas stabiilselt vĂ€lja anda.
PĂ€ev â -701: Ansible ja test kitchen

Ansible'i testimise idee edasiarenduseks sai valmis tööriistade kasutamine, nimelt test kitchen / kitchen-ci ja inspec. Valik pÔhines Ruby teadmisel (tÀiendavalt artiklis habras): ) töötas kiiremini umbes 40 minutit 10 rolli jaoks. Loodime hunniku virtuaalmasinaid ja jooksutasime testid sees.

KokkuvÔttes lahendus töötas, kuid jÀi ebamugav tunne segaduse tÔttu. Kui suurendasime testitavate hulka 13 pÔhiteemale ja 2 meta-rolli, mis kombineerisid vÀiksemaid rolle, hakkasid testid jÀrsku töötama 70 minutit, mis on peaaegu kaks korda kauem. XP (Extreme Programming) praktikate osas oli keeruline rÀÀkida, kuna keegi ei taha 70 minutit oodata. See muutus lÀhenemise muutmise pÔhjuseks.
PĂ€ev â -601: Ansible ja molecule

Kontseptuaalselt sarnaneb see testkitcheniga, ainult et me viisime rollide testimise dockerisse ja vahetasime stÀkki. Tulemusena vÀhenes aeg stabiilseteks 20-25 minutiks 7 rolli jaoks.

Suurendades testitavate rollide arvu 17-ni ja lintimise 45 rollile, jooksutasime selle 28 minutiga 2 jenkins slave'i peal.
PĂ€ev â 167: Lisame projekti Ansible testid

KĂ€igult ĂŒlesande refaktoreerimist tĂ”enĂ€oliselt ei Ă”nnestu teha. Ălesanne peab olema mÔÔdetav, et saaksite selle tĂŒkkideks jagada ja elevanti teelusikaga tĂŒkkideks sĂŒĂŒa. Peab olema arusaam, kas liikute Ă”iges suunas ja kui kaua on veel minna.

Ăldiselt pole oluline, kuidas see tehtud saab, vĂ”id kirjutada paberile, kleepida post-it mĂ€rkmeid kapile, luua ĂŒlesandeid Jira's, vĂ”i alustada Google Docs'i ja sinna kirjutada praegune staatus. Probleem on selles, et protsess ei ole hetkeline, see tuleb pikk ja vaevarikas. VĂ€he tĂ”enĂ€oline, et keegi tahab, et refaktoreerimise ajal kaotaksid sa oma ideed, vĂ€siksid ja loobuksid.
Refaktoreerimine on lihtne:
- Söö.
- Uni.
- Koodi.
- IaC test.
- Korrata.
Ja nii me kordame, kuni saavutame seatud eesmÀrgid.

KĂ”ike korraga testida ei pruugi Ă”nnestuda, seetĂ”ttu oli meie esimeseks ĂŒlesandeks alustada lintimise ja sĂŒntaksi kontrollimisega.
PĂ€ev â 181: Roheline Build Master

Lintimine on vÀike esimene samm Roheline Build Master'ini. See ei riku suurt midagi, kuid vÔimaldab protsesse viia paika ja saavutada rohelisi ehitusi Jenkinsis. Idee on arendada meeskonnas harjumusi:
- Punased testid on halvad.
- Kui tuled midagi parandama, tee kood natuke paremaks, kui see oli enne sind.
PĂ€ev â 193: Lintimisest unit testideni

Koodi viimisprotsessi seadistamisega saab alustada jĂ€rk-jĂ€rgult parandamist â asendada lintimise rollide kĂ€ivitamisega, isegi ilma idempotentsuseta. Oluline on mĂ”ista, kuidas rolle rakendada ja kuidas need töötavad.
PĂ€ev â 211: Ăksuse testidest integreerimistestide juurde

Kui enamik rolle on kaetud ĂŒksustestidega ja kĂ”ik on lintitud, saab alustada integreerimistestide lisamisega. See tĂ€hendab mitte ainult ĂŒksikute komponentide testimist infrastruktuuris, vaid nende kombinatsioonide testimist, nĂ€iteks terve instantsi konfiguratsiooni.

Jenkinsis genereerisime palju etappe, mis paralleelselt lintisid rolle / mĂ€ngubaase, seejĂ€rel ĂŒksustestid konteinerites ja lĂ”puks integreerimistestid.
Jenkins + Docker + Ansible = Testid

- Koormuse kontrollimine ja ehitusetappide genereerimine.
- KÀivitage lintimise mÀngubaasi etapid paralleelselt.
- KĂ€ivitage lintimise rollide etapid paralleelselt.
- KĂ€ivitage sĂŒnteesi kontrollimise rollide etapid paralleelselt.
- KĂ€ivitage testimise rollide etapid paralleelselt.
- Lintige roll.
- Kontrollige sÔltuvust muudest rollidest.
- Kontrollige sĂŒnteesi.
- Looge docker instants.
- KĂ€ivitage molecule/default/playbook.yml.
- Kontrollige idempotentsust.
- KĂ€ivitage integreerimistestid
- LÔpeta
PĂ€ev â 271: Bussifaktor

Alguses tegeles refaktoreerimisega vĂ€ike inimeste grupp, paar-kolm inimest. Nad tegid koodi ĂŒlevaateid masteris. Aja jooksul kujunes meeskonnas vĂ€lja teadmine, kuidas kirjutada koodi, ning koodide ĂŒlevaatus aitas levitada teadmisi infrastruktuuri ja selle toimimise kohta. Erakordne oli see, et ĂŒlevaatajad valiti vaheldumisi, graafiku alusel, see tĂ€hendab, et teatud tĂ”enĂ€osusega jĂ”udsid sa uude infrastruktuuri ossa.

Siin peab olema mugav. Mugav teha ĂŒlevaateid, nĂ€ha, millise ĂŒlesande raames need on tehtud, arutelude ajalugu. Integreerisime jenkins + bitbucket + jira.
Kuid koodide ĂŒlevaatus iseenesest ei ole imerohi. NĂ€iteks tuli meil masterisse kood, mis tekitas meile kohati ebausaldusvÀÀrseid teste:
- get_url:
url: "{{ actk_certs }}/{{ item.1 }}"
dest: "{{ actk_src_tmp }}/"
username: "{{ actk_mvn_user }}"
password: "{{ actk_mvn_pass }}"
with_subelements:
- "{{ actk_cert_list }}"
- "{{ actk_certs }}"
delegate_to: localhost
- copy:
src: "{{ actk_src_tmp }}/{{ item.1 }}"
dest: "{{ actk_dst_tmp }}"
with_subelements:
- "{{ actk_cert_list }}"
- "{{ actk_certs }}"Kuid see sai hiljem parandatud, kuid mulje jÀi.
get_url:
url: "{{ actk_certs }}/{{ actk_item }}"
dest: "{{ actk_src_tmp }}/{{ actk_item }}"
username: "{{ actk_mvn_user }}"
password: "{{ actk_mvn_pass }}"
loop_control:
loop_var: actk_item
with_items: "{{ actk_cert_list }}"
delegate_to: localhost
- copy:
src: "{{ actk_src_tmp }}/{{ actk_item }}"
dest: "{{ actk_dst_tmp }}"
loop_control:
loop_var: actk_item
with_items: "{{ actk_cert_list }}"PĂ€ev nr 311: Kiirendame teste

Testide aeg on kasvanud, buildid kĂ€ivad halva juhtumi korral kuni tunni. Ăhes tagasivaates oli lause, nagu: "hea, et testid on olemas, aga need on aeglased". LĂ”puks loobusime integreerimistest virtuaalmasinatel ning kohandasime need dockerile, et oleks kiirem. Asendasime ka testinfra ansible verifikaatoriga, et vĂ€hendada kasutatavate tööriistade arvu.

Rangelt öeldes oli siin kompleks meetmeid:
- Ăleminek dockerile.
- Eemaldada rollide testimine, mis dubleeritakse sÔltuvuste tÔttu.
- Slaidide arvu suurendamine.
- Testide kÀivitamise jÀrjekord.
- VĂ”imalus lintida KĂIK kohalikult ĂŒhe kĂ€suga.

KokkuvĂ”ttes ĂŒhtlustus ka Jenkins'i Pipeline.
- KĂ€ivita buildi etapid.
- Lintida kÔik paralleelselt.
- KĂ€ivitage testimise rollide etapid paralleelselt.
- LÔpetada.
Ăpitud Ă”ppetunnid
VĂ€ltida globaalsete muutujate kasutamist
Ansible kasutab globaalseid muutujaid, osaline lahendus on , aga see ei ole imerohi.
TÔin nÀite. Oletame, et meil on role_a ja role_b
# cat role_a/defaults/main.yml
---
msg: a
# cat role_a/tasks/main.yml
---
- debug:
msg: role_a={{ msg }}# cat role_b/defaults/main.yml
---
msg: b
# cat role_b/tasks/main.yml
---
- set_fact:
msg: b
- debug:
msg: role_b={{ msg }}- hosts: localhost
vars:
msg: tere
roles:
- role: role_a
- role: role_b
tasks:
- debug:
msg: play={{msg}}
Naljakas asjaolu on see, et plaanide tulemus sÔltub mitmetest mitte alati ilmsetest asjadest, nÀiteks rollide loetlemise jÀrjekorrast. Kahjuks on see Ansible'i loomuses ja parim, mida teha saab, on kasutada teatud kokkuleppeid, nÀiteks kasutada rolli sees ainult neid muutujaid, mis on selles rollis kirjeldatud.
HALB: kasutada globaalseid muutujaid.
# cat roles/some_role/tasks/main.yml
---
debug:
var: java_homeHEA: A defaults : mÀÀrata vajalikud muutujad ja hiljem kasutada ainult neid.
# cat roles/some_role/defaults/main.yml
---
r__java_home:
"{{ java_home | default('/path') }}"
# cat roles/some_role/tasks/main.yml
---
debug:
var: r__java_home
Eelneva rolli muutujad
HALB: kasutada globaalseid muutujaid.
# cat roles/some_role/defaults/main.yml
---
db_port: 5432HEA: Rooli sees muutujaid kasutades kasutada muutujad, millel on rolli nime eesliide, et oleks lihtsam aru saada, mis toimub, vaadates inventuuri.
# cat roles/some_role/defaults/main.yml
---
some_role__db_port: 5432Kasuta tsĂŒklit control muutuja
HALB: Kasutada tsĂŒklites standardset muutujat elemendi, kui see ĂŒlesanne/plaan on kuskil kaasatud, vĂ”ib see pĂ”hjustada ootamatut kĂ€itumist
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item }}"
loop:
- item1
- item2
HEA: Ămber mÀÀrata muutuja tsĂŒklis lĂ€bi loop_var.
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item_name }}"
loop:
- item1
- item2
loop_control:
loop_var: item_name
Kontrolli sisendi muutujad
Oleme kokku leppinud, et kasutame muutujate eeliseid; oleks hea kontrollida, et need on mÀÀratletud nagu ootame ja nĂ€iteks, et need ei ole tĂŒhjaks vÀÀrtuseks ĂŒle kirjutatud.
HEA: Kontrollige muutujaid.
- name: "Kontrollige, et nÔutavad stringimuutujad on mÀÀratletud"
assert:
that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
fail_msg: "{{ ahs_var }} tuleb mÀÀrata, et roll töötaks"
success_msg: "NÔutavad muutujad {{ ahs_var }} on mÀÀratletud"
loop_control:
loop_var: ahs_var
with_items:
- ahs_item1
- ahs_item2
- ahs_item3VĂ€ltige hash-dictionary, kasutage tasapinnalist struktuuri.
Kui roll ootab hash/dictionary ĂŒhes parameetris, siis kui me soovime muuta ĂŒhte alamparameetrit, tuleb meil ĂŒmber mÀÀrata kogu hash/dictionary, mis suurendab konfigureerimise keerukust.
HALB: Kasutage hash/dictionary.
---
user:
name: admin
group: adminHEA: Kasutage tasapinnalist muutuja struktuuri.
---
user_name: admin
user_group: "{{ user_name }}"Looge idempotentsed mÀngud ja rollid.
Rollid ja mÀngud peavad olema idempotentsed, kuna see vÀhendab konfiguratsiooni hÀlvet ja hirmu midagi rikkuda. Kuid kui kasutate molecule'i, on see vaikimisi kÀitumine.
VÀltige kÀsu shell moodulite kasutamist.
Shell mooduli kasutamine viib imperatiivse kirjeldusparadigmini, selle asemel, et deklaratiivne, mis on Ansible'i pÔhiolemus.
Testige oma rolle via molecule.
Molecule on paindlik lahendus; vaatame mÔningaid stsenaariume.
Molecule mitmed instantsid
V molecule.yml jaotises platvormid saab kirjeldada mitmeid hoste, mida turvata.
---
draiver:
nimi: docker
platvormid:
- nimi: postgresql-instance
hostinimi: postgresql-instance
pilt: registry.example.com/postgres10:latest
eelnevalt_loodud_pilt: jah
ĂŒlekirjutamise_kĂ€sk: vale
vĂ”rgu_reĆŸiim: host
- nimi: app-instance
hostinimi: app-instance
eelnevalt_loodud_pilt: jah
pilt: registry.example.com/docker_centos_ansible_tests
vĂ”rgu_reĆŸiim: hostSeega neid hoste saab hiljem converge.yml kasutada:
---
- nimi: Ăhenda kĂ”ik
hostid: kÔik
muutujad:
ansible_kasutaja: root
rollid:
- roll: some_role
- nimi: Ăhenda db
hostid: db-instance
rollid:
- roll: some_db_role
- nimi: Ăhenda rakendus
hostid: app-instance
rollid:
- roll: some_app_roleAnsible'i verifikaator
Molecule'is on vÔimalik kasutada ansible'i, et kontrollida, kas instants on Ôigesti seadistatud; see on alates 3. versioonist vaikesÀtetes. See ei ole nii paindlik kui testinfra/inspec, kuid saab kontrollida, kas faili sisu vastab meie ootustele:
---
- nimi: Kinnita
hostid: kÔik
ĂŒlesanded:
- nimi: kopeeri konfi
kopeeri:
src: expected_standalone.conf
dest: /root/wildfly/bin/standalone.conf
reĆŸiim: "0644"
omanik: root
grupp: root
registreeri: config_copy_result
- nimi: Kinnita, et standalone.conf muutus
kinnita:
et: mitte config_copy_result.changedVÔi kÀivitada teenuse, oodata selle saadavust ja teha smoke test:
---
- name: Kontrolli
hosts: solr
tasks:
- command: /blah/solr/bin/solr start -s /solr_home -p 8983 -force
- uri:
url: http://127.0.0.1:8983/solr
method: GET
status_code: 200
register: uri_result
until: uri_result is not failed
retries: 12
delay: 10
- name: Postita dokumendid solr'i
command: /blah/solr/bin/post -c master /exampledocs/books.csvPane keeruline loogika moodulitesse ja pistikprogrammidesse
Ansible propageerib deklaratiivset lĂ€henemist, seega kui teete koodis harukĂ€ike, andmete transformatsioone, shell mooduleid, siis kood muutub raskesti loetavaks. Et selle vastu vĂ”idelda ja muuta see arusaadavamaks, on hea praktika seda keerukust ĂŒletada oma moodulite loomisega.
KokkuvÔte nÀpunÀidetest ja nippidest
- VĂ€ltige globaalmuutujate kasutamist.
- Eelista rollimuutujatele eesliiteid.
- Kasutage tsĂŒkli juhtimismuutujat.
- Kontrollige sisendmuutujaid.
- VÀltige hash-sÔnastikke, kasutage staatilist struktuuri.
- Looge idempotentsed mÀngukavad ja rollid.
- VÀltige kÀsurea moodulite kasutamist.
- Testige oma rolle molekuliga.
- Pane keeruline loogika moodulitesse ja pistikprogrammidesse.
KokkuvÔte

Ei saa lihtsalt vÔtta ja refaktoreerida infrastruktuuri projektis, isegi kui teil on IaC. See on pikk protsess, mis nÔuab kannatlikkust, aega ja teadmisi.
Lingid
- Esitlused
- Video
UPD1 2020.05.01 20:30 â Esimese plaanide profileerimise jaoks saab kasutada callback_whitelist = profile_tasks et mĂ”ista, mis tĂ€pselt kaua kestab. SeejĂ€rel vaatame ĂŒle . Saame proovida
UPD2 2020.05.03 16:34 â
Allikas: habr.com
