Заавар: үйлдвэрлэл эхлэхээс өмнө боломжит дүрүүдийг хэрхэн туршиж үзэх, асуудлын талаар олж мэдэх

хүн бүрт Сайн байна уу!

Би зочид буудлын захиалгын үйлчилгээнд DevOps инженерээр ажилладаг. Ostrovok.ru. Энэ нийтлэлд би дүрүүдийг туршиж үзсэн туршлагаасаа ярихыг хүсч байна.

Ostrovok.ru дээр бид ansible програмыг тохиргооны менежер болгон ашигладаг. Саяхан бид дүрүүдийг туршиж үзэх шаардлагатай болсон боловч үүний тулд тийм ч олон хэрэгсэл байдаггүй - хамгийн алдартай нь магадгүй молекулын хүрээ юм, тиймээс бид үүнийг ашиглахаар шийдсэн. Гэвч түүний баримт бичиг олон бэрхшээлийн талаар чимээгүй байсан нь тогтоогджээ. Бид орос хэл дээр хангалттай дэлгэрэнгүй гарын авлагыг олж чадаагүй тул бид энэ нийтлэлийг бичихээр шийдсэн.

Заавар: үйлдвэрлэл эхлэхээс өмнө боломжит дүрүүдийг хэрхэн туршиж үзэх, асуудлын талаар олж мэдэх

Молекул

Молекул - боломжит дүрүүдийг шалгахад туслах хүрээ.

Хялбаршуулсан тайлбар: Молекул нь таны зааж өгсөн платформ дээр жишээ үүсгэдэг (үүл, виртуал машин, контейнер; дэлгэрэнгүйг хэсгийг үзнэ үү. Жолооч), үүн дээр таны үүргийг ажиллуулж, дараа нь тестийг ажиллуулж, жишээг устгана. Алхамуудын аль нэг нь бүтэлгүйтсэн тохиолдолд молекул энэ талаар танд мэдэгдэх болно.

Одоо илүү дэлгэрэнгүй.

Онол бага байна

Молекулын хоёр гол объектыг авч үзье: Сценари ба Жолооч.

Тохиолдол

Скрипт нь юу, хаана, хэрхэн, ямар дарааллаар гүйцэтгэх тухай тайлбарыг агуулдаг. Нэг үүрэг нь хэд хэдэн скрипттэй байж болох бөгөөд тус бүр нь зам дагуух лавлах юм <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>. Гэхдээ ийм cli-command бүрийн хувьд өөрийн гэсэн үйлдлийн дараалал байж болох бөгөөд үүнийг гүйцэтгэх замаар олж мэдэх боломжтой гэдгийг ойлгох хэрэгтэй. molecule matrix <command>. Жишээлбэл, командыг ажиллуулах үед converge (шалгаж буй тоглоомын номыг ажиллуулах) дараах үйлдлүүдийг гүйцэтгэнэ.

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

Эдгээр үйлдлийн дарааллыг засах боломжтой. Хэрэв жагсаалтаас ямар нэг зүйл аль хэдийн хийгдсэн бол үүнийг алгасах болно. Молекулын одоогийн төлөв, мөн тохиолдлын тохиргоог лавлахад хадгалдаг. $TMPDIR/molecule/<role>/<scenario>.

-р алхам нэмнэ үү ? Та хүссэн үйлдлээ ansible-playbook форматаар дүрсэлж, дараах алхмын дагуу файлын нэрийг гаргаж болно. prepare.yml/side_effect.yml. Эдгээр файлуудыг хүлээж байна Молекул нь скрипт хавтсанд байх болно.

Жолооч

Драйвер нь туршилтын жишээ үүсгэсэн байгууллага юм.
Молекулын загваруудыг бэлэн болгосон стандарт драйверуудын жагсаалт дараах байдалтай байна: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Ихэнх тохиолдолд загварууд нь файлууд байдаг create.yml и destroy.yml скрипт хавтсанд тус тус жишээ үүсгэх, устгахыг тайлбарласан.
Үл хамаарах зүйл нь Docker болон Vagrant юм, учир нь тэдгээрийн модулиудтай харилцах нь дээр дурдсан файлуудгүйгээр тохиолдож болно.

Төлөөлөгч драйверийг онцлон тэмдэглэх нь зүйтэй, учир нь хэрэв энэ нь жишээ үүсгэх, устгахад зориулагдсан файлд ашиглагдаж байгаа бол зөвхөн жишээнүүдийн тохиргоотой ажиллах талаар тайлбарласан бол үлдсэнийг нь инженер тайлбарлах ёстой.

Анхдагч драйвер нь Docker юм.

Одоо дадлага хийж, цаашдын онцлогуудыг авч үзье.

Эхлэл

"Сайн уу ертөнц"-ийн хувьд энгийн nginx суулгацын үүргийг туршиж үзье. Бид докерыг драйвераар сонгох болно - Та нарын ихэнх нь үүнийг суулгасан гэж бодож байна (мөн докер бол анхдагч драйвер гэдгийг санаарай).

Бэлтгэх 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

хамаарал

Энэ хэсэгт хамаарлын эх үүсвэрийг тайлбарласан болно.

Возможные хувилбарууд: Галактик, алт, бүрхүүл.

Бүрхүүл нь галактик болон алтны чулуу таны хэрэгцээг хангахгүй тохиолдолд ашигладаг тушаалын бүрхүүл юм.

Би энд удаан хугацаагаар үлдэхгүй, үүнийг хангалттай тайлбарласан болно баримт бичиг.

Драйвер

Жолоочийн нэр. Манайх бол докер.

хөвөн

Линтер нь ямлинт юм.

Тохиргооны энэ хэсгийн ашигтай сонголтууд нь yamllint-д зориулсан тохиргооны файлыг зааж өгөх, орчны хувьсагчдыг дамжуулах эсвэл линтерийг идэвхгүй болгох чадвар юм.

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. Бусад драйверуудад ямар модулийг ашигладаг болохыг эндээс олж болно баримт бичиг.

Түүнчлэн янз бүрийн драйверуудыг ашиглах жишээг олж болно Молекулын туршилтанд.

Энд солино уу цент: 7 тухай Ubuntu.

хангагч

"Нийлүүлэгч" - тохиолдлуудыг удирддаг байгууллага. Молекулын хувьд энэ нь боломжтой, бусдад дэмжлэг үзүүлэхээр төлөвлөөгүй тул энэ хэсгийг анхааруулгатай өргөтгөсөн тохиргоо гэж нэрлэж болно.
Энд та маш олон зүйлийг зааж өгч болно, би гол санааг онцлон тэмдэглэх болно, миний бодлоор:

  • Тоглоомууд: тодорхой үе шатанд ямар тоглоомын номыг ашиглахыг зааж өгч болно.

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 мөн бидэнд хэрэгтэй алхмуудын жагсаалтыг тодорхойлох замаар үүний үнэ цэнэ.
Playbook run командыг ажиллуулахдаа бид үйлдлийн дарааллыг өөрчлөхийг хүсч байна гэж бодъё: 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

сэтгэгдэл нэмэх