Təlimatlar: istehsaldan əvvəl mümkün rolları necə sınamaq və problemlər barədə məlumat əldə etmək

Hello!

Mən otel sifarişi xidmətində DevOps mühəndisi kimi işləyirəm. Ostrovok.ru. Bu yazıda mən ansible rolları sınamaq təcrübəmizdən danışmaq istəyirəm.

Ostrovok.ru saytında biz konfiqurasiya meneceri kimi ansible istifadə edirik. Bu yaxınlarda biz rolları sınamaq zərurətinə gəldik, lakin məlum oldu ki, bunun üçün o qədər də çox alət yoxdur - ən populyar, bəlkə də, Molekul çərçivəsidir, ona görə də ondan istifadə etmək qərarına gəldik. Ancaq məlum oldu ki, onun sənədləri bir çox tələlər haqqında susur. Rus dilində kifayət qədər ətraflı təlimat tapa bilmədik, ona görə də bu məqaləni yazmağa qərar verdik.

Təlimatlar: istehsaldan əvvəl mümkün rolları necə sınamaq və problemlər barədə məlumat əldə etmək

Molekulyar

Molekul - əsaslı rolları sınamağa kömək edən çərçivə.

Sadələşdirilmiş təsvir: Molekul göstərdiyiniz platformada nümunə yaradır (bulud, virtual maşın, konteyner; daha ətraflı məlumat üçün bölməyə baxın Sürücü), rolunuzu işə salır, sonra testləri həyata keçirir və nümunəni silir. Addımlardan birində uğursuzluq halında, Molekul bu barədə sizə məlumat verəcəkdir.

İndi daha çox.

Bir az nəzəriyyə

Molekulun iki əsas obyektini nəzərdən keçirin: Ssenari və Sürücü.

Ssenari

Ssenaridə nəyin, harada, necə və hansı ardıcıllıqla yerinə yetiriləcəyi təsviri var. Bir rolda bir neçə skript ola bilər və hər biri yol boyunca bir kataloqdur <role>/molecule/<scenario>, test üçün tələb olunan hərəkətlərin təsvirlərini ehtiva edir. Skript daxil edilməlidir default, rolu bir Molekulla başlatsanız, avtomatik olaraq yaradılacaq. Aşağıdakı skriptlərin adları sizə bağlıdır.

Skriptdə sınaq hərəkətlərinin ardıcıllığı deyilir matris, və standart olaraq belədir:

(Addımlar etiketlənir ?, istifadəçi tərəfindən göstərilmədiyi təqdirdə standart olaraq atlanır)

  • lint - işləyən linters. Varsayılan olaraq istifadə olunur yamllint и flake8,
  • destroy - Molekulun son buraxılışından nümunələrin silinməsi (əgər varsa),
  • dependency? - sınaqdan keçirilmiş rolun əsaslı asılılığının quraşdırılması;
  • syntax - istifadə edərək rolun sintaksisinin yoxlanılması ansible-playbook --syntax-check,
  • create - nümunə yaratmaq,
  • prepare? — nümunənin hazırlanması; məsələn, python2-ni yoxlayın/quraşdırın
  • converge — sınaqdan keçirilən oyun kitabının işə salınması,
  • idempotence - identifikasiya testi üçün oyun kitabını yenidən işə salmaq,
  • side_effect? - birbaşa rola aid olmayan, lakin testlər üçün zəruri olan hərəkətlər;
  • verify - istifadə edərək, nəticədə konfiqurasiyanın sınaqdan keçirilməsi testinfra(defolt) /goss/inspec,
  • cleanup? - (yeni versiyalarda) - kobud desək, Molekulun təsir etdiyi xarici infrastrukturun "təmizlənməsi",
  • destroy - Bir nümunənin silinməsi.

Bu ardıcıllıq əksər halları əhatə edir, lakin zəruri hallarda dəyişdirilə bilər.

