Ntuziaka: otu esi anwale ọrụ ndị nwere ike ime ma chọpụta nsogbu tupu mmepụta

Ndewo onye ọ bụla!

Ana m arụ ọrụ dị ka onye injinia DevOps na ọrụ ntinye akwụkwọ na họtel. Ostrovok.ru. N'isiokwu a, achọrọ m ikwu maka ahụmịhe anyị na ịnwale ọrụ ndị nwere ike ime.

Na Ostrovok.ru, anyị na-eji ike dị ka onye njikwa nhazi. N'oge na-adịbeghị anya, anyị bịara mkpa iji nwalee ọrụ, ma dị ka ọ tụgharịrị, ọ bụghị ọtụtụ ngwá ọrụ maka nke a - ihe kachasị ewu ewu, ikekwe, bụ usoro Molecule, ya mere anyị kpebiri iji ya. Mana ọ tụgharịrị na akwụkwọ ya gbachiri nkịtị maka ọtụtụ ọnyà. Anyị enweghị ike ịchọta akwụkwọ ntuziaka zuru oke na Russian, ya mere anyị kpebiri ide akụkọ a.

Ntuziaka: otu esi anwale ọrụ ndị nwere ike ime ma chọpụta nsogbu tupu mmepụta

Molekul

Molecule - usoro iji nyere aka nwalee ọrụ ndị nwere ike ime.

Nkọwa dị mfe: Ngwakọta ahụ na-emepụta ihe atụ n'elu ikpo okwu ị ezipụta (igwe ojii, igwe mebere, akpa; maka nkọwa ndị ọzọ, lee ngalaba a. Driver), na-arụ ọrụ gị na ya, wee mee ule wee hichapụ ihe atụ. Ọ bụrụ na ọdịda n'otu n'ime usoro a, Molecule ga-agwa gị gbasara ya.

Ugbu a ọzọ.

A bit nke tiori

Tụlee isi ihe abụọ dị mkpa nke Molecule: Scenario na Driver.

Ihe atụ

Edemede ahụ nwere nkọwa nke ihe, ebe, otu na n'usoro a ga-eme. Otu ọrụ nwere ike inwe ọtụtụ scripts, na nke ọ bụla bụ ndekọ n'akụkụ ụzọ <role>/molecule/<scenario>, nke nwere nkọwa nke omume achọrọ maka ule ahụ. A ga-etinyerịrị edemede default, nke a ga-emepụta na-akpaghị aka ma ọ bụrụ na i jiri Molecule malite ọrụ ahụ. Aha edemede ndị a dịịrị gị.

A na-akpọ usoro omume nnwale na edemede matriks, na ndabara ọ bụ:

(Akara akara nzọụkwụ ?, mafere na ndabara ma ọ bụrụ na onye ọrụ akọwaghị ya)

  • lint - agba agba agba. A na-eji ndabara yamllint и flake8,
  • destroy - ihichapụ ihe atụ na mmalite ikpeazụ nke Molecule (ọ bụrụ na ọ bụla),
  • dependency? - ntinye nke ntụkwasị obi nwere ike ime nke ọrụ a nwalere,
  • syntax - ịlele syntax nke ọrụ na-eji ansible-playbook --syntax-check,
  • create - ịmepụta ihe atụ,
  • prepare? - nkwadebe nke ihe atụ; dịka nlele/wụnye Python2
  • converge - mmalite nke akwụkwọ egwuregwu a na-anwale,
  • idempotence - Malitegharịa akwụkwọ egwu maka ule idempotency,
  • side_effect? - omume anaghị emetụta ọrụ ahụ, mana ọ dị mkpa maka ule,
  • verify - na-agba ọsọ ule nke arụpụta nhazi site na iji testinfra(ndabere) /goss/inspec,
  • cleanup? - (na nsụgharị ọhụrụ) - na-ekwu okwu n'ụzọ siri ike, "na-ehichapụ" akụrụngwa mpụga nke Molecule metụtara,
  • destroy - ihichapụ ihe atụ.

Usoro a na-ekpuchi ọtụtụ ikpe, mana enwere ike gbanwee ma ọ dị mkpa.

