Instruksi: carane nguji peran sing bisa ditindakake lan ngerteni masalah sadurunge produksi

Всем Привет!

Aku kerja minangka insinyur DevOps ing layanan pesenan hotel. Ostrovok.ru. Ing artikel iki, aku pengin ngomong babagan pengalaman kita nyoba peran sing bisa ditindakake.

Ing Ostrovok.ru, kita nggunakake ansible minangka manajer konfigurasi. Bubar, kita kudu nyoba peran, nanging ternyata, ora akeh alat kanggo iki - sing paling populer, mbok menawa, kerangka Molekul, mula kita mutusake nggunakake. Nanging pranyata dokumentasi dheweke bisu babagan akeh pitfalls. Kita ora bisa nemokake manual sing cukup rinci ing basa Rusia, mula kita mutusake kanggo nulis artikel iki.

Instruksi: carane nguji peran sing bisa ditindakake lan ngerteni masalah sadurunge produksi

Molekul

Molekul - kerangka kanggo mbantu nguji peran sing bisa ditindakake.

Katrangan sing disederhanakake: Molekul nggawe conto ing platform sing sampeyan nemtokake (awan, mesin virtual, wadhah; kanggo rincian liyane, deleng bagean driver), nglakokake peran sampeyan, banjur nganakake tes lan mbusak conto kasebut. Yen gagal ing salah sawijining langkah, Molekul bakal ngandhani babagan iki.

Saiki luwih.

Minangka teori

Ayo nimbang rong entitas utama Molekul: Skenario lan Driver.

Skenario

Naskah kasebut ngemot katrangan babagan apa, ing ngendi, kepriye, lan urutan apa sing bakal ditindakake. Siji peran bisa duwe sawetara skrip, lan saben minangka direktori ing dalan <role>/molecule/<scenario>, sing ngemot katrangan babagan tumindak sing dibutuhake kanggo tes. Script kudu kalebu default, sing bakal digawe kanthi otomatis yen sampeyan miwiti peran nggunakake Molekul. Jeneng-jeneng skrip ing ngisor iki miturut kawicaksanan sampeyan.

Urutan tumindak nguji ing naskah diarani Matriks, lan minangka standar kaya iki:

(Langkah-langkah ditandhani ?, dilewati kanthi gawan yen ora ditemtokake dening pangguna)

  • lint - mlaku linters. Kanthi gawan digunakake yamllint и flake8,
  • destroy - mbusak conto saka peluncuran Molekul pungkasan (yen isih ana),
  • dependency? - nginstal ketergantungan sing bisa ditindakake saka peran sing diuji,
  • syntax - mriksa sintaksis peran nggunakake ansible-playbook --syntax-check,
  • create - nggawe conto,
  • prepare? - preparation saka Kayata; contone mriksa / nginstal python2
  • converge - Bukak playbook sing diuji,
  • idempotence - mbukak maneh playbook kanggo tes idempotensi,
  • side_effect? - tumindak sing ora ana hubungane langsung karo peran, nanging perlu kanggo tes,
  • verify - mlaku tes saka konfigurasi asil nggunakake testinfra(standar) /goss/inspec,
  • cleanup? - (ing versi anyar) - kira-kira, "ngresiki" infrastruktur eksternal sing kena pengaruh Molekul,
  • destroy - mbusak conto.

Urutan iki nyakup umume kasus, nanging bisa diganti yen perlu.

Saben langkah ing ndhuwur bisa digunakake kanthi kapisah molecule <command>. Nanging sampeyan kudu ngerti manawa kanggo saben perintah cli kasebut bisa uga ana urutan tumindak dhewe, sing bisa dingerteni kanthi mlaku. molecule matrix <command>. Contone, nalika mbukak printah converge (nglakokake playbook sing diuji) tumindak ing ngisor iki bakal ditindakake:

$ molecule matrix converge
...
└── default         # название сценария
    ├── dependency  # установка зависимостей
    ├── create      # создание инстанса
    ├── prepare     # преднастройка инстанса
    └── converge    # прогон плейбука

Urutan tumindak kasebut bisa diowahi. Yen soko saka dhaptar wis rampung, iku bakal dilewati. Kahanan saiki, uga konfigurasi conto, Molekul disimpen ing direktori kasebut $TMPDIR/molecule/<role>/<scenario>.

Tambah langkah karo ? sampeyan bisa njlèntrèhaké tumindak sing dikarepake ing format ansible-playbook, lan nggawe jeneng berkas miturut langkah: prepare.yml/side_effect.yml. Nyana file Molekul iki ing folder script.

driver

Driver minangka entitas ing ngendi conto tes digawe.
Dhaptar driver standar sing Molecule duwe template siap digawe yaiku: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Umume kasus, template minangka file create.yml и destroy.yml ing folder skrip sing nggambarake nggawe lan mbusak conto.
Pangecualian yaiku Docker lan Vagrant, amarga interaksi karo modul kasebut bisa kedadeyan tanpa file ing ndhuwur.

Sampeyan kudu nyorot driver Delegated, amarga yen digunakake, mung karya karo konfigurasi conto sing diterangake ing nggawe lan mbusak file, liyane kudu diterangake dening insinyur.

Pembalap standar yaiku Docker.

Saiki ayo nerusake latihan lan nimbang fitur liyane ing kana.

Miwiti

Minangka "hello world", ayo nyoba peran instalasi nginx sing prasaja. Kita bakal milih docker minangka pembalap - Aku paling sampeyan wis diinstal (lan elinga yen docker minangka pembalap standar).

Siapke virtualenv lan nginstal ing molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule установит ansible как зависимость; docker для драйвера

