Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

Ieu transkrip pagelaran dina DevOps-40 2020-03-18:

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.
  • Kuring terang Ansible/Python/Bash/Terraform! Tingali kumaha kuring tiasa ngahindar!
  • 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.

- hosts: localhost
  tasks:
    - shell: echo -n Z >> a.txt && cat a.txt
      register: output
      delay: 1
      retries: 5
      until: not output.stdout.find("ZZZ")

Dinten # 109: Kasadaran masalah

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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?

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

Sateuacan anjeun buru-buru ka refactor, anjeun kedah ngajawab sababaraha patarosan penting:

  1. Naha anjeun peryogi sadayana ieu?
  2. Dupi anjeun gaduh waktos?
  3. 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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

  1. Checkout repo sareng ngahasilkeun tahapan ngawangun.
  2. Jalankeun tahapan playbook lint sacara paralel.
  3. Jalankeun tahapan peran lint sacara paralel.
  4. Jalankeun sintaksis mariksa tahapan peran paralel.
  5. Jalankeun tahapan peran tés paralel.
    1. Peran linting.
    2. Pariksa kagumantungan kana peran séjén.
    3. Pariksa sintaksis.
    4. Jieun conto docker
    5. Jalankeun molekul/standar/playbook.yml.
    6. Pariksa idémpotensi.
  6. Ngajalankeun tés integrasi
  7. ngabereskeun

Dinten # 271: Faktor Beus

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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:

- 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 }}"

Lajeng aranjeunna ngalereskeun eta, tapi résidu tetep.

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 }}"

Dinten # 311: Ngagancangkeun tés

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

Tegesna, aya sakumpulan ukuran:

  1. Pindah ka docker.
  2. Hapus uji peran, anu diduplikasi kusabab katergantungan.
  3. Ngaronjatkeun jumlah budak.
  4. Urutan tés ngajalankeun.
  5. Kamampuhan pikeun lint KABEH lokal kalawan hiji paréntah.

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

Hasilna, Pipeline on jenkins ogé ngahiji

  1. Ngahasilkeun tahap ngawangun.
  2. Lint sadayana paralel.
  3. Jalankeun tahapan peran tés paralel.
  4. 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

# 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}}

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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.

awon: ngagunakeun variabel global.

# cat roles/some_role/tasks/main.yml
---
debug:
  var: java_home

alus: V defaults nangtukeun variabel perlu sarta engké make ngan aranjeunna.

# 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

Variabel peran awalan

awon: ngagunakeun variabel global.

# cat roles/some_role/defaults/main.yml
---
db_port: 5432

alus: Dina peran pikeun variabel, make variabel diawalan jeung ngaran peran; ieu, ku nempo inventory, bakal nyieun leuwih gampang ngartos naon anu lumangsung.

# cat roles/some_role/defaults/main.yml
---
some_role__db_port: 5432

Paké variabel kontrol loop

awon: Paké variabel baku dina loop item, lamun tugas / playbook ieu kaasup wae, ieu bisa ngakibatkeun kabiasaan teu kaduga

---
- hosts: localhost
  tasks:
    - debug:
        msg: "{{ item }}"
      loop:
        - item1
        - item2

alus: Ngartikeun ulang variabel dina loop via loop_var.

---
- hosts: localhost
  tasks:
    - debug:
        msg: "{{ item_name }}"
      loop:
        - item1
        - item2
      loop_control:
        loop_var: item_name

Pariksa variabel input

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.

awon: Paké hash / kamus.

---
user:
  name: admin
  group: admin

alus: Paké struktur variabel datar.

---
user_name: admin
user_group: "{{ user_name }}"

Jieun playbooks idempotent & kalungguhan

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.

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

Sasuai, host ieu lajeng tiasa converge.yml ngagunakeun:

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

Verifier ansible

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:

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

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

  1. Hindarkeun variabel global.
  2. Variabel peran awalan.
  3. Paké variabel kontrol loop.
  4. Pariksa variabel input.
  5. Hindarkeun kamus hash, nganggo struktur datar.
  6. Jieun playbooks idempotent & peran.
  7. Hindarkeun ngagunakeun modul cangkang paréntah.
  8. Nguji peran anjeun ngaliwatan molekul.
  9. Pasang logika kompleks kana modul & plugins.

kacindekan

Kumaha ngamimitian nguji Ansible, refactor proyék dina sataun tur teu jadi gélo

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

sumber: www.habr.com

Tambahkeun komentar