Enwere ike iji usoro nke ọ bụla n'elu mee ya iche iche molecule <command>. Mana ekwesiri ighota na maka iwu nke ọ bụla, enwere ike inwe usoro nke ya, nke ị nwere ike ịchọpụta site n'ime ya. molecule matrix <command>. Dịka ọmụmaatụ, mgbe ị na-agba ọsọ iwu converge (na-agba akwụkwọ egwu n'okpuru ule), a ga-eme ihe ndị a:

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

Enwere ike dezie usoro omume ndị a. Ọ bụrụ na emelarị ihe dị na listi ahụ, a ga-awụpụ ya. Ọnọdụ dị ugbu a, yana nhazi nke ihe atụ, Molecule na-echekwa na ndekọ $TMPDIR/molecule/<role>/<scenario>.

Tinye nzọụkwụ na ? ị nwere ike ịkọwa ihe achọrọ n'ụdị akwụkwọ egwu egwu, wee mee aha faịlụ dịka usoro a si dị: prepare.yml/side_effect.yml. Na-atụ anya faịlụ ndị a The molekul ga-adị na script nchekwa nchekwa.

Driver

Onye ọkwọ ụgbọ ala bụ ebe a na-emepụta ihe nlele.
Ndepụta ọkọlọtọ ọkọlọtọ nke Molecule nwere ndebiri dị njikere bụ nke a: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegate.

Ọtụtụ mgbe, ndebiri bụ faịlụ create.yml и destroy.yml na script nchekwa na-akọwa mmepụta na ihichapụ nke ihe atụ, n'otu n'otu.
Mwepụ bụ Docker na Vagrant, ebe mmekọrịta ha na modul ha nwere ike ime na-enweghị faịlụ ndị ahụ e kwuru n'elu.

Ọ bara uru ịkọwapụta onye ọkwọ ụgbọ ala ahọpụtara, ebe ọ bụrụ na a na-eji ya na faịlụ maka ịmepụta na ihichapụ ihe atụ, naanị na-arụ ọrụ na nhazi nke ihe atụ, ndị ọzọ kwesịrị ịkọwa site na engineer.

Ọkwọ ụgbọala na-adịghị mma bụ Docker.

Ugbu a, ka anyị gaa n'ihu na-eme ma tụlee atụmatụ ndị ọzọ ebe ahụ.

-amalite Amalite

Dịka "ụwa ndewo", ka anyị nwalee ọrụ ntinye nginx dị mfe. Anyị ga-ahọrọ docker dị ka onye ọkwọ ụgbọ ala - echere m na ọtụtụ n'ime gị etinyere ya (ma cheta na docker bụ ọkwọ ụgbọ ala ndabara).

Kwadebe virtualenv ma wụnye na ya molecule:

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

Nzọụkwụ ọzọ bụ ibido ọrụ ọhụrụ ahụ.
A na-eme mmalite nke ọrụ ọhụrụ, yana edemede ọhụrụ, site na iji iwu ahụ 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

Ọ tụgharịrị bụrụ ọrụ nwere ike ime. Ọzọkwa, mmekọrịta niile na CLI Molecules sitere na mgbọrọgwụ nke ọrụ ahụ.

Ka anyị hụ ihe dị na ndekọ ndekọ ọrụ:

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

1 directory, 6 files

Ka anyị nyochaa nhazi ahụ molecule/default/molecule.yml (dochie naanị foto 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

adabere

Akụkụ a na-akọwa isi iyi nke ịdabere.

Ekwe omume nhọrọ: galaxy, emetụta, shei.

Shell bụ naanị shei iwu nke a na-eji ma ọ bụrụ na ụyọkọ kpakpando na gilt ekpuchighị mkpa gị.

Agaghị m ebi ebe a ogologo oge, a kọwara ya nke ọma akwụkwọ.

ọkwọ

Aha onye ọkwọ ụgbọ ala. Anyị bụ docker.

linen

Ihe mkpuchi ahụ bụ yamllint.

Nhọrọ bara uru na akụkụ a nke nhazi ahụ bụ ikike ịkọwapụta faịlụ nhazi maka yamllint, mgbanwe mgbanwe gburugburu ebe obibi, ma ọ bụ gbanyụọ linter:

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

nyiwe

Na-akọwa nhazi nke ihe atụ.
N'ihe banyere docker dị ka onye ọkwọ ụgbọ ala, a na-edepụta Molecule n'akụkụ nke a, ma akụkụ ọ bụla nke ndepụta ahụ dị na ya. Dockerfile.j2 dị ka mgbanwe item.

N'ihe banyere onye ọkwọ ụgbọ ala chọrọ create.yml и destroy.yml, ngalaba dị na ha dị ka molecule_yml.platforms, na nkwuputa ya ka akọwaralarị na faịlụ ndị a.

Ebe ọ bụ na Molecule na-enye njikwa ihe atụ na modul nwere ike ime, ndepụta nke ntọala enwere ike ịchọta ebe ahụ. Maka docker, dịka ọmụmaatụ, a na-eji modul docker_container_modul. Kedu ụdị modul eji na ndị ọkwọ ụgbọala ndị ọzọ nwere ike ịhụ na ya akwụkwọ.

Yana ihe atụ nke ojiji nke dị iche iche ọkwọ ụgbọala nwere ike ịhụ na ule nke Molecule n'onwe ya.

Dochie ebe a centị:7 on Ubuntu.

onye na-enye ihe

"Supplier" - ụlọ ọrụ na-ahụ maka ihe atụ. N'ihe banyere Molecule, nke a bụ ihe nwere ike ime, nkwado maka ndị ọzọ adịghị eme atụmatụ, ya mere enwere ike ịkpọ ngalaba a nhazi ogologo oge na caveat.
N'ebe a, ị nwere ike ịkọwapụta ọtụtụ ihe, m ga-eme ka isi ihe ndị ahụ pụta ìhè, n'echiche m:

  • akwụkwọ egwu: ị nwere ike ịkọwapụta akwụkwọ egwuregwu kwesịrị iji n'oge ụfọdụ.

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

  • nhọrọ: Nhọrọ enwere ike na mgbanwe gburugburu ebe obibi

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

dịruru ná njọ

Aha na nkọwa nke usoro edemede.
Ị nwere ike ịgbanwe matriks ihe ndabara nke iwu ọ bụla site na ịgbakwunye igodo <command>_sequence na dị ka uru maka ya site n'ịkọwa ndepụta nke usoro anyị chọrọ.
Ka anyị kwuo na anyị chọrọ ịgbanwe usoro nke omume mgbe anyị na-agba ọsọ iwu egwu egwu: molecule converge

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

onye nyocha

Ịtọlite ​​​​usoro maka ule na linter na ya. Ihe ndabara linter bụ testinfra и flake8. Nhọrọ enwere ike bụ otu ihe dị n'elu:

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

Ka anyị laghachi n'ọrụ anyị. Ka anyị dezie faịlụ tasks/main.yml na nke a:

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

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

Ma tinye ule na 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")

Emechara, ọ ga-adị naanị ịgba ọsọ (site na mgbọrọgwụ nke ọrụ ahụ, ka m chetara gị):

> molecule test

Ogologo iyuzucha n'okpuru ihe mkpofu:

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

A nwalere ọrụ anyị dị mfe n'enweghị nsogbu.
Ọ bara uru icheta na ọ bụrụ na enwere nsogbu n'oge ọrụ ahụ molecule test, mgbe ahụ ọ bụrụ na ị gbanweeghị usoro ndabara, Molecule ga-ehichapụ ihe atụ.

Iwu ndị a bara uru maka nbipu:

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

Ọrụ dị adị

Ịgbakwunye edemede ọhụrụ na ọrụ dị adị bụ site na ndekọ ọrụ jiri iwu ndị a:

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

Ọ bụrụ na nke a bụ ọnọdụ mbụ na ọrụ ahụ, mgbe ahụ oke -s enwere ike ịhapụ ya ka ọ ga-emepụta edemede default.

nkwubi

Dị ka ị na-ahụ, Molecule adịghị mgbagwoju anya, na site na iji ndebiri nke gị, a ga-ebelata edemede ọhụrụ ka ọ na-edezi mgbanwe na ihe atụ ịmepụta na ihichapụ akwụkwọ egwu. Ngwakọta ahụ na-ejikọta n'enweghị nsogbu na usoro CI, nke na-enye gị ohere ịbawanye ọsọ nke mmepe site na ibelata oge maka nyocha akwụkwọ ntuziaka.

Daalụ maka itinye uche gị. Ọ bụrụ na ị nwere ahụmahụ na ịnwale ọrụ ndị nwere ike ime, ma ọ dịghị ihe jikọrọ ya na Molecule, gwa anyị banyere ya na nkwupụta!

isi: www.habr.com

Tinye a comment