መመሪያዎች: ሊሆኑ የሚችሉ ሚናዎችን እንዴት እንደሚፈትሹ እና ከማምረትዎ በፊት ስለ ችግሮች ለማወቅ

ሁሉም ሰው ሰላም!

በሆቴል ቦታ ማስያዝ አገልግሎት ውስጥ እንደ DevOps መሐንዲስ እሰራለሁ። Ostrovok.ru. በዚህ ጽሑፍ ውስጥ, ሊቻሉ የሚችሉ ሚናዎችን በመሞከር ላይ ስላለን ልምድ ማውራት እፈልጋለሁ.

በ Ostrovok.ru, እንደ ውቅር አቀናባሪ አንሲብል እንጠቀማለን. በቅርብ ጊዜ, ሚናዎችን የመሞከር አስፈላጊነት ላይ ደርሰናል, ነገር ግን እንደ ተለወጠ, ለዚህ በጣም ብዙ መሳሪያዎች የሉም - በጣም ታዋቂው, ምናልባትም, የሞለኪውል መዋቅር ነው, ስለዚህ እሱን ለመጠቀም ወሰንን. ነገር ግን የእሱ ሰነድ ስለ ብዙ ወጥመዶች ጸጥ ይላል. በሩሲያኛ በቂ የሆነ ዝርዝር መመሪያ ማግኘት አልቻልንም, ስለዚህ ይህን ጽሑፍ ለመጻፍ ወሰንን.

መመሪያዎች: ሊሆኑ የሚችሉ ሚናዎችን እንዴት እንደሚፈትሹ እና ከማምረትዎ በፊት ስለ ችግሮች ለማወቅ

ሞለኪውል

ሞለኪውል - ሊሆኑ የሚችሉ ሚናዎችን ለመፈተሽ የሚረዳ ማዕቀፍ.

ቀለል ያለ መግለጫ፡- ሞለኪውሉ እርስዎ በገለጹት መድረክ ላይ ምሳሌን ይፈጥራል (ደመና፣ ቨርቹዋል ማሽን፣ መያዣ፤ ለበለጠ ዝርዝሮች ክፍሉን ይመልከቱ) ሾፌር), ሚናዎን በእሱ ላይ ያካሂዳል, ከዚያም ሙከራዎችን ያካሂዳል እና ምሳሌውን ይሰርዛል. በአንደኛው ደረጃ ላይ ውድቀት በሚከሰትበት ጊዜ ሞለኪውል ስለእሱ ያሳውቅዎታል።

አሁን ተጨማሪ።

ጥቂት ንድፈ-ሐሳቦች

የሞለኪውል ሁለት ቁልፍ አካላትን ተመልከት፡ ሲናሪዮ እና ነጂ።

የድራማው

ስክሪፕቱ ምን፣ የት፣ እንዴት እና በምን ቅደም ተከተል እንደሚከናወን መግለጫ ይዟል። አንድ ሚና ብዙ ስክሪፕቶች ሊኖሩት ይችላል፣ እና እያንዳንዱ በመንገዱ ላይ ማውጫ ነው። <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>. ግን ለእያንዳንዱ እንደዚህ ያለ ክሊ-ትእዛዝ የራሱ የድርጊት ቅደም ተከተል ሊኖር እንደሚችል መረዳት አለበት ፣ ይህም በአፈፃፀም ማወቅ ይችላሉ። molecule matrix <command>. ለምሳሌ, ትዕዛዙን ሲያሄዱ converge (የጨዋታ መጽሃፉን በሙከራ ላይ በማሄድ ላይ)፣ የሚከተሉት ድርጊቶች ይከናወናሉ፡

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

የእነዚህ ድርጊቶች ቅደም ተከተል ሊስተካከል ይችላል. ከዝርዝሩ ውስጥ የሆነ ነገር አስቀድሞ ከተሰራ, ይዘላል. የአሁኑ ሁኔታ, እንዲሁም የአብነት አወቃቀሮች, ሞለኪውል በማውጫው ውስጥ ያከማቻል $TMPDIR/molecule/<role>/<scenario>.

እርምጃዎችን በ ? የሚፈለጉትን ድርጊቶች በሚችል-playbook ቅርጸት መግለጽ እና የፋይሉን ስም በደረጃው መሰረት ማድረግ ይችላሉ፡ prepare.yml/side_effect.yml. እነዚህን ፋይሎች ይጠብቁ ሞለኪውል በስክሪፕት ማህደር ውስጥ ይሆናል።

ሾፌር

አሽከርካሪ የፈተና ሁኔታዎች የሚፈጠሩበት አካል ነው።
ሞለኪውል አብነቶች ያሉት የመደበኛ አሽከርካሪዎች ዝርዝር እንደሚከተለው ነው፡- Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