Yuxarıdakı addımların hər biri ilə ayrıca icra edilə bilər molecule <command>. Ancaq başa düşmək lazımdır ki, hər bir belə cli-əmr üçün öz hərəkət ardıcıllığı ola bilər, onu yerinə yetirməklə öyrənə bilərsiniz. molecule matrix <command>. Məsələn, əmri yerinə yetirərkən converge (test altında olan oyun kitabını işə salmaqla) aşağıdakı hərəkətlər yerinə yetiriləcək:

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

Bu hərəkətlərin ardıcıllığı düzəldilə bilər. Siyahıdan bir şey artıq edilibsə, atılacaq. Cari vəziyyət, eləcə də nümunələrin konfiqurasiyası, Molekul kataloqda saxlayır $TMPDIR/molecule/<role>/<scenario>.

ilə addımlar əlavə edin ? istədiyiniz hərəkətləri ansible-playbook formatında təsvir edə və addıma uyğun olaraq fayl adını edə bilərsiniz: prepare.yml/side_effect.yml. Bu faylları gözləyin Molekul skript qovluğunda olacaq.

Sürücü

Sürücü sınaq nümunələrinin yaradıldığı bir qurumdur.
Molecule şablonlarının hazır olduğu standart sürücülərin siyahısı aşağıdakı kimidir: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Əksər hallarda şablonlar fayllardır create.yml и destroy.yml müvafiq olaraq nümunənin yaradılması və silinməsini təsvir edən skript qovluğunda.
İstisnalar Docker və Vagrant-dır, çünki onların modulları ilə qarşılıqlı əlaqə yuxarıda qeyd olunan fayllar olmadan baş verə bilər.

Təqdim edilmiş sürücünü vurğulamağa dəyər, çünki o, bir nümunə yaratmaq və silmək üçün fayllarda istifadə olunursa, yalnız nümunələrin konfiqurasiyası ilə iş təsvir olunur, qalanları mühəndis tərəfindən təsvir edilməlidir.

Defolt sürücü Docker-dir.

İndi təcrübəyə keçək və oradakı digər xüsusiyyətləri nəzərdən keçirək.

Başlarken

"Salam dünya" olaraq sadə nginx quraşdırma rolunu sınaqdan keçirək. Biz docker-i sürücü kimi seçəcəyik - məncə, çoxunuz onu quraşdırmısınız (və unutmayın ki, docker standart sürücüdür).

Hazırlayın virtualenv və içərisinə quraşdırın molecule:

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

Növbəti addım yeni rolu işə salmaqdır.
Yeni rolun, eləcə də yeni skriptin işə salınması əmrdən istifadə etməklə həyata keçirilir 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

Tipik bir ansible rol çıxdı. Bundan əlavə, CLI Molekulları ilə bütün qarşılıqlı əlaqə rolun kökündən edilir.

Gəlin rol kataloqunda nə olduğuna baxaq:

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

1 directory, 6 files

Konfiqurasiyanı təhlil edək molecule/default/molecule.yml (yalnız docker şəklini dəyişdirin):

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

asılılıq

Bu bölmə asılılıqların mənbəyini təsvir edir.

Seçimlər: qalaktika, gilt, qabıq.

Shell sadəcə qalaktika və zər sizin ehtiyaclarınızı ödəmədiyi halda istifadə olunan əmr qabığıdır.

Burada uzun müddət qalmayacağam, kifayət qədər təsvir edilmişdir sənədləşdirmə.

sürücü

Sürücünün adı. Bizimki dokerdir.

tük

Linter yamllintdir.

Konfiqurasiyanın bu hissəsindəki faydalı seçimlər yamllint üçün konfiqurasiya faylını təyin etmək, ətraf mühit dəyişənlərini irəli çəkmək və ya linteri söndürmək imkanıdır:

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

platformalarından

Nümunələrin konfiqurasiyasını təsvir edir.
Sürücü kimi doker vəziyyətində, Molekul bu bölmə üzərində təkrarlanır və siyahının hər bir elementi burada mövcuddur. Dockerfile.j2 dəyişən kimi item.

