Imiyalelo: indlela yokuhlola izindima ezifanelekile futhi uthole ngezinkinga ngaphambi kokukhiqiza

Sawubona wonke umuntu!

Ngisebenza njengonjiniyela we-DevOps wesevisi yokubhukha ihhotela. Ostrovok.ru. Kulesi sihloko ngifuna ukukhuluma ngolwazi lwethu ekuhloleni izindima ezifanelekile.

Ku-Ostrovok.ru sisebenzisa i-ansible njengomphathi wokucushwa. Muva nje sifike esidingweni sokuhlola izindima, kodwa, njengoba kwavela, awekho amathuluzi amaningi alokhu - okuthandwa kakhulu, mhlawumbe, uhlaka lwe-Molecule, ngakho sanquma ukuyisebenzisa. Kodwa kwavela ukuthi imibhalo yakhe ayisho lutho ngezingibe eziningi. Asikwazanga ukuthola umhlahlandlela onemininingwane eyanele ngesiRashiya, ngakho-ke sinqume ukubhala lesi sihloko.

Imiyalelo: indlela yokuhlola izindima ezifanelekile futhi uthole ngezinkinga ngaphambi kokukhiqiza

i-molecule

Ingqamuzana - uhlaka lokusiza ukuhlola izindima ezifanelekile.

Incazelo eyenziwe lula: I-molecule idala isibonelo endaweni oyicacisayo (ifu, umshini obonakalayo, isiqukathi; ukuze uthole imininingwane eyengeziwe, bheka isigaba Driver), yenza indima yakho kuyo, bese iqhuba izivivinyo futhi isuse isenzakalo. Uma kukhona ukwehluleka kwesinye sezinyathelo, i-Molecule izokwazisa ngakho.

Manje okwengeziwe.

A little ofory

Ake sicabangele izinhlangano ezimbili ezibalulekile zeMolekuli: Isimo kanye Nomshayeli.

Isimo

Umbhalo uqukethe incazelo yokuthi yini, kuphi, kanjani futhi ngakuphi ukulandelana okuzokwenziwa. Indima eyodwa ingaba nemibhalo eminingi, futhi ngayinye iyinkomba esendleleni <role>/molecule/<scenario>, equkethe izincazelo zezenzo ezidingekayo ekuhlolweni. Kufanele kube nesikripthi default, ezodalwa ngokuzenzakalela uma uqalisa indima usebenzisa i-Molecule. Amagama emibhalo elandelayo angokubona kwakho.

Ukulandelana kwezenzo zokuhlola kuskripthi kubizwa Matrix, futhi ngokuzenzakalelayo kuba kanje:

(Izinyathelo zimakiwe ?, zeqiwa ngokuzenzakalelayo uma zingashiwongo umsebenzisi)

  • lint - ama-linters asebenzayo. Ngephutha yamllint и flake8,
  • destroy - ukususa izimo ekuqalisweni kokugcina kwe-Molecule (uma kukhona okusele),
  • dependency? - ukufaka ukuncika okufanelekile kwendima ehloliwe,
  • syntax - ukuhlola i-syntax yendima kusetshenziswa ansible-playbook --syntax-check,
  • create - yakha isibonelo,
  • prepare? - ukulungisa isenzakalo; isibonelo ukuhlola/ukufaka i-python2
  • converge - ukwethula incwadi yokudlala ehloliwe,
  • idempotence - qalisa kabusha ibhuku lokudlala ukuze uthole ukuhlolwa kokuphelelwa amandla,
  • side_effect? - izenzo azihlobene ngokuqondile nendima, kodwa ezidingekayo ekuhlolweni,
  • verify - sebenzisa izivivinyo zokucushwa okuwumphumela usebenzisa testinfra(okuzenzakalelayo) /goss/inspec,
  • cleanup? - (ezinguqulweni ezintsha) - uma sikhuluma nje, “ukuhlanza” ingqalasizinda yangaphandle ethintwa yiMolecule,
  • destroy - ukususa isenzakalo.

Lokhu kulandelana kuhlanganisa izimo eziningi, kodwa kungashintshwa uma kunesidingo.

