Malangizo: momwe mungayesere maudindo oyenerera ndikupeza zovuta musanapange

Hello aliyense!

Ndimagwira ntchito ngati injiniya wa DevOps pantchito yosungitsa mahotelo. Ostrovok.ru. M'nkhaniyi, ndikufuna kunena za zomwe takumana nazo poyesa maudindo oyenera.

Ku Ostrovok.ru, timagwiritsa ntchito ansible ngati woyang'anira kasinthidwe. Posachedwapa, tinafika pakufunika kuyesa maudindo, koma monga momwe zinakhalira, palibe zida zambiri za izi - zodziwika kwambiri, mwinamwake, ndi ndondomeko ya Molecule, kotero tinaganiza zogwiritsa ntchito. Koma zinapezeka kuti zolemba zake sizinatchule misampha yambiri. Sitinapeze buku lokwanira bwino mu Chirasha, choncho tinaganiza zolembera nkhaniyi.

Malangizo: momwe mungayesere maudindo oyenerera ndikupeza zovuta musanapange

Molekuli

Molekuli - chimango chothandizira kuyesa maudindo oyenera.

Kufotokozera kosavuta: Molekyu imapanga chitsanzo papulatifomu yomwe mumatchula (mtambo, makina enieni, chidebe; kuti mumve zambiri, onani gawoli. dalaivala), imayendetsa gawo lanu pamenepo, kenako imayesa ndikuchotsa chitsanzocho. Mukalephera pa imodzi mwamasitepe, Molekyulu idzakudziwitsani za izi.

Tsopano zambiri.

Chiphunzitso china

Ganizirani zinthu ziwiri zazikulu za Molekuli: Zochitika ndi Dalaivala.

Chitsanzo

Zolembazo zili ndi kufotokoza kwa zomwe, kuti, momwe zidzachitikire komanso motsatira ndondomeko ziti. Udindo umodzi ukhoza kukhala ndi zolemba zingapo, ndipo iliyonse ndi chikwatu panjira <role>/molecule/<scenario>, yomwe ili ndi mafotokozedwe a zochita zomwe zimafunika kuyesedwa. Script iyenera kuphatikizidwa default, zomwe zidzapangidwa zokha ngati mutayambitsa gawolo ndi Molekuli. Mayina a zolembedwa zotsatirazi ali ndi inu.

Kutsatizana kwa kuyesa zochita mu script kumatchedwa Matrix, ndipo mwachisawawa ndi:

(Masitepe olembedwa ?, kulumpha mwachisawawa ngati sichinatchulidwe ndi wogwiritsa ntchito)

  • lint - kuthamanga linter. Mwa kusakhazikika amagwiritsidwa ntchito yamllint и flake8,
  • destroy - Kuchotsa zochitika pakukhazikitsa komaliza kwa Molecule (ngati zilipo),
  • dependency? - kukhazikitsa kudalira koyenera kwa gawo loyesedwa,
  • syntax - kuyang'ana kalembedwe ka ntchitoyo ansible-playbook --syntax-check,
  • create - kupanga misala,
  • prepare? - kukonzekera chitsanzo; mwachitsanzo check/install python2
  • converge - kukhazikitsidwa kwa playbook yomwe ikuyesedwa,
  • idempotence - kuyambitsanso buku lamasewera kuti muyesere kusadziwa,
  • side_effect? - zochita sizikukhudzana mwachindunji ndi gawo, koma zofunikira pakuyesa,
  • verify - kuyesa zoyeserera zomwe zachitika pogwiritsa ntchito testinfra(zosintha) /goss/inspec,
  • cleanup? - (m'matembenuzidwe atsopano) - kunena pang'ono, "kuyeretsa" zida zakunja zomwe zakhudzidwa ndi Molecule,
  • destroy - Kuchotsa chitsanzo.

Kutsatira uku kumakhudza nthawi zambiri, koma kumatha kusinthidwa ngati kuli kofunikira.

Iliyonse mwa njira zomwe tafotokozazi zitha kuyendetsedwa padera ndi molecule <command>. Koma ziyenera kumveka kuti pa lamulo lililonse lotereli pakhoza kukhala zochitika zake, zomwe mungathe kuzipeza pochita. molecule matrix <command>. Mwachitsanzo, poyendetsa lamulo converge (kuyendetsa playbook poyesedwa), zotsatirazi zidzachitika:

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

Zotsatira za izi zitha kusinthidwa. Ngati china chake pamndandandawo chachitika kale, chidzalumphidwa. Zomwe zilipo, komanso makonzedwe a zochitikazo, Molecule imasunga m'ndandanda $TMPDIR/molecule/<role>/<scenario>.

Onjezani masitepe ndi ? mutha kufotokozera zomwe mukufuna mumtundu wa ansible-playbook, ndikupanga dzina lafayilo molingana ndi sitepe: prepare.yml/side_effect.yml. Yembekezerani mafayilowa Mamolekyu adzakhala mufoda ya script.

dalaivala

Dalaivala ndi bungwe lomwe zoyeserera zimapangidwira.
Mndandanda wa madalaivala wamba omwe Molekuli ali ndi ma templates okonzeka ndi awa: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Nthawi zambiri, ma templates ndi mafayilo create.yml и destroy.yml mu chikwatu cha script chomwe chimafotokoza kulengedwa ndi kufufutidwa kwa chochitika, motsatana.
Kupatulapo ndi Docker ndi Vagrant, chifukwa kulumikizana ndi ma module awo kumatha kuchitika popanda mafayilo omwe tawatchulawa.

Ndikoyenera kuunikira Dalaivala Wotumidwa, chifukwa ngati agwiritsidwa ntchito m'mafayilo popanga ndi kuchotsa chochitika, ntchito yokhayo ndi makonzedwe a zochitika amafotokozedwa, zina zonse ziyenera kufotokozedwa ndi injiniya.

Woyendetsa wokhazikika ndi Docker.

Tsopano tiyeni tipitirire kuyeserera ndikuganiziranso zina pamenepo.

Kuyamba

Monga "dziko lapansi moni", tiyeni tiyese ntchito yosavuta yoyika nginx. Tiyeni tisankhe docker ngati dalaivala - ndikuganiza kuti ambiri mwa inu mwayiyika (ndipo kumbukirani kuti docker ndiye dalaivala wokhazikika).

Konzekerani virtualenv ndi kukhazikitsa mmenemo molecule:

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

Chotsatira ndikuyambitsa ntchito yatsopano.
Kuyambitsa ntchito yatsopano, komanso script yatsopano, ikuchitika pogwiritsa ntchito lamulo 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

Zinapezeka ngati ansible-udindo. Kupitilira apo, kuyanjana konse ndi CLI Molecule kumapangidwa kuchokera muzu wa gawolo.

Tiyeni tiwone zomwe zili m'ndandanda wa maudindo:

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

1 directory, 6 files

Tiyeni tiwunike config molecule/default/molecule.yml (m'malo mwa chithunzi cha docker chokha):

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

kudalira

Gawoli likufotokoza komwe kumachokera kudalira.

Zotheka kuchita: Mlalang'amba, kuseka, chipolopolo.

Shell ndi chipolopolo cholamula chomwe chimagwiritsidwa ntchito ngati mlalang'amba ndi gilt sizikuphimba zosowa zanu.

Sindikhala pano kwa nthawi yayitali, ndizokwanira kufotokozedwa mkati zolemba.

woyendetsa

Dzina la driver. Yathu ndi docker.

mafuta

Linter ndi yamllint.

Zosankha zothandiza mu gawo ili la kasinthidwe ndikutha kufotokoza fayilo yosinthira yamllint, zosintha zamtsogolo, kapena kuletsa linter:

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

nsanja

Imafotokoza masinthidwe a zochitika.
Pankhani ya docker ngati dalaivala, Molecule imasinthidwa pagawoli, ndipo chilichonse pamndandandawo chimapezeka Dockerfile.j2 ngati kusintha item.

Pankhani ya dalaivala yomwe imafuna create.yml и destroy.yml, gawo likupezeka mwa iwo monga molecule_yml.platforms, ndipo zobwerezabwereza zafotokozedwa kale m'mafayilo awa.

Popeza Molekyulu imapereka chiwongolero cha zochitika kumamodule oyenerera, mndandanda wazomwe zingatheke ziyenera kuyang'aniridwa pamenepo. Kwa docker, mwachitsanzo, module imagwiritsidwa ntchito docker_container_module. Ma module omwe amagwiritsidwa ntchito m'madalaivala ena angapezekemo zolemba.

Komanso zitsanzo za ntchito zosiyanasiyana madalaivala angapezeke m’mayesero a Molekuli weniweni.

Bwezerani apa cent: 7 pa Ubuntu.

wopereka

"Supplier" - bungwe lomwe limayang'anira zochitika. Pankhani ya Molecule, izi ndi zomveka, kuthandizira kwa ena sikunakonzedwe, kotero gawoli likhoza kutchedwa kusinthika kowonjezereka kowonjezereka ndi chenjezo.
Apa mutha kufotokozera zinthu zambiri, ndikuwunikira mfundo zazikulu, m'malingaliro anga:

  • mabuku osewerera: mutha kufotokoza kuti ndi mabuku ati osewerera omwe akuyenera kugwiritsidwa ntchito pamagawo ena.

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

  • options: Zosankha zoyenera komanso zosintha zachilengedwe

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

zochitika

Dzina ndi kufotokozera za script.
Mutha kusintha matrix osasinthika a lamulo lililonse powonjezera kiyi <command>_sequence komanso ngati mtengo wake pofotokoza mndandanda wa masitepe omwe timafunikira.
Tiyerekeze kuti tikufuna kusintha zomwe zikuchitika mukamayendetsa playbook run command: molecule converge

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

fufuzani

Kukhazikitsa dongosolo la mayeso ndi linter kwa izo. Linter yokhazikika ndi testinfra и flake8. Zosankha zomwe zingatheke ndizofanana ndi zomwe zili pamwambapa:

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

Tiyeni tibwerere ku udindo wathu. Tiyeni tisinthe fayilo tasks/main.yml kwa mtundu uwu:

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

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

Ndipo onjezani mayeso ku 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")

Zatha, zomwe zatsala ndikuthamanga (kuchokera pamizu ya gawolo, ndikukumbutseni):

> molecule test

Kutopa kwautali pansi pa spoiler:

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

Udindo wathu wosavuta unayesedwa popanda mavuto.
Ndikoyenera kukumbukira kuti ngati pali mavuto pa ntchito molecule test, ndiye ngati simunasinthe kutsatizana kosasintha, Molecule idzachotsa chitsanzocho.

Malamulo otsatirawa ndi othandiza pakukonza zolakwika:

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

Udindo Ulipo

Kuwonjezera script yatsopano paudindo womwe ulipo ndi kuchokera m'ndandanda wa maudindo ndi malamulo awa:

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

Ngati iyi ndi script yoyamba pagawo, ndiye parameter -s ikhoza kusiyidwa chifukwa ipanga script default.

Pomaliza

Monga mukuonera, Molecule sizovuta kwambiri, ndipo pogwiritsa ntchito ma templates anu, kutumizira script yatsopano kungathe kuchepetsedwa kuti ikhale yosinthika pakupanga ndi kuchotsa mabuku owonetsera. Molekyu imalumikizana mosasunthika ndi machitidwe a CI, omwe amakulolani kuti muwonjezere liwiro lachitukuko pochepetsa nthawi yoyeserera pamanja pamabuku osewerera.

Zikomo chifukwa chakumvetsera. Ngati muli ndi chidziwitso pakuyesa maudindo oyenera, ndipo sizikugwirizana ndi Molekyulu, tiuzeni za izi mu ndemanga!

Source: www.habr.com

Kuwonjezera ndemanga