Langkah sabanjure yaiku miwiti peran anyar.
Inisialisasi peran anyar, uga skrip anyar, ditindakake kanthi nggunakake perintah kasebut molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
├── README.md
├── defaults
├── handlers
├── meta
├── molecule
├── tasks
└── vars

6 directories, 1 file

Asil punika peran ansible khas. Luwih, kabeh interaksi karo Molekul CLI digawe saka ROOT peran.

Ayo ndeleng apa sing ana ing direktori peran:

> tree molecule/default/
molecule/default/
├── Dockerfile.j2  # Jinja-шаблон для Dockerfile
├── INSTALL.rst.   # Немного информации об установке зависимостей сценария
├── molecule.yml   # Файл конфигурации
├── playbook.yml   # Плейбук запуска роли
└── tests          # Директория с тестами стадии verify
    └── test_default.py

1 directory, 6 files

Ayo analisa konfigurasi molecule/default/molecule.yml (kita bakal ngganti mung gambar docker):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

ketergantungan

Bagean iki nerangake sumber dependensi.

Pilihan sing bisa: galaxy, gilt, cangkang.

Shell mung cangkang printah sing digunakake ing kasus galaxy lan gilt ora nutupi kabutuhan sampeyan.

Aku ora bakal manggon kene kanggo dangu, iku cukup diterangake ing dokumentasi.

Driver

Jenenge sopir. We are docker.

linen

Yamllint digunakake minangka linter.

Opsi sing migunani ing bagean konfigurasi iki yaiku kemampuan kanggo nemtokake file konfigurasi kanggo yamllint, variabel lingkungan maju, utawa mateni linter:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

platform

Njlèntrèhaké konfigurasi saka kedadean.
Ing kasus docker minangka pembalap, Molekul diulang ing bagean iki, lan saben unsur dhaptar kasedhiya ing Dockerfile.j2 minangka variabel item.

Ing kasus pembalap kang create.yml и destroy.yml, bagean kasedhiya ing wong-wong mau minangka molecule_yml.platforms, lan iterasi kasebut wis diterangake ing file kasebut.

Wiwit Molekul nyedhiyakake manajemen conto kanggo modul Ansible, sampeyan kudu nggoleki dhaptar setelan sing bisa ditindakake. Kanggo Docker, contone, modul digunakake docker_container_module. Modul sing digunakake ing pembalap liyane bisa ditemokake ing dokumentasi.

Uga conto panggunaan macem-macem pembalap bisa ditemokake ing tes saka Molekul dhewe.

Ganti kene senti: 7 ing ubuntu.

panyedhiya

"Pemasok" - entitas sing ngatur conto. Ing kasus Molekul, iki bisa ditindakake, dhukungan kanggo wong liya ora direncanakake, mula bagean iki bisa diarani konfigurasi ekstensif ansible kanthi caveat.
Ing kene sampeyan bisa nemtokake akeh perkara, aku bakal nyorot poin utama, miturut pendapatku:

  • buku dolanan: sampeyan bisa nemtokake playbooks sing kudu digunakake ing tataran tartamtu.

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • opsi: Pilihan Ansible lan variabel lingkungan

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

skenario

Jeneng lan deskripsi urutan skrip.
Sampeyan bisa ngganti matriks tumindak standar saka sembarang printah kanthi nambah tombol <command>_sequence lan minangka nilai kasebut kanthi nemtokake dhaptar langkah-langkah sing dibutuhake.
Ayo, kita pengin ngganti urutan tumindak nalika mbukak printah playbook run: molecule converge

# изначально:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

verifikasi

Nyetel kerangka kanggo tes lan linter kasebut. Linter standar yaiku testinfra и flake8. Pilihan sing bisa uga padha karo ing ndhuwur:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

Ayo bali menyang peran kita. Ayo nyunting file kasebut tasks/main.yml kanggo jinis iki:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

Lan nambah tes kanggo molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

Rampung, sing isih ana yaiku mlaku (saka oyod peran, aku ngelingake sampeyan):

> molecule test

knalpot dawa ing ngisor spoiler:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

Peran prasaja kita dites tanpa masalah.
Sampeyan kudu eling yen ana masalah nalika operasi molecule test, banjur yen sampeyan ora ngganti urutan standar, Molecule bakal mbusak conto.

Printah ing ngisor iki migunani kanggo debugging:

> molecule --debug <command> # debug info. При обычном запуске Молекула скрывает логи.
> molecule converge          # Оставляет инстанс после прогона тестируемой роли.
> molecule login             # Зайти в созданный инстанс.
> molecule --help            # Полный список команд.

Peran sing ana

Nambahake skrip anyar menyang peran sing wis ana saka direktori peran kanthi printah ing ngisor iki:

# полный список доступных параметров
> molecule init scenarion --help
# создание нового сценария
> molecule init scenario -r <role_name> -s <scenario_name>

Ing kasus iki skenario pisanan ing peran, banjur parameter -s bisa diilangi amarga skrip bakal digawe default.

kesimpulan

Nalika sampeyan bisa ndeleng, Molekul ora banget Komplek, lan nggunakake Cithakan dhewe, deploying script anyar bisa suda kanggo ngowahi variabel ing nggawe conto lan mbusak playbooks. Molekul kasebut nggabungake kanthi lancar karo sistem CI, sing ngidini sampeyan nambah kacepetan pangembangan kanthi nyuda wektu tes manual playbook.

Matur nuwun kawigatosanipun. Yen sampeyan duwe pengalaman nguji peran sing bisa ditindakake, lan ora ana hubungane karo Molekul, tulisake ing komentar!

Source: www.habr.com

Add a comment