Isinyathelo ngasinye kulezi ezingenhla singaqhutshwa ngokuhlukana kusetshenziswa molecule <command>. Kodwa kufanele uqonde ukuthi ku-cli command ngayinye enjalo kungase kube nokulandelana kwayo kwezenzo, ongakuthola ngokuqalisa. molecule matrix <command>. Isibonelo, uma usebenzisa umyalo converge (usebenzisa incwadi yokudlala ehloliwe) kuzokwenziwa lezi zenzo ezilandelayo:

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

Ukulandelana kwalezi zenzo kungahlelwa. Uma okuthile okuvela ohlwini sekuqediwe kakade, kuzokweqiwa. Isimo samanje, kanye nokuhlelwa kwesibonelo, kugcinwa kumkhombandlela we-Molecule $TMPDIR/molecule/<role>/<scenario>.

Engeza izinyathelo nge ? Ungakwazi ukuchaza izenzo ozifisayo ngefomethi ye-Ansible playbook, futhi wenze igama lefayela ngokwesinyathelo: prepare.yml/side_effect.yml. Lindela ukuthi lawa mafayela e-Molecule abe kufolda yombhalo.

Driver

Umshayeli yibhizinisi lapho izimo zokuhlola zidaleka khona.
Uhlu lwabashayeli abajwayelekile lapho i-Molecule inezifanekiso esenziwe ngomumo yilezi: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Ezimweni eziningi, izifanekiso zingamafayela create.yml и destroy.yml kufolda yombhalo, echaza ukudalwa nokususwa kwesibonelo, ngokulandelana.
Okuhlukile yi-Docker ne-Vagrant, njengoba ukusebenzisana namamojula wabo kungenzeka ngaphandle kwamafayela angenhla.

Kuyafaneleka ukugqamisa umshayeli Othunyelwe, ngoba uma esetshenziswa, umsebenzi kuphela onokucushwa kwesibonelo ochazwa ekudalweni kwesibonelo namafayela okususwa; okunye kufanele kuchazwe unjiniyela.

Umshayeli ozenzakalelayo yi-Docker.

Manje ake siqhubeke sizijwayeze futhi sicabangele ezinye izici lapho.

Ukuqalisa

Njengomhlaba "sawubona" ​​sizohlola indima elula yokufaka i-nginx. Ake sikhethe i-docker njengomshayeli - ngicabanga ukuthi iningi lenu liyifakile (futhi khumbula ukuthi i-docker ingumshayeli ozenzakalelayo).

Lungiselela virtualenv futhi uyifake kuyo molecule:

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

Isinyathelo esilandelayo ukuqala indima entsha.
Ukuqaliswa kwendima entsha, kanye neskripthi esisha, kwenziwa kusetshenziswa umyalo 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

Umphumela uyindima evamile enengqondo. Ngaphezu kwalokho, konke ukusebenzisana ne-Molecules CLI kwenziwa kusukela kumsuka wendima.

Ake sibone ukuthi yini ekuhlu lwezindima:

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

1 directory, 6 files

Ake sibheke i-config molecule/default/molecule.yml (sizoshintsha kuphela isithombe sedokhu):

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

ukuncika

Lesi sigaba sichaza umthombo wokuncika.

Izinketho ezingaba khona: galaxy, icebo, igobolondo.

I-Shell imane iyigobolondo lomyalo ongalisebenzisa uma umthala kanye ne-gilt ingambozi izidingo zakho.

Ngeke ngihlale lapha isikhathi eside, kuchazwe ngokwanele kuyo imibhalo.

Umshayeli

Igama lomshayeli. Kithina lokhu kuyidokodo.

inkenteza

I-Yamllint isetshenziswa njenge-linter.

Izinketho eziwusizo kule ngxenye yokucushwa yikhono lokucacisa ifayela lokumisa le-yamllint, okuguquguqukayo kwemvelo eya phambili, noma ukukhubaza i-linter:

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

Amapulatifomu

Ichaza ukucushwa kwezimo.
Endabeni ye-docker njengomshayeli, i-Molecule iphindaphinda ngaphezu kwalesi sigaba, futhi ingxenye ngayinye yohlu iyatholakala ku- Dockerfile.j2 njengokuguquguquka item.