በአብዛኛዎቹ ሁኔታዎች አብነቶች ፋይሎች ናቸው። create.yml и destroy.yml የምሳሌን መፍጠር እና መሰረዝን በሚገልጽ የስክሪፕት አቃፊ ውስጥ።
ልዩዎቹ ዶከር እና ቫግራንት ናቸው፣ ምክንያቱም ከሞጁሎቻቸው ጋር ያሉ ግንኙነቶች ከላይ የተጠቀሱት ፋይሎች ሳይኖሩባቸው ሊከሰቱ ይችላሉ።

የተወከለውን ሾፌር ማጉላት ጠቃሚ ነው ፣ ምክንያቱም ምሳሌን ለመፍጠር እና ለመሰረዝ በፋይሎች ውስጥ ጥቅም ላይ የሚውል ከሆነ ፣ ከአብነት ውቅር ጋር ብቻ ይሰሩ ፣ የተቀረው መሐንዲሱ መገለጽ አለበት።

ነባሪ ሾፌር ዶከር ነው።

አሁን ወደ ልምምድ እንሂድ እና ተጨማሪ ባህሪያትን እዚያ ላይ እናስብ።

ቢያስቆጥርም ገና መጀመሩ ነው

እንደ “ሄሎ ዓለም”፣ ቀላል 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, ሼል.

ሼል ጋላክሲ እና ጊልት ፍላጎቶችዎን የማይሸፍኑ ከሆነ ጥቅም ላይ የሚውል የትእዛዝ ሼል ብቻ ነው።

እዚህ ለረጅም ጊዜ አልኖርም, በ ውስጥ ይገለጻል ሰነድ.

ሾፌር

የአሽከርካሪው ስም. የኛ ዶክተር ነው።

የተልባ እግር

ሊንተር ያምሊንት ነው።

በዚህ የውቅር ክፍል ውስጥ ያሉ ጠቃሚ አማራጮች ለ yamllint የውቅር ፋይልን የመግለጽ፣ የአካባቢ ተለዋዋጮችን የማስተላለፍ ወይም ሊንተርን የማሰናከል ችሎታ ናቸው።

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

የመሣሪያ ስርዓቶች

የሁኔታዎችን ውቅር ይገልጻል።
በዶክተር እንደ ሹፌር ከሆነ፣ ሞለኪውሉ በዚህ ክፍል ላይ ይደጋገማል፣ እና እያንዳንዱ የዝርዝሩ አካል በ ውስጥ ይገኛል። Dockerfile.j2 እንደ ተለዋዋጭ item.

የሚያስፈልገው አሽከርካሪ ሁኔታ ውስጥ create.yml и destroy.yml, ክፍል እንደ በእነርሱ ውስጥ ይገኛል molecule_yml.platforms, እና በእሱ ላይ የተደረጉ ድግግሞሾች ቀድሞውኑ በእነዚህ ፋይሎች ውስጥ ተገልጸዋል.

ሞለኪውሉ ለአብነት ሞጁሎች ቁጥጥር ስለሚያደርግ፣ ሊሆኑ የሚችሉ ቅንጅቶች ዝርዝርም እዚያ መፈለግ አለበት። ለዶክተር, ለምሳሌ, ሞጁሉ ጥቅም ላይ ይውላል ዶከር_ኮንቴይነር_ሞዱል. በሌሎች አሽከርካሪዎች ውስጥ የትኞቹ ሞጁሎች ጥቅም ላይ ይውላሉ ሰነድ.

እንዲሁም የተለያዩ አሽከርካሪዎች አጠቃቀም ምሳሌዎች ሊገኙ ይችላሉ በሞለኪዩል በራሱ ሙከራዎች ውስጥ.

እዚህ ይተኩ ሳንቲም፡7 ላይ ubuntu.

አቅራቢ

"አቅራቢ" - ሁኔታዎችን የሚያስተዳድር አካል. በሞለኪውል ሁኔታ, ይህ ሊቻል የሚችል ነው, ለሌሎች ድጋፍ አይታቀድም, ስለዚህ ይህ ክፍል ከማስጠንቀቂያ ጋር ሊታወቅ የሚችል የተራዘመ ውቅር ተብሎ ሊጠራ ይችላል.
እዚህ ብዙ ነገሮችን መግለጽ ይችላሉ, በእኔ አስተያየት ዋና ዋና ነጥቦቹን አጉላለሁ.

  • Playbooksበተወሰኑ ደረጃዎች የትኞቹ የመጫወቻ ደብተሮች ጥቅም ላይ መዋል እንዳለባቸው መግለጽ ይችላሉ.

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 ስርዓቶች ጋር ይዋሃዳል, ይህም የመጫወቻ መጽሐፍትን በእጅ መሞከር ጊዜን በመቀነስ የእድገት ፍጥነት እንዲጨምሩ ያስችልዎታል.

ለሰጠህው አትኩሮት እናመሰግናለን. ሊሆኑ የሚችሉ ሚናዎችን የመሞከር ልምድ ካሎት እና ከሞለኪውል ጋር ያልተዛመደ ከሆነ በአስተያየቶቹ ውስጥ ስለ እሱ ይንገሩን!

ምንጭ: hab.com

አስተያየት ያክሉ