Tələb edən bir sürücü vəziyyətində create.yml и destroy.yml, bölmə olaraq onlarda mövcuddur molecule_yml.platforms, və onun üzərində təkrarlamalar artıq bu fayllarda təsvir edilmişdir.

Molekul nüsxələrə nəzarəti təmin edən modullara uyğun olduğundan, mümkün parametrlərin siyahısı da orada axtarılmalıdır. Docker üçün, məsələn, modul istifadə olunur docker_container_modulu. Digər sürücülərdə hansı modulların istifadə edildiyini burada tapa bilərsiniz sənədləşdirmə.

Həm də müxtəlif sürücülərin istifadəsinə dair nümunələr tapıla bilər Molekulun özünün sınaqlarında.

Buranı dəyişdirin centos: 7 haqqında ubuntu.

təminatçı

"Təchizatçı" - nümunələri idarə edən qurum. Molekulun vəziyyətində bu, mümkündür, başqaları üçün dəstək planlaşdırılmır, buna görə də bu bölməni bir xəbərdarlıq ilə ansible genişləndirilmiş konfiqurasiya adlandırmaq olar.
Burada bir çox şeyi qeyd edə bilərsiniz, məncə, əsas məqamları vurğulayacağam:

  • oyun kitabları: müəyyən mərhələlərdə hansı oyun kitablarının istifadə olunacağını təyin edə bilərsiniz.

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

  • əlaqə_seçimləri: seçimlər əlaqə

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

  • variantları: Ansible variantları və mühit dəyişənləri

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

ssenari

Skript ardıcıllığının adı və təsviri.
Açarı əlavə etməklə istənilən əmrin standart fəaliyyət matrisini dəyişə bilərsiniz <command>_sequence və ehtiyacımız olan addımların siyahısını müəyyən edərək bunun üçün bir dəyər olaraq.
Tutaq ki, biz playbook run əmrini yerinə yetirərkən hərəkətlərin ardıcıllığını dəyişmək istəyirik: molecule converge

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

yoxlayıcı

Testlər üçün çərçivə və ona linter qurmaq. Standart linterdir testinfra и flake8. Mümkün variantlar yuxarıdakı kimidir:

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

Gəlin öz rolumuza qayıdaq. Faylı redaktə edək tasks/main.yml bu növə:

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

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

Və testlər əlavə edin 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")

Bitdi, yalnız qaçmaq qalır (rolun kökündən sizə xatırlatmağa icazə verin):

> molecule test

Spoyler altında uzun egzoz:

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

Bizim sadə rolumuz problemsiz sınaqdan keçirildi.
İş zamanı problemlər yaranarsa, xatırlamağa dəyər molecule test, onda siz default ardıcıllığı dəyişməmisinizsə, Molekul nümunəni siləcək.

Aşağıdakı əmrlər sazlama üçün faydalıdır:

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

Mövcud rol

Mövcud rola yeni skript əlavə etməkdir rol kataloqundan aşağıdakı əmrlərlə:

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

Bu rolda ilk ssenaridirsə, sonra parametr -s skript yaradacağı üçün buraxıla bilər default.

Nəticə

Gördüyünüz kimi, Molekul çox mürəkkəb deyil və öz şablonlarınızdan istifadə etməklə yeni skriptin yerləşdirilməsi nümunənin yaradılması və silinməsi kitablarında dəyişənlərin redaktə edilməsinə qədər azaldıla bilər. Molekul CI sistemləri ilə mükəmməl birləşir ki, bu da oyun kitablarının əllə sınaqdan keçirilməsi vaxtını azaltmaqla inkişaf sürətini artırmağa imkan verir.

Diqqətinizə görə təşəkkürlər. Anlamlı rolları sınamaq təcrübəniz varsa və bu Molekulla əlaqəli deyilsə, şərhlərdə bu barədə bizə məlumat verin!

Mənbə: www.habr.com

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