Bind


پیکربندی Bind🔗

در سرویس DNS داخلی (Bind) نیاز داریم که IP دامنه‌ی www.digikala.com به 12.12.12.13 تغییر کند.

سرویس BIND بدین شکل پیکربندی شده است ( فایل ها را از لینک انتهای صفحه دریافت نمایید):

; named.conf
zone "." {
        type hint;
        file "/usr/share/dns/root.hints";
};

zone "localhost" {
        type master;
        file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
        type master;
        file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
        type master;
        file "/etc/bind/db.255";
};

zone "digikala.com" {
        type master;
        file "/etc/bind/digikala.local";
};

options {
        directory "/var/cache/bind";

        forwarders {
                8.8.8.8;
        };

        dnssec-validation auto;

        listen-on-v6 { any; };
};
Plain text
; digikala.local
;
; BIND data file for local loopback interface
;
$TTL    604800
@    IN    SOA    digikala.com. root.digikala.com. (
                  2        ; Serial
             604800        ; Refresh
              86400        ; Retry
            2419200        ; Expire
             604800 )    ; Negative Cache TTL
;
@    IN    NS    digikala.com.
@    IN    A    12.12.12.12
www    IN    A    12.12.12.13
Plain text

شرح مسئله🔗

توجه: در فرمان‌های زیر 127.0.0.1‍ DNS داخلی ست که در docker-compose.yml‍ انتهای این سوال موجود است.

با پیکربندی بالا، دامنه‌ی www.digikala.com به 12.12.12.13 Resolve می شود:

dig +short @127.0.0.1 www.digikala.com
12.12.12.13
Plain text

اما بقیه‌ی زیردامنه‌های دیجیکالا Resolve نمی‌شوند:

dig +short @127.0.0.1 mobile.digikala.com
Plain text

راهی پیدا کنید که بقیه‌ی زیردامنه های دیجیکالا از 8.8.8.8 Resolve بشوند ولی www.digikala.com از DNS داخلی به 12.12.12.13 Resolve بشود.

نحوه‌ی ارسال جواب🔗

تغییرات خودتان را در محیط تست اعمال کنید و فایل zip شده ارسال نمایید. محتویات فایل zip شده می بایست به صورت زیر می باشد (فایل ها را از لینک انتهای صفحه دریافت نمایید):


├── configs
│   ├── db.0
│   ├── db.127
│   ├── db.255
│   ├── db.local
│   ├── digikala.local
│   ├── named.conf
│   └── root.hints
└── docker-compose.yml
Plain text

دریافت فایل های محیط تست🔗

فایل های مورد نیاز تست از طریق این لینک قابل دسترس می باشد.

Helm


اصلاح Helm Chart🔗

برای دیپلوی سرویسی، Helm Chartی نوشته شده است که به واسطه‌ی Image های تعریف شده در values.yml اقدام به اجرای Container های یک Pod می کند.

# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Release.Name }}-deployment"
  labels:
    app: "{{ .Release.Name }}"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: "{{ .Release.Name }}"
  template:
    metadata:
      labels:
        app: "{{ .Release.Name }}"
    spec:
      containers:
        {{ range $image := .Values.images }}
        - name: "{{ .Release.Name }}-{{ $image }}"
          image: "{{ $image }}"
        {{ end }}
Plain text
# values.yml
images:
  - nginx
  - php
Plain text

شرح مسئله🔗

پس از اجرای helm template، خطای زیر رخ می دهد:

$ helm template -n test test ./ --debug
install.go:172: [debug] Original chart version: ""
install.go:189: [debug] CHART PATH: /home/salarmgh/Workspace/quera/helm/test

Error: template: test/templates/deployment.yaml:19:28: executing "test/templates/deployment.yaml" at <.Release.Name>: can't evaluate field Release in type interface {}

helm.go:81: [debug] template: test/templates/deployment.yaml:19:28: executing "test/templates/deployment.yaml" at <.Release.Name>:
can't evaluate field Release in type interface {}
Plain text

با حل مشکل، Deploymentی با یک Pod که متشکل از ۲ کانتینر nginx و php می باشد، باید ساخته شود. بدیهی است که در صورت اضافه کردن image به values.yaml این تعداد افزایش پیدا می کند.

نحوه‌ی ارسال جواب🔗

تغییرات خودتان را بر روی deployment.yaml در محیط تست اعمال کنید و فایل zip شده ارسال نمایید. محتویات فایل zip شده می بایست به صورت زیر می باشد (فایل ها را از لینک انتهای صفحه دریافت نمایید):

.
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   └── NOTES.txt
└── values.yaml
Plain text

