Нұсқаулар: өндіріс алдында маңызды рөлдерді сынау және проблемаларды білу

Привет!

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

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

Бұл әрекеттердің ретін өңдеуге болады. Тізімдегі бірдеңе жасалған болса, ол өткізіп жіберіледі. Ағымдағы күй, сондай-ақ даналардың конфигурациясы, Молекула каталогта сақтайды $TMPDIR/molecule/<role>/<scenario>.

арқылы қадамдарды қосыңыз ? ansible-playbook пішімінде қалаған әрекеттерді сипаттай аласыз және қадамға сәйкес файл атауын жасай аласыз: prepare.yml/side_effect.yml. Бұл файлдарды күтіңіз Молекула сценарий қалтасында болады.

жүргізуші

Драйвер сынақ даналары жасалған нысан болып табылады.
Molecule үлгілері дайын стандартты драйверлердің тізімі төмендегідей: 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

тәуелділік

Бұл бөлім тәуелділік көзін сипаттайды.

Опциялар: Галактика, giltar, қабық.

Shell - бұл галактика мен гилт сіздің қажеттіліктеріңізді қанағаттандырмаған жағдайда қолданылатын командалық қабық.

Мен бұл жерде ұзақ тұрмаймын, бұл жеткілікті сипатталған құжаттама.

жүргізуші

Жүргізушінің аты-жөні. Біздікі докер.

талшық

Линтер - ямлинт.

Конфигурацияның осы бөлігіндегі пайдалы опциялар 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 және бізге қажет қадамдар тізімін анықтау арқылы оның мәні ретінде.
Ойын кітабын іске қосу пәрменін іске қосу кезінде әрекеттер тізбегін өзгерткіміз келеді делік: 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

пікір қалдыру