Mimitian ti komitmen kadua, kode naon waé janten warisan, sabab gagasan awal mimiti diverge tina kanyataan kasar. Ieu sanés saé atanapi goréng, éta mangrupikeun pasihan anu hese dibantah sareng kedah dijalani. Bagian tina prosés ieu refactoring. Infrastruktur Refactoring salaku Code. Hayu carita dimimitian dina kumaha carana refactor Ansible dina sataun tur teu jadi gélo.
Lahirna Warisan
Dinten # 1: Pasén Zero
Jaman baheula aya proyek bersyarat. Éta ngagaduhan tim pamekaran Dev sareng insinyur Ops. Aranjeunna ngarengsekeun masalah anu sami: kumaha nyebarkeun server sareng ngajalankeun aplikasi. Masalahna nyaéta unggal tim ngarengsekeun masalah ieu ku cara sorangan. Dina proyék éta, éta mutuskeun pikeun ngagunakeun Ansible pikeun nyingkronkeun pangaweruh antara tim Dev sareng Ops.
Dinten # 89: Lahirna Warisan
Tanpa perhatikeun éta sorangan, aranjeunna hoyong ngalakukeun éta sabisa-gancang, tapi tétéla janten warisan. Kumaha ieu kajadian?
Kami ngagaduhan tugas anu penting di dieu, hayu urang laksanakeun hack anu kotor teras ngalereskeunana.
Anjeun teu kedah nyerat dokuméntasi sareng sadayana jelas naon anu lumangsung di dieu.
Abdi Full Stack mudal pamekar sarta disalin ieu ti stackoverflow, Kuring henteu weruh kumaha gawéna, tapi Sigana tiis tur ngajawab masalah.
Hasilna, anjeun tiasa nampi jinis kode anu teu kaharti, anu henteu aya dokuméntasi, henteu jelas naon anu dilakukeun, naha éta diperyogikeun, tapi masalahna nyaéta anjeun kedah ngembangkeun, ngarobih, nambihan crutches sareng dukungan. , ngajadikeun kaayaan malah parah.
Model IaC anu mimitina katimu sareng dilaksanakeun henteu deui nyumponan sarat pangguna / bisnis / tim anu sanés, sareng waktosna pikeun ngarobih prasarana teu tiasa ditampi. Dina momen ieu, pamahaman datang yén éta téh waktu pikeun ngalakukeun tindakan.
refactoring IaC
Dinten # 139: Naha anjeun leres-leres peryogi refactoring?
Sateuacan anjeun buru-buru ka refactor, anjeun kedah ngajawab sababaraha patarosan penting:
Naha anjeun peryogi sadayana ieu?
Dupi anjeun gaduh waktos?
Naha pangaweruh cukup?
Upami anjeun henteu terang kumaha carana ngajawab patarosan, maka refactoring bakal mungkas sateuacan dimimitian, atanapi éta ngan ukur parah. Sabab geus pangalaman ( Anu Kuring Diajar tina Nguji 200 Garis Kode Infrastruktur), teras proyék éta nampi pamenta pitulung pikeun ngalereskeun peran sareng nutupan tés.
Dinten # 149: Nyiapkeun refactoring
Hal kahiji anu nyiapkeun. Mutuskeun naon nu bakal urang pigawé. Jang ngalampahkeun ieu, urang komunikasi, manggihan wewengkon masalah jeung manggihan cara pikeun ngajawab aranjeunna. Urang ngarekam konsép anu dihasilkeun kumaha bae, contona artikel dina confluence, ku kituna lamun timbul patarosan "naon pangalusna?" atawa "nu bener?" Kami henteu kaleungitan jalan. Dina kasus urang, urang nyangkut kana ide ngabagi jeung aturan: urang megatkeun up infrastruktur kana potongan leutik / bata. Pendekatan ieu ngamungkinkeun anjeun nyandak sapotong prasarana terasing, ngartos naon anu dilakukeun, nutupan ku tés sareng robih tanpa sieun ngalanggar nanaon.
Tétéla yén tés infrastruktur janten batu pondasi sareng di dieu kedah disebatkeun piramida uji infrastruktur. Persis ide anu sami anu aya dina pamekaran, tapi pikeun infrastruktur: urang ngalih tina tés gancang murah anu mariksa hal-hal sederhana, sapertos indentation, dugi ka tés pinuh mahal anu nyebarkeun sadayana infrastruktur.
Usaha nguji ansible
Sateuacan urang ngajelaskeun kumaha urang nutupan tés Ansible dina proyék éta, kuring bakal ngajelaskeun usaha sareng pendekatan anu kuring ngagaduhan kasempetan pikeun dianggo sateuacanna pikeun ngartos kontéks kaputusan anu dilakukeun.
Dinten No -997: rezeki SDS
Pertama kali kuring nguji Ansible dina proyék pikeun ngembangkeun SDS (Software Defined Storage). Aya artikel misah ngeunaan topik ieu Kumaha megatkeun sapédah ngaliwatan crutches nalika nguji distribusi anjeun, Tapi pondokna, urang réngsé kalawan piramida nguji inverted sarta nguji kami spent 60-90 menit dina hiji peran, nu geus lila. Dasarna éta tés e2e, nyaéta. urang deployed instalasi full-fledged lajeng diuji deui. Anu langkung pikasieuneun nyaéta panemuan sapédah sorangan. Tapi kuring kudu ngaku, leyuran ieu digawé tur diwenangkeun pikeun release stabil.
Dinten # -701: Ansible sareng uji dapur
Kamekaran ideu tés Ansible nya éta ngagunakeun pakakas anu geus jadi, nyaéta uji dapur/dapur-ci jeung inspec. Pilihanna ditangtukeun ku pangaweruh ngeunaan Ruby (pikeun langkung rinci, tingali tulisan ngeunaan Habré: Naha programer YML ngimpi nguji Ansible?) digawé leuwih gancang, kira 40 menit pikeun 10 peran. Kami nyiptakeun pak mesin virtual sareng ngajalankeun tés di jero.
Sacara umum, leyuran digawé, tapi aya sababaraha sédimén alatan heterogeneity. Nalika jumlah jalma anu diuji dironjatkeun kana 13 peran dasar sareng 2 peran meta anu ngagabungkeun peran anu langkung alit, teras ujug-ujug tés mimiti ngajalankeun 70 menit, anu ampir 2 kali langkung lami. Hese ngobrol ngeunaan prakték XP (pemrograman ekstrim) sabab... teu aya anu hoyong ngantosan 70 menit. Ieu alesan pikeun ngarobah pendekatan
Dinten # -601: Ansible sareng molekul
Conceptually, ieu sarupa testkitchen, ngan urang dipindahkeun nguji peran ka docker sarta ngarobah tumpukan. Hasilna, waktos diréduksi jadi stabil 20-25 menit pikeun 7 kalungguhan.
Ku ngaronjatna Jumlah dites kalungguhan 17 sarta linting 45 peran, urang ngajalankeun ieu dina 28 menit on 2 budak jenkins.
Dinten # 167: Nambahkeun tés Ansible kana proyék éta
Paling dipikaresep, éta moal mungkin pikeun ngalakukeun tugas refactoring rusuh. Tugas kudu bisa diukur ku kituna anjeun bisa megatkeun kana lembar leutik sarta dahar sapotong gajah ku sapotong jeung séndok. Kedah aya pamahaman naha anjeun nuju ka arah anu leres, sabaraha lami badé angkat.
Sacara umum, henteu masalah kumaha éta bakal dilakukeun, anjeun tiasa nyerat dina salembar kertas, anjeun tiasa nempatkeun stiker dina lomari, anjeun tiasa nyiptakeun tugas di Jira, atanapi anjeun tiasa muka Google Docs sareng nyerat status ayeuna. Tuh. Suku tumuwuh tina kanyataan yén prosésna henteu langsung, éta bakal panjang sareng tedious. Teu aya kamungkinan yén saha waé anu hoyong anjeun ngaduruk ideu, bosen, sareng janten kabeurangan salami refactoring.
Refactoring téh basajan:
Dahar.
Sare.
Kode.
Tes IaC.
malikan deui
sarta kami ngulang ieu dugi kami ngahontal tujuan dimaksudkeun.
Bisa jadi teu mungkin pikeun ngamimitian nguji sagalana langsung, jadi tugas kahiji urang mimitian ku linting jeung mariksa sintaksis.
Dinten # 181: Héjo Ngawangun Master
Linting mangrupikeun léngkah munggaran anu leutik nuju Green Build Master. Ieu moal megatkeun ampir nanaon, tapi bakal ngidinan Anjeun pikeun debug prosés jeung nyieun héjo ngawangun di Jenkins. Gagasanna nyaéta pikeun ngembangkeun kabiasaan diantara tim:
tés beureum goréng.
Kuring datang ka ngalereskeun hiji hal sarta dina waktos anu sareng nyieun kode saeutik hadé ti éta saméméh anjeun.
Dinten # 193: Ti linting kana tés unit
Saatos ngawangun prosés kéngingkeun kode kana master, anjeun tiasa ngamimitian prosés perbaikan léngkah-léngkah - ngagentos linting sareng peran peluncuran, anjeun bahkan tiasa ngalakukeunana tanpa idémpotensi. Anjeun kedah ngartos kumaha nerapkeun peran sareng kumaha aranjeunna jalanna.
Dinten # 211: Ti Unit ka tes integrasi
Nalika sabagéan ageung peran katutupan ku tés unit sareng sadayana dilebetkeun, anjeun tiasa ngaléngkah ka tambihan tés integrasi. Jelema. nguji teu bata tunggal dina infrastruktur, tapi kombinasi aranjeunna, Contona, konfigurasi conto pinuh.
Ngagunakeun jenkins, urang dihasilkeun loba tahapan nu Linted peran / playbooks di paralel, lajeng Unit tés dina peti, sarta ahirna tés integrasi.
Jenkins + Docker + Ansible = Tés
Checkout repo sareng ngahasilkeun tahapan ngawangun.
Jalankeun tahapan playbook lint sacara paralel.
Jalankeun tahapan peran lint sacara paralel.
Jalankeun sintaksis mariksa tahapan peran paralel.
Jalankeun tahapan peran tés paralel.
Peran linting.
Pariksa kagumantungan kana peran séjén.
Pariksa sintaksis.
Jieun conto docker
Jalankeun molekul/standar/playbook.yml.
Pariksa idémpotensi.
Ngajalankeun tés integrasi
ngabereskeun
Dinten # 271: Faktor Beus
Mimitina, refactoring dilaksanakeun ku sakelompok leutik dua atanapi tilu urang. Aranjeunna marios kodeu dina master. Kana waktu, tim ngembangkeun pangaweruh ngeunaan cara nulis kode jeung kode review nyumbang ka sosialisasi pangaweruh ngeunaan infrastruktur jeung cara gawéna. Sorotan di dieu nyaéta yén pamariksaan dipilih hiji-hiji, dumasar kana jadwal, nyaéta. kalawan sababaraha gelar kamungkinan anjeun bakal nanjak kana sapotong anyar infrastruktur.
Jeung kudu nyaman di dieu. Éta merenah pikeun ngalakukeun ulasan, tingali dina kerangka naon tugas anu dilakukeun, sareng sajarah diskusi. Kami geus terpadu jenkins + bitbucket + jira.
Tapi sapertos kitu, ulasan sanés panacea; kumaha waé, urang asup kana kode master, anu ngajantenkeun urang tes flop:
Kana waktosna, aya deui tés, ngawangun langkung laun, dugi ka sajam dina kasus anu paling parah. Dina salah sahiji retros aya frasa kawas "éta alus nu aya tés, tapi aranjeunna slow". Hasilna, urang ngantunkeun tés integrasi dina mesin virtual sareng diadaptasi pikeun Docker supados langkung gancang. Urang ogé ngaganti testinfra kalawan verifier ansible pikeun ngurangan jumlah parabot dipaké.
Tegesna, aya sakumpulan ukuran:
Pindah ka docker.
Hapus uji peran, anu diduplikasi kusabab katergantungan.
Ngaronjatkeun jumlah budak.
Urutan tés ngajalankeun.
Kamampuhan pikeun lint KABEH lokal kalawan hiji paréntah.
Hasilna, Pipeline on jenkins ogé ngahiji
Ngahasilkeun tahap ngawangun.
Lint sadayana paralel.
Jalankeun tahapan peran tés paralel.
Finish.
palajaran diajar
Hindarkeun variabel global
Ansible migunakeun variabel global, aya workaround parsial dina formulir private_role_vars, tapi ieu sanés panacea.
Hayu atuh masihan anjeun conto. Hayu urang boga role_a и role_b
Hal lucu nyaéta yén hasil tina playbooks bakal gumantung kana hal anu teu salawasna atra, kayaning urutan nu peran didaptarkeun. Hanjakal, ieu téh sipat Ansible jeung hal pangalusna anu bisa dipigawé nyaéta ngagunakeun sababaraha jenis perjangjian, Contona, dina peran hiji, make ngan variabel digambarkeun dina peran ieu.
alus: Dina peran pikeun variabel, make variabel diawalan jeung ngaran peran; ieu, ku nempo inventory, bakal nyieun leuwih gampang ngartos naon anu lumangsung.
Kami sapuk pikeun ngagunakeun awalan variabel; éta henteu langkung penting pikeun pariksa yén aranjeunna didefinisikeun sakumaha anu urang ngarepkeun sareng, contona, henteu ditindih ku nilai kosong.
alus: Pariksa variabel.
- name: "Verify that required string variables are defined"
assert:
that: ahs_var is defined and ahs_var | length > 0 and ahs_var != None
fail_msg: "{{ ahs_var }} needs to be set for the role to work "
success_msg: "Required variables {{ ahs_var }} is defined"
loop_control:
loop_var: ahs_var
with_items:
- ahs_item1
- ahs_item2
- ahs_item3
Hindarkeun kamus hash, nganggo struktur datar
Lamun peran hiji ekspektasi hash / kamus dina salah sahiji parameter na, lajeng lamun urang hayang ngarobah salah sahiji parameter anak, urang kudu override sakabéh hash / kamus, nu bakal ningkatkeun pajeulitna konfigurasi.
Peran jeung playbooks kudu idempotent, sabab ngurangan drift konfigurasi jeung sieun megatkeun hal. Tapi upami anjeun nganggo molekul, maka ieu mangrupikeun kabiasaan standar.
Hindarkeun ngagunakeun modul cangkang paréntah
Ngagunakeun modul cangkang ngahasilkeun paradigma déskripsi imperatif, tinimbang hiji déklaratif, nu inti Ansible.
Nguji peran anjeun ngaliwatan molekul
Molekul mangrupikeun hal anu fleksibel, hayu urang tingali sababaraha skenario.
Molekul Sababaraha instansi
В molecule.yml dina bagian platforms anjeun tiasa ngajelaskeun seueur host anu anjeun tiasa nyebarkeun.
Dina molekul tiasa nganggo ansible pikeun mariksa yén conto parantos dikonpigurasi leres, komo deui, ieu mangrupikeun standar ti saprak release 3. Éta henteu fleksibel sapertos testinfra / inspec, tapi urang tiasa pariksa yén eusi file cocog sareng ekspektasi urang:
Atanapi nyebarkeun jasa, antosan dugi ka sayogi sareng laksanakeun tés haseup:
---
- name: Verify
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: Post documents to solr
command: /blah/solr/bin/post -c master /exampledocs/books.csv
Pasang logika kompleks kana modul & plugins
Ansible ngabela pendekatan déklaratif, jadi mun anjeun ngalakukeun branching kode, transformasi data, modul cangkang, kode jadi hésé maca. Pikeun merangan ieu sareng tetep saderhana pikeun ngartos, éta moal langkung ageung pikeun merangan pajeulitna ieu ku cara nyiptakeun modul anjeun nyalira.
Nyimpulkeun Tips & Trik
Hindarkeun variabel global.
Variabel peran awalan.
Paké variabel kontrol loop.
Pariksa variabel input.
Hindarkeun kamus hash, nganggo struktur datar.
Jieun playbooks idempotent & peran.
Hindarkeun ngagunakeun modul cangkang paréntah.
Nguji peran anjeun ngaliwatan molekul.
Pasang logika kompleks kana modul & plugins.
kacindekan
Anjeun teu bisa ngan balik sarta refactor infrastruktur dina proyék a, sanajan anjeun boga IaC. Ieu mangrupikeun prosés anu panjang anu peryogi kasabaran, waktos sareng pangaweruh.
UPD1 2020.05.01 20:30 - Pikeun profil primér playbooks anjeun tiasa nganggo callback_whitelist = profile_tasks ngartos naon kahayang dianggo pikeun lila. Teras we ngaliwat Palasik akselerasi Ansible. Anjeun oge bisa coba mitogén UPD2 2020.05.03 16:34 - vérsi basa Inggris