Litaelo: mokhoa oa ho lekola likarolo tse loketseng le ho tseba ka mathata pele ho tlhahiso

Hello mong le e mong!

Ke sebetsa ke le moenjiniere oa DevOps mosebetsing oa ho behela batho hoteleng. Ostrovok.ru. Sehloohong sena, ke batla ho bua ka phihlelo ea rona ea ho hlahloba likarolo tse utloahalang.

Ho Ostrovok.ru, re sebelisa ansible e le mookameli oa tlhophiso. Haufinyane tjena, re ile ra fihla tlhokahalong ea ho hlahloba likarolo, empa ha e le hantle, ha ho na lisebelisoa tse ngata bakeng sa sena - tse ratoang ka ho fetisisa, mohlomong, ke moralo oa Molek'hule, kahoo re ile ra etsa qeto ea ho e sebelisa. Empa ho ile ha fumaneha hore litokomane tsa hae li khutsitse ka maraba a mangata. Ha rea ​​ka ra fumana buka e nang le lintlha tse lekaneng ka Serussia, kahoo re ile ra etsa qeto ea ho ngola sehlooho sena.

Litaelo: mokhoa oa ho lekola likarolo tse loketseng le ho tseba ka mathata pele ho tlhahiso

Molek'hule

Molek'hule - moralo oa ho thusa ho leka likarolo tse loketseng.

Tlhaloso e nolofalitsoeng: Molek'hule e etsa mohlala sethaleng seo u se hlalosang (leru, mochine oa sebele, setshelo; bakeng sa lintlha tse ling, bona karolo. mokhanni), e tsamaisa karolo ea hau ho eona, ebe e etsa liteko ebe e hlakola mohlala. Haeba u hloleha ho e 'ngoe ea mehato, Molek'hule e tla u tsebisa ka eona.

Joale ho feta.

Taba e seng kae

Nahana ka likarolo tse peli tsa bohlokoa tsa Molek'hule: Scenario le Driver.

Boemo

Sengoliloeng se na le tlhaloso ea hore na ho tla etsoa eng, hokae, joang le ka tatellano efe. Karolo e le 'ngoe e ka ba le mangolo a' maloa, 'me e' ngoe le e 'ngoe ke bukana e tseleng <role>/molecule/<scenario>, e nang le litlhaloso tsa liketso tse hlokahalang bakeng sa tlhahlobo. Script e tlameha ho kenyelletsoa default, e tla etsoa ka bo eona haeba u qala karolo ka Molek'hule. Mabitso a mangolo a latelang a ho uena.

Tatelano ya diketso tsa teko ho script e bitsoa matrix, mme ka ho sa feleng ke:

(Mehato e ngotsoe ?, e tlotsoe ka ho sa feleng haeba e sa hlalosoa ke mosebelisi)

  • lint - matha linters. Ka tloaelo li sebelisoa yamllint и flake8,
  • destroy - ho hlakola maemo a ho qala ha Molek'hule (haeba e teng),
  • dependency? - ho kenya ts'epo e nepahetseng ea karolo e lekiloeng,
  • syntax - ho lekola syntax ea karolo e sebelisoang ansible-playbook --syntax-check,
  • create - etsa mohlala,
  • prepare? - tokisetso ea mohlala; mohlala, hlahloba/kenya python2
  • converge - ho qalisoa ha buka ea ho bapala e ntseng e lekoa,
  • idempotence - ho qala buka ea ho bapala hape bakeng sa tlhahlobo ea boits'oaro,
  • side_effect? - liketso tse sa amaneng ka kotloloho le karolo, empa li hlokahala bakeng sa liteko,
  • verify - etsa liteko tsa sephetho se entsoeng ka ho sebelisa testinfra(ea kamehla) /goss/inspec,
  • cleanup? - (ka liphetolelo tse ncha) - ha re bua ka mokhoa o batlang, "ho hloekisa" lisebelisoa tsa ka ntle tse anngoeng ke Molek'hule,
  • destroy - Ho hlakola mohlala.

Tatelano ena e akaretsa maemo a mangata, empa e ka fetoloa haeba ho hlokahala.

