ہدایات: جوابدہ کرداروں کی جانچ کیسے کریں اور پیداوار سے پہلے مسائل کے بارے میں معلوم کریں۔

ہر کسی کو خوش!

میں ہوٹل بکنگ سروس میں ڈی او اوپس انجینئر کے طور پر کام کرتا ہوں۔ 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>.

کے ساتھ اقدامات شامل کریں۔ ? آپ مطلوبہ اعمال کو جوابی پلے بک فارمیٹ میں بیان کر سکتے ہیں، اور فائل کا نام مرحلہ کے مطابق بنا سکتے ہیں: prepare.yml/side_effect.yml. ان فائلوں کی توقع کریں مالیکیول اسکرپٹ فولڈر میں ہوگا۔

ڈرائیور

ڈرائیور ایک ایسی ہستی ہے جہاں ٹیسٹ کے نمونے بنائے جاتے ہیں۔
معیاری ڈرائیوروں کی فہرست جن کے لیے مالیکیول کے ٹیمپلیٹس تیار ہیں درج ذیل ہیں: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

زیادہ تر معاملات میں، ٹیمپلیٹس فائلیں ہیں۔ create.yml и destroy.yml اسکرپٹ فولڈر میں جو بالترتیب کسی مثال کی تخلیق اور حذف کرنے کی وضاحت کرتا ہے۔
مستثنیات Docker اور Vagrant ہیں، کیونکہ ان کے ماڈیولز کے ساتھ تعامل مذکورہ فائلوں کے بغیر ہو سکتا ہے۔

یہ ڈیلیگیٹڈ ڈرائیور کو نمایاں کرنے کے قابل ہے، کیونکہ اگر اسے استعمال کیا جاتا ہے تو، مثال کی تشکیل اور فائلوں کو حذف کرنے میں صرف مثال کی ترتیب کے ساتھ کام بیان کیا جاتا ہے؛ باقی انجینئر کو بیان کرنا چاہئے۔

پہلے سے طے شدہ ڈرائیور ڈوکر ہے۔

اب آئیے مشق کی طرف بڑھیں اور وہاں مزید خصوصیات پر غور کریں۔

شروع کریں

"ہیلو ورلڈ" کے طور پر، آئیے ایک سادہ 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

انحصار

یہ حصہ انحصار کے ماخذ کی وضاحت کرتا ہے۔

ممکنہ اختیارات: کہکشاں, لاگو ہوتا ہے، شیل.

شیل صرف ایک کمانڈ شیل ہے جو کہ کہکشاں اور گلٹ آپ کی ضروریات کو پورا نہ کرنے کی صورت میں استعمال ہوتا ہے۔

میں یہاں زیادہ دیر نہیں رہوں گا، اس کا بیان کافی ہے۔ دستاویزات.

ڈرائیور

ڈرائیور کا نام۔ ہمارا ڈوکر ہے۔

لنٹ

لنٹر یاملنٹ ہے۔

کنفیگریشن کے اس حصے میں مفید آپشنز یاملنٹ، فارورڈ انوائرمنٹ ویری ایبلز، یا لنٹر کو غیر فعال کرنے کے لیے کنفیگریشن فائل کی وضاحت کرنے کی صلاحیت ہیں:

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

پلیٹ فارم

مثالوں کی ترتیب کو بیان کرتا ہے۔
ایک ڈرائیور کے طور پر ڈاکر کے معاملے میں، مالیکیول کو اس حصے پر دہرایا جاتا ہے، اور فہرست کا ہر عنصر اس میں دستیاب ہے۔ Dockerfile.j2 ایک متغیر کے طور پر item.

ڈرائیور کی صورت میں جس کی ضرورت ہے۔ create.yml и destroy.yml، سیکشن ان میں بطور دستیاب ہے۔ molecule_yml.platforms، اور اس پر تکرار پہلے ہی ان فائلوں میں بیان کی گئی ہے۔

چونکہ مالیکیول جوابدہ ماڈیولز کو مثالوں کا کنٹرول فراہم کرتا ہے، اس لیے ممکنہ ترتیبات کی فہرست بھی وہاں تلاش کی جانی چاہیے۔ ڈوکر کے لیے، مثال کے طور پر، ماڈیول استعمال کیا جاتا ہے۔ docker_container_module. دوسرے ڈرائیوروں میں کون سے ماڈیولز استعمال ہوتے ہیں اس میں پایا جا سکتا ہے۔ دستاویزات.

اس کے ساتھ ساتھ مختلف ڈرائیوروں کے استعمال کی مثالیں بھی مل سکتی ہیں۔ خود مالیکیول کے ٹیسٹ میں.

یہاں بدل دیں۔ سینٹوس:7 پر اوبنٹو.

رزق دینے والا

"سپلائر" - ایک ایسا ادارہ جو مثالوں کا انتظام کرتا ہے۔ مالیکیول کے معاملے میں، یہ قابل قبول ہے، دوسروں کے لیے سپورٹ کا منصوبہ نہیں بنایا گیا ہے، اس لیے اس سیکشن کو انتباہ کے ساتھ قابل قبول توسیعی ترتیب کہا جا سکتا ہے۔
یہاں آپ بہت سی چیزوں کی وضاحت کر سکتے ہیں، میں اپنی رائے میں اہم نکات پر روشنی ڈالوں گا:

  • پلے بکس: آپ یہ بتا سکتے ہیں کہ مخصوص مراحل میں کون سی پلے بکس استعمال کی جانی چاہئیں۔

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 سسٹمز کے ساتھ ضم ہوجاتا ہے، جو آپ کو پلے بکس کی دستی جانچ کے لیے وقت کو کم کرکے ترقی کی رفتار کو بڑھانے کی اجازت دیتا ہے۔

آپکی توجہ کا شکریہ. اگر آپ کو جوابدہ کرداروں کی جانچ کرنے کا تجربہ ہے، اور اس کا تعلق مالیکیول سے نہیں ہے، تو تبصرے میں ہمیں اس کے بارے میں بتائیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں