Instrukcijos: kaip išbandyti galimus vaidmenis ir sužinoti apie problemas prieš pradedant gaminti

Sveiki visi!

Dirbu DevOps inžinieriumi viešbučių užsakymo tarnyboje. Ostrovok.ru. Šiame straipsnyje noriu pakalbėti apie mūsų patirtį išbandant galimus vaidmenis.

Ostrovok.ru kaip konfigūracijos tvarkyklę naudojame ansible. Neseniai priėjome prie poreikio išbandyti vaidmenis, tačiau, kaip paaiškėjo, tam priemonių nėra daug – populiariausia, ko gero, yra „Molecule“ karkasas, todėl nusprendėme jį panaudoti. Tačiau paaiškėjo, kad jo dokumentuose nekalbama apie daugybę spąstų. Neradome pakankamai išsamaus vadovo rusų kalba, todėl nusprendėme parašyti šį straipsnį.

Instrukcijos: kaip išbandyti galimus vaidmenis ir sužinoti apie problemas prieš pradedant gaminti

molekulė

Molekulė - sistema, padedanti išbandyti galimus vaidmenis.

Supaprastintas aprašymas: Molekulė sukuria egzempliorių jūsų nurodytoje platformoje (debesyje, virtualioje mašinoje, konteineryje; daugiau informacijos žr. Vairuotojas), vykdo jūsų vaidmenį, tada atlieka testus ir ištrina egzempliorių. Jei viename iš žingsnių nepavyks, Molekulė jus apie tai informuos.

Dabar daugiau.

Teorijos tiek

Apsvarstykite du pagrindinius molekulės objektus: scenarijų ir tvarkyklę.

Scenarijus

Scenarijuje yra aprašyta, kas, kur, kaip ir kokia seka bus atliekama. Viename vaidmenyje gali būti keli scenarijai, ir kiekvienas yra katalogas kelyje <role>/molecule/<scenario>, kuriame pateikiami testui atlikti reikalingų veiksmų aprašymai. Scenarijus turi būti įtrauktas default, kuris bus automatiškai sukurtas, jei inicijuosite vaidmenį naudodami molekulę. Toliau nurodytų scenarijų pavadinimai priklauso nuo jūsų.

Testavimo veiksmų seka scenarijuje vadinama matricair pagal numatytuosius nustatymus yra:

(Žingsniai pažymėti ?, pagal numatytuosius nustatymus praleistas, jei vartotojas nenurodė)

  • lint - bėgiojančios lintės. Pagal numatytuosius nustatymus naudojami yamllint и flake8,
  • destroy - egzempliorių ištrynimas iš paskutinio molekulės paleidimo (jei yra),
  • dependency? — galimos tikrinamo vaidmens priklausomybės įdiegimas,
  • syntax - vaidmens sintaksės tikrinimas naudojant ansible-playbook --syntax-check,
  • create - sukurti pavyzdį,
  • prepare? — bylos parengimas; pvz., patikrinkite / įdiekite python2
  • converge — bandomojo plano paleidimas,
  • idempotence - iš naujo paleisti idempotencijos testo planą,
  • side_effect? - veiksmai, kurie nėra tiesiogiai susiję su vaidmeniu, bet būtini testams,
  • verify — gautos konfigūracijos bandymų vykdymas naudojant testinfra(numatytas) /goss/inspec,
  • cleanup? - (naujose versijose) - grubiai tariant, "išvalyti" išorinę infrastruktūrą, kurią veikia Molekulė,
  • destroy – egzemplioriaus ištrynimas.

Ši seka apima daugumą atvejų, tačiau prireikus ją galima pakeisti.

Kiekvieną iš aukščiau nurodytų veiksmų galima atlikti atskirai molecule <command>. Tačiau turėtumėte suprasti, kad kiekvienai tokiai cli komandai gali būti sava veiksmų seka, kurią galite sužinoti paleidę molecule matrix <command>. Pavyzdžiui, kai vykdoma komanda converge (paleidžiant išbandytą knygelę) bus atlikti šie veiksmai:

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

Šių veiksmų seką galima redaguoti. Jei kažkas iš sąrašo jau padaryta, tai bus praleista. Dabartinę būseną, taip pat egzempliorių konfigūraciją, „Molecule“ saugo kataloge $TMPDIR/molecule/<role>/<scenario>.

Pridėkite žingsnių su ? galite apibūdinti norimus veiksmus ansible-playbook formatu ir sukurti failo pavadinimą pagal veiksmą: prepare.yml/side_effect.yml. Tikėtis, kad šie „Molecule“ failai bus scenarijaus aplanke.

Vairuotojas

Vairuotojas yra subjektas, kuriame sukuriami bandomieji egzemplioriai.
Standartinių tvarkyklių, kurioms Molecule turi paruoštus šablonus, sąrašas yra: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Daugeliu atvejų šablonai yra failai create.yml и destroy.yml scenarijaus aplanke, kuriame atitinkamai aprašomas egzemplioriaus kūrimas ir ištrynimas.
Išimtys yra „Docker“ ir „Vagrant“, nes sąveika su jų moduliais gali vykti be minėtų failų.

Verta pabrėžti deleguotą tvarkyklę, nes jei ji naudojama egzemplioriaus kūrimo ir ištrynimo failuose, aprašomas tik darbas su egzempliorių konfigūracija, visa kita turėtų aprašyti inžinierius.

Numatytoji tvarkyklė yra „Docker“.