نکته: از ورژن ۳ Helm استفاده شود.

نکته: فقط deployment.yaml را تغییر بدهید.

دریافت فایل های محیط تست🔗

فایل های مورد نیاز تست از طریق این لینک قابل دسترس می باشد.

Ansible & MySQL


تعریف کاربران در MySQL🔗

شرح مسئله🔗

برای تعریف کاربران با سطوح دسترسی متفاوت Ansible Playbook بنویسید که بتوان در MySQL کاربران را با سطوح دسترسی متفاوت تعریف کرد.

کاربران بدین شکل در group_vars تعریف شده اند (این Playbook در لینک انتهای صفحه در دسترس است):

---
grants:
  - name: john
    host: "%"
    password: qazwsx
    grants:
      - "testdb5.*:SELECT,INSERT,UPDATE,DELETE,CREATE"
      - "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
      - "testdb3.*:SELECT,INSERT"
      - "testdb2.*:SELECT"

  - name: foo
    host: "%"
    password: 1234
    grants:
      - "testdb2.*:SELECT"
      - "testdb3.*:UPDATE"

  - name: bar
    host: "172.16.16.%"
    password: 1111
    grants:
      - "testdb2.*:SELECT"
      - "testdb1.*:DELETE"
      - "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
      - "testdb3.*:SELECT,INSERT"

  - name: sara
    host: "localhost"
    password: 2222
    grants:
      - "testdb5.*:SELECT,INSERT,UPDATE,DELETE,CREATE"
      - "testdb3.*:SELECT,INSERT"
      - "testdb2.*:SELECT"
      - "testdb4.*:SELECT,INSERT,UPDATE,DELETE"
Plain text

پس از اجرای این Playbook انتظار داریم کاربران طبق این دسترسی ها در MySQL ایجاد شوند.

نکته: در هنگام ارسال، اطلاعات اتصال به MySQL در تسک Ansible را حذف کنید.

تغییرات خود را فقط در فایل roles/grants/tasks/grants.yml اعمال کنید.

نحوه ی اجرای تست:

ansible-playbook site.yml
Plain text

نحوه‌ی ارسال جواب🔗

تغییرات خودتان را در محیط تست در فایل roles/grants/tasks/grants.yml اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید.( فایل ها را از لینک انتهای صفحه دریافت نمایید)

├── docker-compose.yml
├── group_vars
│   └── all
│       ├── main.yml
│       └── mysql.yml
├── inventory
│   └── sample
│       └── hosts.yml
├── roles
│   └── grants
│       ├── handlers
│       ├── tasks
│       │   ├── main.yml
│       │   └── grants.yml
│       └── templates
└── site.yml
Plain text

دریافت فایل های محیط تست🔗

فایل های مورد نیاز تست از طریق این لینک قابل دسترس می باشد.

Bash Scripting


راهنما🔗

اسکریپت‌ها باید ورودی را از فایل داده شده بخوانند بدین شکل:

$ ./script.sh input.txt
Plain text

اسکریپت‌ها باید خروجی را در stdout چاپ کنند.

اسکریپت‌ها باید خروجی خود را مطابق با فرمت داده شده چاپ کنند.

بررسی سلامت سرورها🔗

فایلی شامل چهار ستون از اعداد داده شده است. ستون اول شامل یک حرف انگلیسی است که شناسه هر سرور محسوب می شود. سه ستون دیگر هر کدام شامل شاخص‌های مربوط به سرورها هستند که به ترتیب، شاخص استفاده سی پی یو، رم و شبکه است. هر شاخص در بازه ی بسته‌ی ۰ تا ۱۰۰ قرار دارد.

اسکریپتی بنویسید که تشخصی دهید آیا سرورها سلامت هستند یا نه. مبنای سلامتی هر سرور این است که هر شاخص بزرگ‌تر یا مساوی ۵۰ باشد.

نمونه ورودی🔗

$ cat server_input.txt
A 29 23 50
B 33 39 75
C 79 85 80
D 99 88 69
Plain text

نمونه خروجی🔗

$ server_status.sh server_input.txt
A: Fail
B: Fail
C: Pass
D: Pass
Plain text

شمارش اسامی🔗

اسکریپتی بنویسید که بتواند تعداد اسامی افراد را از متن زیر استخراج کند. دقت کنید اسم‌ها با یک سری جداکننده از هم جدا شده‌اند که جداکننده‌ها به شرح زیر هستند:

  • Tab
  • Space (Blank)
  • Comma ,
  • Bar |
  • Exclamation Mark !
  • Dollar Sign $
  • New Line
  • Backslash \

نمونه ورودی🔗

