How to start testing Ansible, refactor a project in a year, and not lose your mind.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

See on tÔlgendus esinemisest jÀrgnevaga DevOps-40 2020-03-18:

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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?

How to start testing Ansible, refactor a project in a year, and not lose your mind.

Enne refaktoreerimisse hĂŒppamist peate vastama mitmele olulisele kĂŒsimusele:

  1. Miks te seda kÔike vajate?
  2. Kas teil on aega?
  3. 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. Mida ma Ă”ppisin, testides 200 000 rida infrastruktuuri koodi), siis tuli projektilt abi kĂŒsimine rollide korrigeerimiseks ja nende katmiseks testidega.

PĂ€ev nr 149: Refaktoreerimise ettevalmistamine

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

Esimest korda tuli Ansible'it testida SDS (Software Defined Storage) arendusprojektis. Sellel teemal on eraldi artikkel.
Kuidas katsetada oma distributsiooni saamata samal ajal jalgrataste purunemist, 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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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): Kas YML programmeerijad unistavad Ansible'i testimisest?) töötas kiiremini umbes 40 minutit 10 rolli jaoks. Loodime hunniku virtuaalmasinaid ja jooksutasime testid sees.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

Ü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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

Jenkins + Docker + Ansible = Testid

How to start testing Ansible, refactor a project in a year, and not lose your mind.

  1. Koormuse kontrollimine ja ehitusetappide genereerimine.
  2. KÀivitage lintimise mÀngubaasi etapid paralleelselt.
  3. KĂ€ivitage lintimise rollide etapid paralleelselt.
  4. KĂ€ivitage sĂŒnteesi kontrollimise rollide etapid paralleelselt.
  5. KĂ€ivitage testimise rollide etapid paralleelselt.
    1. Lintige roll.
    2. Kontrollige sÔltuvust muudest rollidest.
    3. Kontrollige sĂŒnteesi.
    4. Looge docker instants.
    5. KĂ€ivitage molecule/default/playbook.yml.
    6. Kontrollige idempotentsust.
  6. KĂ€ivitage integreerimistestid
  7. LÔpeta

PĂ€ev № 271: Bussifaktor

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

Rangelt öeldes oli siin kompleks meetmeid:

  1. Üleminek dockerile.
  2. Eemaldada rollide testimine, mis dubleeritakse sÔltuvuste tÔttu.
  3. Slaidide arvu suurendamine.
  4. Testide kÀivitamise jÀrjekord.
  5. VĂ”imalus lintida KÕIK kohalikult ĂŒhe kĂ€suga.

How to start testing Ansible, refactor a project in a year, and not lose your mind.

KokkuvĂ”ttes ĂŒhtlustus ka Jenkins'i Pipeline.

  1. KĂ€ivita buildi etapid.
  2. Lintida kÔik paralleelselt.
  3. KĂ€ivitage testimise rollide etapid paralleelselt.
  4. LÔpetada.

Õpitud Ă”ppetunnid

VĂ€ltida globaalsete muutujate kasutamist

Ansible kasutab globaalseid muutujaid, osaline lahendus on private_role_vars, 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}}

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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_home

HEA: 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: 5432

HEA: 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: 5432

Kasuta 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_item3

VĂ€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: admin

HEA: 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: host

Seega 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_role

Ansible'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.changed

VÔ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.csv

Pane 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

  1. VĂ€ltige globaalmuutujate kasutamist.
  2. Eelista rollimuutujatele eesliiteid.
  3. Kasutage tsĂŒkli juhtimismuutujat.
  4. Kontrollige sisendmuutujaid.
  5. VÀltige hash-sÔnastikke, kasutage staatilist struktuuri.
  6. Looge idempotentsed mÀngukavad ja rollid.
  7. VÀltige kÀsurea moodulite kasutamist.
  8. Testige oma rolle molekuliga.
  9. Pane keeruline loogika moodulitesse ja pistikprogrammidesse.

KokkuvÔte

How to start testing Ansible, refactor a project in a year, and not lose your mind.

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.

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 ansible'i kiirusmeetodid. Saame proovida mitogen
UPD2 2020.05.03 16:34 — Inglise versioon

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster