
Kini ang transcript sa :
Sugod sa ikaduhang commit, ang bisan unsang code mahimong panulondon, samtang ang orihinal nga mga intensyon magsugod sa pagtipas gikan sa mapait nga realidad. Dili kini maayo o daotan; kini usa ka kamatuoran sa kinabuhi nga lisud ibaliwala ug kinahanglan nga dawaton. Kabahin niini nga proseso mao ang refactoring. Ang imprastraktura isip Code refactoring. Atong sugdan ang istorya kung giunsa pag-refactor ang Ansible sa usa ka tuig nga dili magkabuang.
Ang Pagkatawo sa Kabilin
Adlaw #1: Pasyente Zero

Adunay usa ka hinimo-himo nga proyekto. Kini gilangkoban sa usa ka Dev team ug mga Ops engineer. Parehas ra ang ilang gisulbad nga problema: unsaon pag-deploy sa mga server ug paglansad sa usa ka aplikasyon. Ang problema kay ang matag team lahi og pamaagi niini nga problema. Ang proyekto nakahukom nga gamiton ang Ansible aron i-synchronize ang kahibalo tali sa Dev ug Ops teams.
Adlaw #89: Ang Pagkatawo sa Kabilin

Wala gani nila naamgohan nga gusto nila kining himuon nga maayo kutob sa mahimo, apan nahimo diay kining usa ka panulondon. Giunsa man kini nahitabo?
- Naa tay dinalian nga buluhaton diri, maghimo ta og dirty hack ug dayon ayuhon nato kini.
- Dili kinahanglan nga magsulat og dokumentasyon; klaro ang tanan kung unsa ang nahitabo dinhi.
- Kahibalo ko sa Ansible / Python / Bash / Terraform! Tan-awa ko unsaon nako kini mahitabo!
- Usa ko ka Full Stack Overflow Developer ug gikopya nako kini gikan sa stackoverflow. Ambot lang unsaon ni pagtrabaho, pero nindot tan-awon ug nasulbad ang problema.
Tungod niini, mahimo kang makakuha og code nga morag dili masabtan, walay dokumentasyon, dili klaro kung unsa ang gibuhat niini, dili klaro kung gikinahanglan ba kini, apan ang problema kay kinahanglan nimo kini nga i-develop, pauswagon, dugangan og saklay ug props, nga makapasamot lang sa sitwasyon.
- hosts: localhost
tasks:
- shell: echo -n Z >> a.txt && cat a.txt
register: output
delay: 1
retries: 5
until: not output.stdout.find("ZZZ")Adlaw #109: Pag-ila sa Problema

Ang orihinal nga giplano ug gipatuman nga modelo sa IaC dili na makatubag sa mga panginahanglan sa mga tiggamit, sa negosyo, ug uban pang mga team, ug ang oras nga gikinahanglan aron makahimo og mga pagbag-o sa imprastraktura dili na madawat. Niining puntoha, nahimong klaro nga panahon na aron molihok.
Pag-usab sa IaC
Adlaw #139: Sigurado Ka Ba Nga Kinahanglan Nimong I-refactor?

Sa dili pa ka magdali sa refactoring, kinahanglan nimong tubagon ang daghang importanteng mga pangutana:
- Ngano nga kinahanglan nimo kining tanan?
- Naa kay panahon?
- Igo na ba ang kahibalo?
Kon dili ka kabalo motubag sa mga pangutana, ang refactoring matapos bisan dili pa gani magsugod, o basin mograbe pa gyud. Kay naa kay kasinatian. ), dayon ang proyekto nagpadala og hangyo alang sa tabang sa pag-ayo sa mga tahas ug pagtabon niini gamit ang mga pagsulay.
Adlaw #149: Pagpangandam alang sa Refactoring

Ang una nga butang mao ang pagpangandam. Kinahanglan natong modesisyon kon unsa ang atong buhaton. Aron mahimo kini, kita makigsulti, moila sa mga problema, ug mangita og mga solusyon. Atong idokumento ang mga konsepto nga resulta sa bisan unsang paagi, pananglitan, sa usa ka artikulo sa Confluence, aron kon ang pangutana nga "unsa ang mas maayo?" o "unsa ang mas husto?" motumaw, dili kita motipas sa dalan. Sa among kaso, nagpabilin kami sa ideya. bahina ug buntogaAtong bungkagon ang imprastraktura ngadto sa gagmay nga mga piraso/tisa. Kini nga pamaagi nagtugot kanato sa pagkuha og usa ka nahimulag nga piraso sa imprastraktura, pagsabot sa gibuhat niini, pagtabon niini gamit ang mga pagsulay, ug pag-usab niini nga walay kahadlok nga madaot ang bisan unsa.

Migawas nga ang pagsulay sa imprastraktura nahimong usa ka sukaranan, ug ang piramide sa pagsulay sa imprastraktura angayan nga hisgutan dinhi. Parehas ra kini sa ideya sa pag-uswag, apan alang sa imprastraktura: mobalhin kita gikan sa barato ug dali nga mga pagsulay nga nagsusi sa mga yano nga butang, sama sa indentation, ngadto sa mahal ug kompleto nga mga pagsulay nga nag-deploy sa tibuuk nga imprastraktura.
Mga Pagsulay sa Ansible Testing
Sa dili pa nato ihulagway kon giunsa nato pagtabon ang Ansible testing sa proyekto, akong ihulagway ang mga pagsulay ug pamaagi nga akong gigamit kaniadto aron masabtan ang konteksto sa mga desisyon nga akong nahimo.
Adlaw #997: Pagtagana sa SDS

Una nakong gisulayan ang Ansible sa usa ka proyekto sa pagpalambo sa Software Defined Storage (SDS). Naa'y lahi nga artikulo bahin niini.
Apan sa laktod nga pagkasulti, nahuman mi og usa ka inverted testing pyramid, ug migugol mig 60-90 minutos sa pagsulay sa matag role, nga usa ka taas nga panahon. Ang pundasyon mao ang e2e testing, buot ipasabot nga among gi-deploy ang usa ka kompletong instalasyon ug dayon gisulayan kini. Ang pag-imbento pag-usab sa wheel mas mahagiton pa. Apan kinahanglan nakong dawaton, kini nga solusyon nagtrabaho ug nagtugot sa makanunayon nga mga pagpagawas.
Adlaw # -701: Ansible ug test kitchen

Ang konsepto sa Ansible testing miuswag uban sa paggamit sa mga andam nang gamit, sama sa test kitchen / kitchen-ci ug inspec. Kini nga pagpili gimaneho sa akong kahibalo sa Ruby (dugang detalye sa artikulo sa Habr: ) mas paspas nga nagtrabaho, mga 40 minutos para sa 10 ka tahas. Naghimo mig daghang mga virtual machine ug nagpadagan og mga pagsulay sulod niini.

Sa kinatibuk-an, ang solusyon milampos, apan adunay dili maayong pagbati tungod sa pagkadili-konsistente niini. Sa dihang among gidugangan ang gidaghanon sa mga subject sa pagsulay ngadto sa 13 ka batakang mga tahas ug duha ka meta nga mga tahas nga naghiusa sa gagmay nga mga tahas, ang mga pagsulay kalit nga milungtad og 70 ka minuto, halos doble ang gidugayon. Lisod ang paghisgot sa mga pamaagi sa XP (extreme programming), tungod kay walay usa nga gusto nga maghulat og 70 ka minuto. Kini nakaaghat og pagbag-o sa pamaagi.
Adlaw # -601: Ansible ug molekula

Sa konsepto, parehas ra kini sa testkitchen, apan among gibalhin ang role testing ngadto sa Docker ug giusab ang stack. Tungod niini, ang oras nakunhoran ngadto sa stable nga 20-25 minutos para sa 7 ka roles.

Pinaagi sa pagdugang sa gidaghanon sa nasulayan nga mga tahas ngadto sa 17 ug pag-lint og 45 ka mga tahas, among gipadagan kini sulod sa 28 ka minuto sa 2 ka Jenkins slaves.
Adlaw #167: Pagdugang og Ansible Tests sa Proyekto

Lagmit dili ka makahimo sa usa ka buluhaton sa refactoring nga direkta. Kinahanglan nga masukod ang buluhaton, aron imong mabahin-bahin kini ngadto sa gagmay nga mga tipak ug kan-on ang elepante usa-usa gamit ang usa ka kutsarita. Kinahanglan nimong masabtan kung husto ba ang imong gibuhat ug unsa pa ka layo ang imong kinahanglan nga adtoan.

Sa kinatibuk-an, dili igsapayan kon giunsa kini pagbuhat. Mahimo nimo kini isulat sa papel, ipapilit ang sticky notes sa kabinet, maghimo og mga buluhaton sa Jira, o maghimo og Google Docs account ug irekord ang kasamtangang kahimtang didto. Ang hinungdan kay dili kini dali nga proseso; kini taas ug makalaay. Dili tingali nga adunay gusto nga ma-burnout ka, maluya, ug mohunong atol sa refactoring.
Sayon ra ang pag-refactor:
- Kaon.
- Pagkatulog.
- Gi-code.
- Pagsulay sa IaC.
- Usba
ug mao kini ang atong balik-balikon hangtod nga makaabot kita sa gituyo nga tumong.

Basin dili dayon masugdan ang pagsulay sa tanan, mao nga ang among unang buluhaton mao ang pagsugod sa linting ug syntax checking.
Adlaw #181: Green Build Master

Ang linting usa ka gamay nga unang lakang padulong sa Green Build Master. Dili kini makadaot sa bisan unsa, apan kini magtugot kanimo sa pag-debug sa mga proseso ug paghimo og mga green build sa Jenkins. Ang ideya mao ang pagpalambo sa mga batasan sa imong team:
- Dili maayo ang mga pulang pagsulay.
- Nianhi aron ayuhon ang usa ka butang, ug sa samang higayon himuon ang code nga mas maayo gamay kaysa sa kaniadto.
Adlaw #193: Gikan sa Linting ngadto sa Unit Tests

Kung nakahimo na ka og proseso para sa pagpasulod sa code ngadto sa master, makasugod ka na og hinay-hinay nga proseso sa pag-uswag—ilisan ang linting og role execution, bisan kon walay idempotence. Importante nga masabtan kon unsaon pag-apply sa mga roles ug kon giunsa kini molihok.
Adlaw #211: Gikan sa Yunit ngadto sa mga Pagsulay sa Integrasyon

Kung natabonan na sa unit tests ang kadaghanan sa mga tahas ug ang tanan na-lint na, mahimo ka nang mopadayon sa pagdugang og integration tests. Kini nagpasabot nga dili lang ang pagsulay sa indibidwal nga mga component sa imprastraktura ang gisulayan, apan ang mga kombinasyon niini, sama sa kompletong instance configuration.

Sa Jenkins, nakahimo mi og daghang mga yugto nga nag-lint sa mga roles/playbooks nga parallel, dayon mga unit test sa mga container, ug sa katapusan mga integration test.
Jenkins + Docker + Ansible = Mga Pagsulay

- Susiha ang repo ug paghimo og mga yugto sa pagtukod.
- Padagana ang mga yugto sa lint playbook nga dungan.
- Padagana ang mga lint role stages nga dungan.
- Padagana ang syntax check role stages nga dungan.
- Padagana ang mga yugto sa papel sa pagsulay nga dungan.
- Papel sa lint.
- Susiha ang pagsalig sa ubang mga tahas.
- Susiha ang sintaks.
- Paghimo og docker instance
- Padagana ang molecule/default/playbook.yml.
- Susiha ang idempotency.
- Pagpadagan og mga pagsulay sa integrasyon
- Humana
Adlaw #271: Bus Factor

Sa sinugdanan, ang refactoring gidumala sa usa ka gamay nga grupo nga gilangkuban sa pipila ka mga tawo. Ilang gisusi ang master code. Sa paglabay sa panahon, ang team nakaugmad og komon nga pagsabot kon unsaon pagsulat og code, ug ang mga pagrepaso sa code nakatabang sa pagpakaylap sa kahibalo bahin sa imprastraktura ug kon giunsa kini pag-istruktura. Ang importante mao nga ang mga tigsusi gipili nga nagpuli-puli, sumala sa usa ka iskedyul, nga nagpasabot nga adunay posibilidad nga magtrabaho ka sa usa ka bag-ong seksyon sa imprastraktura.

Ug kinahanglan nga sayon kini dinhi. Kinahanglan nga dali ra kining ribyuhon, makita ang buluhaton nga gigamit sa paghimo niini, ug ang kasaysayan sa diskusyon. Among gi-integrate ang Jenkins + Bitbucket + Jira.
Apan ang usa ka review dili usa ka tambal. Sa usa ka paagi, nakakita mig code nga hinungdan sa among mga flappy test:
- 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 }}"Kini gitul-id sa ulahi, apan ang lami nga nahabilin nagpabilin.
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 }}"Adlaw #311: Pagpadali sa mga Pagsulay

Samtang naglabay ang panahon, nagkadaghan ang mga pagsulay, ug ang mga pagtukod mihinay ngadto sa usa ka oras sa pinakagrabe nga mga kaso. Sa usa sa mga retro, adunay komento nga sama sa, "Maayo kay naa'y mga pagsulay, apan hinay ra sila." Sa katapusan, among gibiyaan ang mga pagsulay sa integrasyon sa mga virtual machine ug gipahiangay kini sa Docker aron mapadali ang mga butang. Gipulihan usab namo ang testinfra sa Ansible Verifier aron makunhuran ang gidaghanon sa mga himan nga gigamit.

Sa estrikto nga pagkasulti, adunay usa ka hugpong sa mga lakang dinhi:
- Pagbalhin ngadto sa Docker.
- Tangtanga ang role testing nga nadoble tungod sa mga dependency.
- Dugangi ang gidaghanon sa mga ulipon.
- Ang han-ay sa pagpadagan sa mga pagsulay.
- Posibilidad sa pag-lint TANAN lokal gamit ang usa ka mando.

Tungod niini, ang Pipeline sa Jenkins nahiusa usab.
- Paghimo og mga yugto sa pagtukod.
- I-lint ang tanan nga parehas.
- Padagana ang mga yugto sa papel sa pagsulay nga dungan.
- Tapos na.
Mga leksyon nga nakat-unan
Likayi ang mga global variable
Ang Ansible naggamit ug mga global variable, adunay partial workaround sa porma , apan dili kini usa ka tambal nga makaayo sa tanan.
Tugoti ko nga mohatag kanimo og ehemplo. Ingnon ta nga naa tay role_a и 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: hello
roles:
- role: role_a
- role: role_b
tasks:
- debug:
msg: play={{msg}}
Kataw-anan nga ang resulta sa playbook magdepende sa mga butang nga dili kanunay klaro, sama sa han-ay sa paglista sa mga tahas. Ikasubo, kini kinaiyanhon sa Ansible, ug ang labing maayong buhaton mao ang paggamit sa pipila ka mga kombensiyon, sama sa paggamit lamang sa mga variable nga gihubit sulod sa usa ka tahas.
DAOTANG: gamita ang global variable.
# cat roles/some_role/tasks/main.yml
---
debug:
var: java_homeMAAYONG: SA defaults ipasabot ang gikinahanglan nga mga variable ug sa ulahi gamiton lamang kini.
# 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
Mga variable sa papel sa prefix
DAOTANG: gamita ang global variable.
# cat roles/some_role/defaults/main.yml
---
db_port: 5432MAAYONGSa papel para sa mga variable, gamita ang mga variable nga adunay prefix sa ngalan sa papel; kon imong tan-awon ang imbentaryo, mas sayon sabton kon unsa ang nahitabo.
# cat roles/some_role/defaults/main.yml
---
some_role__db_port: 5432Gamita ang variable sa pagkontrol sa loop
DAOTANG: Gamita ang standard variable sa mga loop itemKon kini nga buluhaton/playbook gilakip sa usa ka dapit, mahimo kini nga mosangpot sa wala damha nga pamatasan.
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item }}"
loop:
- item1
- item2
MAAYONG: I-redefine ang usa ka variable sa usa ka loop through loop_var.
---
- hosts: localhost
tasks:
- debug:
msg: "{{ item_name }}"
loop:
- item1
- item2
loop_control:
loop_var: item_name
Susiha ang mga input variable
Miuyon mi nga mogamit og mga variable prefix; maayong ideya nga susihon nga kini gihubit sama sa among gilauman ug, pananglitan, wala kini ma-override sa usa ka walay sulod nga bili.
MAAYONG: Susiha ang mga baryable.
- 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_item3Likayi ang mga hash dictionary, gamita ang patag nga istruktura
Kon ang usa ka role magdahom og hash/dictionary sa usa sa mga parameter niini, nan kon gusto natong usbon ang usa sa mga child parameter, kinahanglan natong usbon ang tibuok hash/dictionary, nga makadugang sa pagkakomplikado sa configuration.
DAOTANG: Gamita ang hash/diksyonaryo.
---
user:
name: admin
group: adminMAAYONG: Gamita ang patag nga variable nga istruktura.
---
user_name: admin
user_group: "{{ user_name }}"Paghimo og mga idempotent playbook ug mga tahas
Ang mga tahas ug mga playbook kinahanglan nga idempotent, tungod kay kini makapakunhod sa configuration drift ug sa kahadlok nga mabuak ang usa ka butang. Apan kung mogamit ka og Molecule, kini ang default nga pamatasan.
Likayi ang paggamit sa mga command shell module
Ang paggamit og shell module nagpugos sa usa ka imperative description paradigm, imbes sa declarative nga mao ang kinauyokan sa Ansible.
Sulayi ang imong mga tahas pinaagi sa molekula
Ang molekula usa ka butang nga flexible kaayo, atong tan-awon ang pipila ka mga senaryo.
Molekula nga Daghang mga Instance
В molecule.yml sa seksyon platforms Mahimo nimong ihulagway ang lainlaing mga host nga i-deploy.
---
driver:
name: docker
platforms:
- name: postgresql-instance
hostname: postgresql-instance
image: registry.example.com/postgres10:latest
pre_build_image: true
override_command: false
network_mode: host
- name: app-instance
hostname: app-instance
pre_build_image: true
image: registry.example.com/docker_centos_ansible_tests
network_mode: hostSubay niini, kini nga mga host mahimo unya nga converge.yml gamita:
---
- name: Converge all
hosts: all
vars:
ansible_user: root
roles:
- role: some_role
- name: Converge db
hosts: db-instance
roles:
- role: some_db_role
- name: Converge app
hosts: app-instance
roles:
- role: some_app_roleAnsible nga tigpamatuod
Gisuportahan sa Molecule ang paggamit sa Ansible aron mapamatud-an nga ang usa ka instance na-configure sa husto; kini ang default sukad sa release 3. Dili kini sama ka flexible sa testinfra/inspec, apan gitugotan ka niini nga mapamatud-an nga ang mga sulud sa file nahiuyon sa imong gilauman:
---
- name: Verify
hosts: all
tasks:
- name: copy config
copy:
src: expected_standalone.conf
dest: /root/wildfly/bin/standalone.conf
mode: "0644"
owner: root
group: root
register: config_copy_result
- name: Certify that standalone.conf changed
assert:
that: not config_copy_result.changedO i-deploy ang serbisyo, hulata nga kini magamit, ug padagana ang smoke test:
---
- 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.csvIbutang ang komplikado nga lohika sa mga module ug plugin
Ang Ansible nagpasiugda sa usa ka deklaratibong pamaagi, busa kung mag-branch code ka, mag-transform sa data, o mogamit og shell modules, ang code mahimong lisod basahon. Aron masumpo kini ug dali ra sabton, maayong ideya nga sulbaron kini nga pagkakomplikado pinaagi sa paghimo sa imong kaugalingong mga modules.
I-summarize ang mga Tip ug Trick
- Likayi ang mga global variable.
- Mga variable sa papel nga adunay prefix.
- Gamita ang variable sa pagkontrol sa loop.
- Susiha ang mga input variable.
- Likayi ang mga hash dictionary, gamita ang patag nga istruktura.
- Paghimo og idempotent nga mga playbook ug mga tahas.
- Likayi ang paggamit sa mga command shell modules.
- Sulayi ang imong mga tahas pinaagi sa molekula.
- Ibutang ang komplikado nga lohika sa mga module ug plugin.
konklusyon

Dili nimo basta-basta ma-refactor ang imprastraktura sa usa ka proyekto, bisan kung naa kay IaC. Usa kini ka taas nga proseso nga nanginahanglan og pailub, oras, ug kahanas.
Links
- slide
- Video
UPD1 2020.05.01 20:30 — Para sa inisyal nga pag-profile sa mga playbook, mahimo nimong gamiton callback_whitelist = profile_tasks aron masabtan kung unsa gyud ang dugay nga nahitabo. Pagkahuman niana, atong hisgutan Mahimo nimong sulayan.
UPD2 2020.05.03 16:34 -
Source: www.habr.com