$ cat server_input.txt
ali    behnam salar,javad|ehsan\mohammad!hossein

hadi 

ali  
mohammadreza
Plain text

نمونه خروجی🔗

$ count_names.sh names_input.txt
Count: 10
Plain text

نحوه‌ی ارسال جواب🔗

تغییرات خودتان را در محیط تست اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید. (فایل ها را از لینک انتهای صفحه دریافت نمایید).

.
├── count_names.sh
├── names_input.txt
├── server_input.txt
└── server_status.sh
Plain text

دریافت فایل های محیط تست🔗

فایل های مورد نیاز تست از طریق این لینک قابل دسترسی می باشد.

Haproxy


پیکربندی HA Proxy🔗

اپلیکیشنی داریم با دو Endpoint:

Endpoint Status Code
/working 200
/not-working 500

اپلیکیشن در حالت Debug Mode اجرا شده است و در صورت وجود خطا Stack Trace کد را نمایش میدهد.

در جلوی اپلیکیشن HA Proxy داریم که به عنوان Reverse Proxy و Load Balancer عمل می کند.

شرح مسئله🔗

نیاز داریم در صورتی که اپلیکیشن خطایی داشت به کاربر صفحه ی 403 نشان بدهیم، اما به برنامه نویسان و DevOps صفحه ی Stack Trace را نشان بدهیم که بتوانند مشکل را پیدا و حل بکند. برنامه نویسان و DevOps یک Header مخصوص برای این کار دارند.

Header Value
staff f34ac726dd7486a22bc0

در صورت وجود این Header در ریکوئست باید به کاربر Stack Trace به صورت کامل نمایش داده شود.

- شرایط تست

تنظیمات HA Proxy به شرح زیر می باشد( فایل ها را از لینک انتهای صفحه دریافت نمایید): ‍‍‍‍‍

# haproxy.cfg

global
    user haproxy
    group haproxy
    daemon

defaults
    log    global
    mode    http
    option    httplog
    option    dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    errorfile 400 /usr/local/etc/haproxy/errors/400.http
    errorfile 403 /usr/local/etc/haproxy/errors/403.http
    errorfile 408 /usr/local/etc/haproxy/errors/408.http
    errorfile 500 /usr/local/etc/haproxy/errors/500.http
    errorfile 502 /usr/local/etc/haproxy/errors/502.http
    errorfile 503 /usr/local/etc/haproxy/errors/503.http
    errorfile 504 /usr/local/etc/haproxy/errors/504.http


frontend http
    bind *:8888
    use_backend app


backend app
    server app1 api:5000
Plain text

نکته: برای نمایش 403 از errorfile 403 در HA Proxy استفاده شود

دستور مربوط به انجام تست:

$ curl localhost:8888/working

It works
Plain text
$ curl localhost:8888/not-working

<html><body><h1>403
Forbidden</h1>

Request
forbidden by administrative rules.

</body></html>
Plain text
$ curl localhost:8888/not-working -H "staff: f34ac726dd7486a22bc0"

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Exception: test // Werkzeug Debugger</title>
    <link rel="stylesheet" href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css"
        type="text/css">
    <!-- We need to make sure this has a favicon so that the debugger does
         not by accident trigger a request to /favicon.ico which might
         change the application state. -->
    <link rel="shortcut icon"
        href="?__debugger__=yes&amp;cmd=resource&amp;f=console.png">
    <script src="?__debugger__=yes&amp;cmd=resource&amp;f=jquery.js"></script>
    <script src="?__debugger__=yes&amp;cmd=resource&amp;f=debugger.js"></script>
.
.
.
Plain text

نکته: ورژن HA Proxy 2.3.4 مورد استفاده است

نحوه ی ارسال جواب🔗

تغییرات خودتان را در محیط تست اعمال کنید و سپس فایل های خود را به صورت zip شده با ساختار زیر ارسال نمایید.( فایل ها را از لینک انتهای صفحه دریافت نمایید)

├── api
│   ├── api.py
│   ├── Dockerfile
│   └── requirements.txt
├── docker-compose.yml
├── haproxy
│   ├── errors
│   │   ├── 400.http
│   │   ├── 403.http
│   │   ├── 408.http
│   │   ├── 500.http
│   │   ├── 502.http
│   │   ├── 503.http
│   │   └── 504.http
│   └── haproxy.cfg
Plain text

نکته: هنگام ارسال در فایل haproxy.cfg بخش backend سرور را تغییر ندهید

server app1 api:5000
Plain text

دریافت فایل های محیط تست🔗

فایل های مورد نیاز تست از طریق این لینک قابل دسترسی می باشد.