Dabar pereikime prie praktikos ir apsvarstykime kitas funkcijas.

Darbo pradžia

Kaip „labas pasaulis“, išbandykime paprastą „nginx“ diegimo vaidmenį. Mes pasirinksime docker kaip tvarkyklę – manau, kad dauguma jūsų yra ją įdiegę (ir atminkite, kad docker yra numatytoji tvarkyklė).

Parengti virtualenv ir įdiekite jį į jį molecule:

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

Kitas žingsnis yra naujo vaidmens inicijavimas.
Naujo vaidmens inicijavimas, taip pat naujas scenarijus, atliekamas naudojant komandą 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

Rezultatas yra tipiškas tinkamas vaidmuo. Be to, visos sąveikos su Molecules CLI yra atliekamos iš vaidmens šaknies.

Pažiūrėkime, kas yra vaidmenų kataloge:

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

1 directory, 6 files

Pažiūrėkime į konfigūraciją molecule/default/molecule.yml (pakeisti tik „Docker“ vaizdą):

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

priklausomybė

Šiame skyriuje aprašomas priklausomybių šaltinis.

Pasirinkimai yra: galaktika, giltar, apvalkalas.

Shell yra tik komandų apvalkalas, kuris naudojamas tuo atveju, jei galaktika ir gilt nepatenkina jūsų poreikių.

Ilgai čia neužsibūsiu, tai pakankamai aprašyta dokumentacija.

vairuotojas

Vairuotojo vardas. Mūsų yra dokeris.

pūkuotas

Linter yra yamllint.

Naudingos parinktys šioje konfigūracijos dalyje yra galimybė nurodyti yamllint konfigūracijos failą, persiųsti aplinkos kintamuosius arba išjungti linterį:

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

platformos

Aprašoma egzempliorių konfigūracija.
Jei dokeris yra tvarkyklė, molekulė kartojama šioje dalyje, o kiekvienas sąrašo elementas yra pasiekiamas Dockerfile.j2 kaip kintamasis item.

Jei vairuotojas reikalauja create.yml и destroy.yml, skyrius juose yra kaip molecule_yml.platforms, o iteracijos per jį jau aprašytos šiuose failuose.

Kadangi Molecule teikia egzempliorių valdymą Ansible moduliams, ten turėtumėte ieškoti galimų nustatymų sąrašo. Pavyzdžiui, dokeriui naudojamas modulis docker_container_module. Kurie moduliai naudojami kitose tvarkyklėse, galite rasti dokumentacija.

Taip pat galima rasti įvairių tvarkyklių naudojimo pavyzdžių pačios molekulės bandymuose.

Pakeiskite čia centos:7 apie ubuntu.

aprūpintojas

„Teikėjas“ yra subjektas, valdantis egzempliorius. Molecule atveju tai įmanoma, kitų parama neplanuojama, todėl šią sekciją su išlyga galima pavadinti išplėstine galima konfigūracija.
Čia galite nurodyti daug dalykų, aš išskirsiu pagrindinius dalykus, mano nuomone:

  • žaidimų knygas: galite nurodyti, kurios žaidimo knygos turėtų būti naudojamos tam tikrais etapais.

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

  • ryšio_parinktys: galimybės ryšys

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

  • galimybės: galimi parametrai ir aplinkos kintamieji

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

scenarijus

Scenarijų sekų pavadinimas ir aprašymas.
Galite pakeisti numatytąją komandos veiksmų matricą pridėdami raktą <command>_sequence ir kaip jo vertę apibrėžiant mums reikalingų veiksmų sąrašą.
Tarkime, kad norime pakeisti veiksmų seką, kai vykdoma žaidimo knygos vykdymo komanda: molecule converge

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

Tikrintojas

Testų sistemos ir jos sąsajos nustatymas. Numatytoji linteris yra testinfra и flake8. Galimos parinktys yra tokios pačios kaip aukščiau:

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

Grįžkime prie savo vaidmens. Redaguojame failą tasks/main.yml tokio tipo:

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

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

Ir pridėkite testus 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")

Atlikta, belieka tik bėgti (priminsiu nuo vaidmens šaknų):

> molecule test

Ilgas išmetimas po spoileriu:

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

Mūsų paprastas vaidmuo buvo išbandytas be problemų.
Verta prisiminti, kad jei veikimo metu kyla problemų molecule test, tada, jei nepakeitėte standartinės sekos, „Molecule“ ištrins egzempliorių.

Derinant naudingos šios komandos:

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

Esamas vaidmuo

Naujo scenarijaus pridėjimas prie esamo vaidmens yra iš vaidmenų katalogo su šiomis komandomis:

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

Jei tai pirmasis vaidmens scenarijus, tada parametras -s galima praleisti, nes bus sukurtas scenarijus default.

išvada

Kaip matote, molekulė nėra labai sudėtinga, o naudojant savo šablonus, naujo scenarijaus diegimas gali būti sumažintas iki kintamųjų redagavimo egzempliorių kūrimo ir ištrynimo knygelėse. Molekulė sklandžiai integruojasi su CI sistemomis, o tai leidžia padidinti kūrimo greitį sumažinant rankinio žaidimų knygelių testavimo laiką.

Ačiū už dėmesį. Jei turite patirties išbandydami įmanomus vaidmenis ir tai nesusiję su molekule, pasakykite apie tai komentaruose!

Šaltinis: www.habr.com

Добавить комментарий