لارښوونې: څنګه د ځواب وړ رولونو ازموینه وکړئ او د تولید دمخه د ستونزو په اړه ومومئ

سلام هر!

زه د هوټل بکینګ خدمت کې د DevOps انجینر په توګه کار کوم. Ostrovok.ru. پدې مقاله کې ، زه غواړم د ځواب وړ رولونو ازموینې کې زموږ د تجربې په اړه وغږیږم.

په Ostrovok.ru کې، موږ د ترتیب مدیر په توګه ځواب ورکوو. په دې وروستیو کې، موږ د رولونو ازموینې ته اړتیا لرو، مګر لکه څنګه چې دا معلومه شوه، د دې لپاره ډیری وسیلې شتون نلري - ترټولو مشهور، شاید، د مالیکول چوکاټ دی، نو موږ پریکړه وکړه چې دا وکاروو. مګر دا معلومه شوه چې د هغه اسناد د ډیری زیانونو په اړه خاموش دي. موږ نشو کولی چې په روسیه کې کافي مفصل لارښود ومومئ، نو موږ پریکړه وکړه چې دا مقاله ولیکئ.

لارښوونې: څنګه د ځواب وړ رولونو ازموینه وکړئ او د تولید دمخه د ستونزو په اړه ومومئ

ماليکيول

مالیکول - یو چوکاټ چې د ځواب وړ رولونو ازموینې کې مرسته وکړي.

ساده توضیحات: مالیکول په هغه پلیټ فارم کې یو مثال رامینځته کوي چې تاسو یې مشخص کوئ (بادل ، مجازی ماشین ، کانټینر؛ د نورو جزیاتو لپاره ، برخه وګورئ ډرایور) ، پدې کې خپل رول پرمخ وړي ، بیا ازموینې پرمخ وړي او مثال حذف کوي. په یو ګام کې د ناکامۍ په صورت کې، مالیکول به تاسو ته خبر ورکړي.

اوس نور.

یو څه تیوری

د مالیکول دوه مهمې ادارې په پام کې ونیسئ: سناریو او چلوونکی.

سناریو

په سکریپټ کې توضیحات شامل دي چې څه، چیرته، څنګه او په کوم ترتیب کې ترسره کیږي. یو رول کولی شي څو سکریپټونه ولري، او هر یو د لارې په اوږدو کې لارښود دی <role>/molecule/<scenario>، کوم چې د ازموینې لپاره اړین اقداماتو توضیحات لري. سکریپټ باید شامل وي default، کوم چې به په اوتومات ډول رامینځته شي که تاسو رول د مالیکول سره پیل کړئ. د لاندې سکریپټونو نومونه تاسو پورې اړه لري.

په سکریپټ کې د ازموینې کړنو ترتیب ویل کیږي میټرکس، او د ډیفالټ له مخې دا دی:

(مرحلې لیبل شوي ?، د ډیفالټ لخوا پریښودل شوی که چیرې د کارونکي لخوا مشخص شوی نه وي)

  • lint - د لینټر چلول. په ډیفالټ کارول کیږي yamllint и flake8,
  • destroy - د مالیکول وروستي لانچ څخه د مثالونو حذف کول (که شتون ولري)
  • dependency؟ - د ازمول شوي رول د ځواب وړ انحصار نصب کول ،
  • syntax - په کارولو سره د رول ترکیب چیک کړئ ansible-playbook --syntax-check,
  • create - د مثال جوړول،
  • prepare؟ - د مثال چمتو کول؛ د مثال په توګه د python2 چیک / نصب کړئ
  • converge - د پلې بوک لانچ ازمول کیږي ،
  • idempotence - د ایډیمپوټینسي ازموینې لپاره د لوبو کتاب بیا پیل کول ،
  • side_effect؟ - کړنې په مستقیم ډول د رول سره تړاو نلري، مګر د ازموینو لپاره اړین دي
  • verify - په کارولو سره د پایلې ترتیب شوي ازموینې پرمخ وړل testinfra(ډیفالټ) /goss/inspec,
  • cleanup؟ - (په نویو نسخو کې) - تقریبا خبرې کول، د مالیکول لخوا اغیزمن شوي بهرنۍ زیربنا "پاک کول"،
  • destroy - د مثال ړنګول.

دا ترتیب ډیری قضیې پوښي، مګر که اړتیا وي بدلیدلی شي.