Endabeni yomshayeli lapho create.yml и destroy.yml, isigaba sitholakala kuzo njenge molecule_yml.platforms, futhi ukuphindwaphindwa kuyo sekuchazwe kakade kulawa mafayela.

Njengoba i-Molecule inikeza ukuphathwa kwesibonelo kumamojula Ansible, kufanele ubheke uhlu lwezilungiselelo ezingenzeka lapho. Ku-Docker, isibonelo, imojula iyasetshenziswa docker_container_module. Imaphi amamojula asetshenziswa kwabanye abashayeli angatholakala kuwo imibhalo.

Ungathola futhi izibonelo zokusebenzisa abashayeli abahlukahlukene ekuhlolweni kwe-Molecule ngokwayo.

Ake sishintshe lapha ikhulu:7 on ubuntu.

umnikezeli

“Umhlinzeki” yibhizinisi eliphethe izimo. Endabeni ye-Molecule, lokhu kuyafaneleka; ukusekelwa kwabanye akuhleliwe, ngakho-ke lesi sigaba singakwazi, ngokubhukha, ukubizwa ngokuthi ukucushwa okunengqondo okunwetshiwe.
Kuningi ongakuveza lapha, kodwa ngizogqamisa amaphuzu asemqoka, ngokubona kwami:

  • izincwadi zokudlala: Ungacacisa ukuthi yiziphi izincwadi zokudlala okufanele zisetshenziswe ezigabeni ezithile.

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

  • uxhumano_izinketho: izinketho xhuma

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • izinketho: Amapharamitha aphathekayo nokuguquguquka kwemvelo

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

simo

Isihloko nencazelo yokulandelana kombhalo.
Ungashintsha i-matrix yesenzo ezenzakalelayo yomyalo ngokungeza ukhiye <command>_sequence futhi njengenani layo, echaza uhlu lwezinyathelo esizidingayo.
Ake sithi sifuna ukushintsha ukulandelana kwezenzo lapho sisebenzisa umyalo wokugijima we-playbook: molecule converge

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

hlola

Ukusetha uhlaka lokuhlolwa kanye ne-linter yalo. Ngokuzenzakalelayo, i-linter isetshenziswa testinfra и flake8. Izinketho ezingenzeka ziyefana nalokhu okungenhla:

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

Asibuyele endimeni yethu. Masihlele ifayela tasks/main.yml kuleli fomu:

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

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

Futhi wengeze izivivinyo 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")

Sekwenziwe, okusele wukugijima (kusuka empandeni yendima, ake ngikukhumbuze):

> molecule test

Ukukhipha amandla okude ngaphansi kwe-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

Indima yethu elula ihlolwe ngaphandle kwezinkinga.
Kuyafaneleka ukukhumbula ukuthi uma izinkinga zivela ngesikhathi sokusebenza molecule test, uma ungashintshanga ukulandelana okujwayelekile, i-Molecule izosusa isenzakalo.

Imiyalo elandelayo iwusizo ekulungiseni iphutha:

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

Indima ekhona

Ukwengeza umbhalo omusha endimeni ekhona kuyenzeka kusukela kuhla lwemibhalo yendima ngemiyalo elandelayo:

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

Uma lesi kuwumbhalo wokuqala endimeni, bese kuba ipharamitha -s ingashiywa njengoba kuzokwakhiwa umbhalo default.

isiphetho

Njengoba ubona, i-Molecule ayiyona inkimbinkimbi kakhulu, futhi uma usebenzisa izifanekiso zakho, unganciphisa ukuthunyelwa kweskripthi esisha ekuhleleni okuguquguqukayo ezincwadini zokudlala zokudala nokususa izimo. I-molecule ihlangana ngaphandle komthungo nezinhlelo ze-CI, ezikuvumela ukuthi ukhuphule ijubane lokuthuthuka ngokunciphisa isikhathi sokuhlola okwenziwa ngesandla sezincwadi zokudlala.

Ngiyabonga ukulalela kwenu. Uma unolwazi lokuhlola izindima ezifanele, futhi azihlobene ne-Molecule, sitshele ngakho kumazwana!

Source: www.habr.com

Engeza amazwana