Көрсөтмөлөр: Ansible ролдорун кантип сынап көрүү жана өндүрүшкө чейин көйгөйлөрдү билүү

Баарына салам!

Мен мейманкананы ээлөө кызматында DevOps инженери болуп иштейм. Ostrovok.ru. Бул макалада мен Ansible ролдорун сынап көрүү тажрыйбабыз жөнүндө айткым келет.

Ostrovok.ru сайтында биз конфигурация менеджери катары ansible колдонобуз. Жакында биз ролдорду сынап көрүү зарылдыгына келдик, бирок, белгилүү болгондой, бул үчүн көптөгөн куралдар жок - эң популярдуу, балким, Молекула алкагы, ошондуктан биз аны колдонууну чечтик. Бирок анын документтери көптөгөн туңгуюктар тууралуу унчукпай турганы белгилүү болду. Биз орус тилинде жетиштүү деталдуу жол таба алган жокпуз, ошондуктан биз бул макаланы жазууну чечтик.

Көрсөтмөлөр: Ansible ролдорун кантип сынап көрүү жана өндүрүшкө чейин көйгөйлөрдү билүү

Молекула

молекула — 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 буйругу үчүн иш-аракеттердин өз ырааттуулугу болушу мүмкүн экенин түшүнүшүңүз керек, аны иштетүү аркылуу биле аласыз. molecule matrix <command>. Мисалы, команданы иштетип жатканда converge (текшерилген оюн китебин иштетүү) төмөнкү аракеттер аткарылат:

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

Бул аракеттердин ырааттуулугу түзөтүлүшү мүмкүн. Тизмедеги бир нерсе мурунтан эле бүткөрүлгөн болсо, ал өткөрүп жиберилет. Учурдагы абал, ошондой эле инстанциянын конфигурациясы Молекула каталогунда сакталат $TMPDIR/molecule/<role>/<scenario>.

менен кадамдарды кошуу ? Сиз Ansible ойнотуу китеби форматында каалаган аракеттерди сүрөттөп, файлдын атын кадамга ылайык жасай аласыз: prepare.yml/side_effect.yml. Бул Molecule файлдары скрипт папкасында болушун күтүңүз.

айдоочу

Драйвер - бул тесттер үчүн инстанциялар түзүлгөн уюм.
Molecule даяр калыптары бар стандарттуу драйверлердин тизмеси: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Көпчүлүк учурларда, калыптар файлдар болуп саналат create.yml и destroy.yml скрипт папкасында, тиешелүүлүгүнө жараша инстанцияны түзүүнү жана жок кылууну сүрөттөйт.
Докер жана 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

Натыйжада типтүү ansible ролу болуп саналат. Андан тышкары, 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,кабык.

Shell бул жөн гана командалык кабык, эгерде галактика жана алтын жалтыратуу сиздин муктаждыктарыңызды канааттандырбаса.

Мен бул жерде көпкө калбайм, бул жерде жетиштүү сүрөттөлгөн документтер.

айдоочу

Айдоочунун аты. Биз үчүн бул докер.

бор

Yamllint линтер катары колдонулат.

Конфигурациянын бул бөлүгүндөгү пайдалуу варианттар yamllint үчүн конфигурация файлын көрсөтүү, чөйрөнүн өзгөрмөлөрүн алдыга жылдыруу же линтерди өчүрүү:

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

аянтчалар

Инстанциялардын конфигурациясын сүрөттөйт.
Докердин айдоочусу болгон учурда, Молекула бул бөлүмдө кайталанат жана тизменин ар бир элементи Dockerfile.j2 өзгөрмө катары item.

Кайсы бир айдоочунун учурда create.yml и destroy.yml, бөлүм аларда катары жеткиликтүү molecule_yml.platforms, жана андагы итерациялар бул файлдарда мурунтан эле сүрөттөлгөн.

Molecule Ansible модулдарына инстанцияларды башкарууну камсыз кылгандыктан, мүмкүн болгон орнотуулардын тизмесин ошол жерден издешиңиз керек. Докер үчүн, мисалы, модул колдонулат docker_container_module. Башка драйверлерде кайсы модулдар колдонулганын табууга болот документтер.

Ошондой эле ар кандай драйверлерди колдонуунун мисалдарын таба аласыз Молекуланын өзүн сыноодо.

Бул жерден алмаштыралы centos: 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'"

  • параметрлери: Ansible параметрлери жана чөйрө өзгөрмөлөрү

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 мисалды жок кылат.

Төмөнкү буйруктар мүчүлүштүктөрдү оңдоо үчүн пайдалуу:

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

жыйынтыктоо

Көрүнүп тургандай, Molecule өтө татаал эмес жана өзүңүздүн шаблондоруңузду колдонуп жатканда, инстанцияларды түзүү жана жок кылуу үчүн окуу китептериндеги өзгөрмөлөрдү түзөтүү үчүн жаңы скрипттин жайылышын азайта аласыз. Молекула CI системалары менен үзгүлтүксүз интеграцияланат, бул окуу китептерин кол менен текшерүү убактысын кыскартуу менен өнүгүү ылдамдыгын жогорулатууга мүмкүндүк берет.

Көңүл бурганыңыздар үчүн рахмат. Эгер сизде ansible ролдорду сынап көрүү тажрыйбасы бар болсо жана ал Молекулага тиешеси жок болсо, бул тууралуу комментарийлерде айтып бериңиз!

Source: www.habr.com

Комментарий кошуу