د پورته ګامونو هر یو په جلا توګه پرمخ وړل کیدی شي molecule <command>. مګر دا باید پوه شي چې د هر داسې کلی-کمانډ لپاره ممکن د عملونو خپل ترتیب وي، چې تاسو یې په اجرا کولو سره موندلی شئ. molecule matrix <command>. د مثال په توګه، کله چې کمانډ چلول converge (د آزموینې لاندې د لوبې کتاب چلول)، لاندې کړنې به ترسره شي:

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

د دې عملونو ترتیب ترمیم کیدی شي. که د لیست څخه یو څه دمخه ترسره شوی وي، دا به پریښودل شي. اوسنی حالت، او همدارنګه د مثالونو ترتیب، مالیکول په ډایرکټر کې ذخیره کوي $TMPDIR/molecule/<role>/<scenario>.

سره ګامونه اضافه کړئ ? تاسو کولی شئ د ځواب وړ-پلے بوک فارمیټ کې مطلوب عملونه تشریح کړئ، او د فایل نوم د ګام سره سم جوړ کړئ: prepare.yml/side_effect.yml. د دې فایلونو تمه وکړئ مالیکول به د سکریپټ فولډر کې وي.

ډرایور

ډرایور یوه اداره ده چیرې چې د ازموینې مثالونه رامینځته کیږي.
د معیاري ډرایورانو لیست چې مالیکول یې ټیمپلیټونه لري په لاندې ډول دي: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

په ډیری مواردو کې، ټیمپلیټونه فایلونه دي create.yml и destroy.yml په سکریپټ فولډر کې چې په ترتیب سره د مثال رامینځته کول او حذف کول تشریح کوي.
استثناوې Docker او Vagrant دي، ځکه چې د دوی ماډلونو سره تعامل د پورته ذکر شوي فایلونو پرته واقع کیدی شي.

دا د ټاکل شوي ډرایور روښانه کولو ارزښت لري ، ځکه چې که دا د مثال رامینځته کولو او حذف کولو لپاره په فایلونو کې کارول کیږي ، یوازې د مثالونو تنظیم کولو سره کار تشریح شوی ، پاتې باید د انجینر لخوا تشریح شي.

ډیفالټ ډرایور ډاکر دی.

اوس راځئ چې تمرین ته لاړ شو او هلته نور ځانګړتیاوې په پام کې ونیسو.

تر لاسه کول پیل شول

د "هیلو نړۍ" په توګه، راځئ چې د ساده نګینکس نصبولو رول ازموینه وکړو. راځئ چې ډاکر د ډرایور په توګه غوره کړو - زه فکر کوم چې ستاسو څخه ډیری یې نصب کړی دی (او په یاد ولرئ چې ډاکر ډیفالټ ډرایور دی).

چمتو کول virtualenv او په هغې کې نصب کړئ molecule:

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

بل ګام د نوي رول پیل کول دي.
د نوي رول پیل کول، او همدارنګه یو نوی سکریپټ، د کمانډ په کارولو سره ترسره کیږي 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

دا یو عادي ځواب ورکونکی رول وګرځید. سربیره پردې، د CLI مالیکولونو سره ټول تعاملات د رول له ریښې څخه جوړ شوي.

راځئ وګورو چې د رول لارښود کې څه دي:

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

1 directory, 6 files

راځئ چې تشکیلات تحلیل کړو molecule/default/molecule.yml (یوازې د ډاکر عکس بدل کړئ):

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

انحصار

دا برخه د انحصار سرچینه بیانوي.

احتمالي انتخابونه: په کهکشان, giltar, خولۍ.

شیل یوازې د کمانډ شیل دی چې په هغه صورت کې کارول کیږي چې کهکشان او ګیلټ ستاسو اړتیاوې نه پوښي.

زه به دلته د اوږدې مودې لپاره پاتې نه شم، دا کافي دي چې تشریح شوي اسناد.

چلوونکی

د موټر چلوونکي نوم. زموږ ډاکر دی.

لیټ

لینټر یاملینټ دی.

د تشکیل په دې برخه کې ګټور انتخابونه د یاملینټ لپاره د ترتیب کولو فایل مشخص کولو وړتیا دي، د چاپیریال متغیرات، یا د لینټ غیر فعال کول:

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

پلیټونه

د مثالونو ترتیب بیانوي.
د ډرایور په توګه د ډاکر په قضیه کې، مالیکول پدې برخه کې تکرار شوی، او د لیست هر عنصر په کې شتون لري. Dockerfile.j2 د یو متغیر په توګه item.

د موټر چلوونکي په صورت کې چې اړتیا وي create.yml и destroy.yml، برخه د دوی په څیر شتون لري molecule_yml.platforms، او د هغې په اړه تکرارونه دمخه په دې فایلونو کې تشریح شوي.

څرنګه چې مالیکول د ځواب وړ ماډلونو ته د مثالونو کنټرول چمتو کوي، د احتمالي ترتیباتو لیست هم باید هلته وڅیړل شي. د ډاکر لپاره، د بیلګې په توګه، ماډل کارول کیږي docker_container_module. کوم ماډلونه چې په نورو ډرایورونو کې کارول کیږي په کې موندل کیدی شي اسناد.

همدارنګه د مختلفو ډرایورانو کارولو مثالونه موندل کیدی شي پخپله د مالیکول په ازموینو کې.

دلته ځای پرځای کړئ centos:7 په د وبنټو.

روزونکی

"سپلور" - هغه اداره چې مثالونه اداره کوي. د مالیکول په حالت کې، دا د ځواب وړ دی، د نورو لپاره ملاتړ پالن شوی نه دی، نو دا برخه د احتیاط سره د ځواب وړ پراخ شوی ترتیب بلل کیدی شي.
دلته تاسو کولی شئ ډیری شیان مشخص کړئ، زه به زما په اند اصلي ټکي په ګوته کړم:

  • د لوبو کتابونه: تاسو کولی شئ مشخص کړئ چې کوم پلی بوکونه باید په ځانګړو مرحلو کې وکارول شي.

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

  • انتخابونه: ځواب ورکوونکي انتخابونه او د چاپیریال تغیرات

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

سناریو

د سکریپټ ترتیبونو نوم او توضیحات.
تاسو کولی شئ د کیلي په اضافه کولو سره د هرې کمانډ ډیفالټ عمل میټریکس بدل کړئ <command>_sequence او د دې لپاره د ارزښت په توګه د ګامونو لیست په ګوته کولو سره چې موږ ورته اړتیا لرو.
راځئ چې ووایو موږ غواړو د عملونو ترتیب بدل کړو کله چې د پلی بوک چلولو کمانډ چلول: molecule converge

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

وګورئ

د ازموینو لپاره د چوکاټ ترتیب کول او هغې ته لینټ. اصلي لینټر دی testinfra и flake8. ممکنه اختیارونه د پورته په څیر ورته دي:

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

راځئ چې خپل رول ته راستون شو. راځئ چې فایل ترمیم کړو tasks/main.yml دې ډول ته:

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

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

او ازموینې اضافه کړئ 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")

بشپړ شوی، دا یوازې د چلولو لپاره پاتې دی (د رول له ریښې څخه، اجازه راکړئ تاسو ته یادونه وکړم):

> molecule test

د سپیلر لاندې اوږده اخراج:

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

زموږ ساده رول پرته له ستونزو ازمول شوی و.
دا د یادولو وړ ده چې که چیرې د کار پرمهال ستونزې شتون ولري molecule test، بیا که تاسو د ډیفالټ ترتیب بدل نه کړ ، مالیکول به مثال حذف کړي.

لاندې کمانډونه د ډیبګ کولو لپاره ګټور دي:

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

موجوده رول

په موجوده رول کې د نوي سکریپټ اضافه کول دي د رول لارښود څخه د لاندې حکمونو سره:

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

په هغه صورت کې چې دا په رول کې لومړۍ سناریو وي، بیا پیرامیټر -s پریښودل کیدی شي ځکه چې دا به یو سکریپټ رامینځته کړي default.

پایلې

لکه څنګه چې تاسو لیدلی شئ، مالیکول خورا پیچلی ندی، او ستاسو د خپلو ټیمپلیټونو په کارولو سره، د نوي سکریپټ ځای پرځای کول د مثال په جوړولو او د لوبې کتابونو له مینځه وړلو کې د تغیراتو ایډیټ کولو ته کم کیدی شي. مالیکول په بې ساري ډول د CI سیسټمونو سره مدغم کیږي ، کوم چې تاسو ته اجازه درکوي د پلی بوکونو لارښود ازموینې لپاره د وخت کمولو سره د پراختیا سرعت ډیر کړئ.

له پاملرنې څخه مو مننه. که تاسو د ځواب وړ رولونو ازموینې کې تجربه لرئ ، او دا د مالیکول سره تړاو نلري ، موږ ته یې په نظرونو کې ووایاست!

سرچینه: www.habr.com

Add a comment