E 'ngoe le e' ngoe ea mehato e ka holimo e ka tsamaisoa ka thoko le molecule <command>. Empa ho lokela ho utloisisoa hore bakeng sa taelo e 'ngoe le e' ngoe e joalo ho ka ba le tatellano ea eona ea liketso, eo u ka e fumanang ka ho e etsa. molecule matrix <command>. Ka mohlala, ha o tsamaisa taelo converge (ho tsamaisa buka ea ho bapala tlas'a teko), liketso tse latelang li tla etsoa:

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

Tatelano ea liketso tsena e ka hlophisoa. Haeba ho hong ho tsoa lenaneng ho se ho entsoe, e tla tloloa. Boemo ba hajoale, hammoho le tlhophiso ea maemo, Molecule e boloka lethathamong $TMPDIR/molecule/<role>/<scenario>.

Kenya mehato le ? o ka hlalosa liketso tse lakatsehang ka mokhoa oa ansible-playbook, 'me u etse lebitso la faele ho latela mohato: prepare.yml/side_effect.yml. Lebella lifaele tsena Molek'hule e tla ba ka har'a foldara ea mongolo.

mokhanni

Mokhanni ke setsi seo ho sona ho etsoang liteko.
Lethathamo la bakhanni ba tloaelehileng bao Molecule e nang le litempele tse lokiselitsoeng ke ka tsela e latelang: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

Maemong a mangata, li-templates ke lifaele create.yml и destroy.yml foldareng ea script e hlalosang popo le ho hlakoloa ha mohlala, ka ho latellana.
Mekhelo ke Docker le Vagrant, kaha litšebelisano le li-module tsa tsona li ka etsahala ntle le lifaele tse boletsoeng ka holimo.

Ho bohlokoa ho totobatsa mokhanni ea filoeng, kaha haeba e sebelisoa lifaeleng bakeng sa ho theha le ho hlakola mohlala, ho hlalosoa mosebetsi feela ka tlhophiso ea maemo, tse ling kaofela li lokela ho hlalosoa ke moenjiniere.

Mokhanni oa kamehla ke Docker.

Joale ha re tsoeleng pele ho itloaetsa le ho nahana ka likarolo tse ling moo.

Ho qala

Joaloka "lefats'e la hello", a re lekeng karolo e bonolo ea ho kenya nginx. Ha re khetheng docker joalo ka mokhanni - ke nahana hore boholo ba lona le e kentse (mme hopola hore docker ke mokhanni ea kamehla).

Ha re lokiseng virtualenv le kenya ho eona molecule:

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

Mohato o latelang ke ho qala karolo e ncha.
Ho qala karolo e ncha, hammoho le mongolo o mocha, ho etsoa ho sebelisoa taelo 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

E ile ea e-ba karolo e tloaelehileng e utloahalang. Ho feta moo, litšebelisano tsohle le limolek'hule tsa CLI li entsoe ho tsoa motsong oa karolo.

Ha re bone hore na ke eng e leng lethathamong la likarolo:

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

1 directory, 6 files

Ha re hlahlobeng config molecule/default/molecule.yml (kenya feela setšoantšo sa docker):

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

ho itshetleha

Karolo ena e hlalosa mohloli oa ho itšetleha.

Likhetho tse ka bang teng: galaxy, sefahleho, khetla.

Shell ke khetla ea taelo e sebelisoang haeba sehlopha sa linaleli le gilt li sa koahele litlhoko tsa hau.

Ha ke na ho lula mona nako e telele, ho lekane ho hlalosoa ho litokomane.

mokhanni

Lebitso la mokganni. Ea rona ke docker.

lente

Letlapa le monate.

Likhetho tse sebetsang karolong ena ea tlhophiso ke bokhoni ba ho hlakisa faele ea tlhophiso bakeng sa yamllint, mefuta e fapaneng ea tikoloho, kapa ho tima linter:

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

Platforms

E hlalosa tlhophiso ea maemo.
Tabeng ea docker e le mokhanni, Molek'hule e phetoa holim'a karolo ena, 'me karolo e' ngoe le e 'ngoe ea lenane e fumaneha ho Dockerfile.j2 joalo ka phetoho item.

Tabeng ea mokhanni e hlokang create.yml и destroy.yml, karolo e fumaneha ho tsona e le molecule_yml.platforms, 'me ho pheta-pheta holim'a eona ho se ho hlalositsoe lifaeleng tsena.

Kaha Molek'hule e fana ka taolo ea maemo ho li-module tse sebetsang, lethathamo la litlhophiso tse ka khonehang le tsona li lokela ho batloa moo. Bakeng sa docker, mohlala, module e sebelisoa docker_container_module. Ke li-module life tse sebelisoang ho bakhanni ba bang li ka fumanoa ho litokomane.

Hape le mehlala ea tšebeliso ea bakhanni ba sa tšoaneng e ka fumanoa litekong tsa Molek'hule ka boeona.

Nka sebaka mona likholo:7 mabapi le Botho.

motlatsi

"Supplier" - mokhatlo o laolang maemo. Tabeng ea Molek'hule, sena sea utloahala, ts'ehetso bakeng sa ba bang ha e reroe, kahoo karolo ena e ka bitsoa tlhophiso e anible e atolositsoeng ka caveat.
Mona o ka hlakisa lintho tse ngata, ke tla totobatsa lintlha tsa bohlokoa, ka maikutlo a ka:

  • libuka tsa ho bapala: o ka hlakisa hore na ke libuka life tsa ho bapala tse lokelang ho sebelisoa methating e itseng.

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

  • connection_options: dikgetho hokela

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

  • khethang ho tsona: Likhetho tse utloahalang le maemo a fapaneng a tikoloho

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

boemo

Lebitso le tlhaloso ea tatelano ea mongolo.
U ka fetola matrix ea kamehla ea taelo efe kapa efe ka ho eketsa senotlolo <command>_sequence le e le boleng ba eona ka ho hlalosa lethathamo la mehato eo re e hlokang.
Ha re re re batla ho fetola tatellano ea liketso ha re tsamaisa taelo ea playbook: molecule converge

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

hlahloba

Ho theha moralo oa liteko le linter ho eona. Linter ea kamehla ke testinfra и flake8. Likhetho tse ka khonehang li tšoana le tse ka holimo:

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

Ha re khutleleng mosebetsing oa rona. Ha re fetole faele tasks/main.yml ho mofuta ona:

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

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

Le ho eketsa liteko ho 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")

E felile, e sala feela ho matha (ho tloha motsong oa karolo, e re ke u hopotse):

> molecule test

Ho qeta nako e telele tlas'a 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

Karolo ea rona e bonolo e ile ea lekoa ntle le mathata.
Ke habohlokoa ho hopola hore haeba ho na le mathata nakong ea mosebetsi molecule test, joale haeba u sa fetole tatellano ea kamehla, Molecule e tla hlakola mohlala.

Litaelo tse latelang li na le thuso bakeng sa ho lokisa liphoso:

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

Karolo e teng

Ho kenyelletsa mongolo o mocha karolong e teng ke ho tsoa bukeng ea karolo ka litaelo tse latelang:

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

Haeba sena e le boemo ba pele ba karolo, ebe paramethara -s e ka tloheloa kaha e tla theha script default.

fihlela qeto e

Joalo ka ha u bona, Molek'hule ha e rarahane haholo, 'me ka ho sebelisa litempele tsa hau, ho fana ka mongolo o mocha ho ka fokotsoa ho fetola mefuta e fapaneng molemong oa ho theha le ho hlakola libuka tsa ho bapala. Molek'hule e hokahana hantle le lits'ebetso tsa CI, tse u lumellang ho eketsa lebelo la nts'etsopele ka ho fokotsa nako ea tlhahlobo ea matsoho ea libuka tsa ho bapala.

Kea leboha ha u mametse. Haeba u na le phihlelo ea ho hlahloba likarolo tse utloahalang, 'me ha e amane le Molek'hule, re bolelle ka eona litlhalosong!

Source: www.habr.com

Eketsa ka tlhaloso