راه اندازی HAProxy برای لودبالانسینگ ترافیک وب با Ansible

در این مقاله قرار هست که یک سناریو لودبالانسینگ ترافیک وب با HAProxy پیاده شود و وظیفه راه اندازی صفر تا صد آن به صورت اتوماتیک با Ansible خواهد بود. مخاطب این مقاله افرادی هستند که با داکر، دستورات و محیط گنو/لینوکس و مفاهیم شبکه آشنایی دارند. در این سناریو ترافیک وب یک وب اپلیکشن ساده فلسک که مشابه آن را قبلا در اینجا در داکر قرار دادیم، لودبالانس خواهد شد. لودبالانس به معنی توزیع بار ترافیک بین سرورها با الگوریتم دلخواه است که در اینجا Round-Robin خواهد بود. در ابتدا توضیحات دقیق درباره سناریو داده خواهد شد و پس از آن به راه اندازی محیط آزمایشگاهی (Lab) برای سناریو می پردازیم. در ادامه درباره ساختار Playbook ها توضیح داده میشود و نهایتا با استفاده از یک Playbook برای Ansible تمام سناریو پیاده سازی خواهد شد.



سناریو

در این سناریو سه سرور وجود دارد که یکی از آنها نقش لودبالانسر اصلی را به عهده دارد و دو سرور دیگر به شکلی مشابه هر کدام دو سرویس وب اپلیکیشن فلسک را همراه با یک لودبالانسر داخلی اجرا میکنند. Ansible بر روی یک ماشین لینوکسی که میتواند سیستم شخصی یا ماشین مجازی باشد، راه اندازی میشود و با ارتباط SSH وظیفه مدیریت سرور ها و راه اندازی سناریو را بر عهده دارد.

سناریو به شکل زیر میباشد:



راه اندازی محیط آزمایشگاهی

برای راه اندازی محیط آزماشیگاهی (Lab) سناریو از داکر کامپوز استفاده میکنیم؛ پس بایستی داکر و داکر کامپوز بر روی ماشین مورد نظر نصب باشد و پس از آن نصب و راه اندازی انسیبل توضیح داده خواهد شد.

داکر کامپوز از یک فایل کانفیگ YAML برای راه اندازی کانتینر ها استفاده میکند و فایل کانفیگ مشابه زیر میباشد که در ادامه درباره آن توضیح داده خواهد شد:

version: '3.8'

services:
  HA_proxy_Loadbalancer:
    build:
      context: .
      dockerfile: ubuntu_with_sshd.Dockerfile
    image: ubuntu_haproxy:latest
    hostname: HAproxy
    ports:
      - '22:22'
      - '8080:80'

  flask_server_1:
    image: ubuntu_haproxy:latest
    hostname: server_1
    ports:
      - '23:22'

  flask_server_2:
    image: ubuntu_haproxy:latest
    hostname: server_2
    ports:
      - '24:22'
  1. در اینجا نسخه فایل داکر کامپوز مشخص شده است.
  2. خالی
  3. مشخص میشود که چه کانتینر هایی قرار است راه اندازی شوند.
  4. نام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.
  5. گفته میشود ایمیجی که قرار است کانتینر از روی آن ساخته شود بایستی با مشخصات بعدی ساخته شود.
  6. مسیر داکر فایل مورد نظر برای ساخت ایمیج داده شده است که همان مسیری است که فایل کامپوز قرار دارد.
  7. نام داکر فایل داده شده است.
  8. گفته میشود داکر ایمیج ساخته شده در مرحله قبل با چه نامی ذخیره شود.
  9. هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.
  10. گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.
  11. گفته میشود پورت ۲۲ ماشین به پورت ۲۲ کانتینر فوروارد شود.
  12. گفته میشود پورت ۸۰۸۰ ماشین به پورت ۸۰ کانتینر فوروارد شود.
  13. خالی
  14. نام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.
  15. گفته میشود که کانتیتر از روی چه ایمیجی ساخته شود که در اینجا همان ایمجی است که برای کانتینر لودبالانسر ساخته شده است.
  16. هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.
  17. گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.
  18. گفته میشود پورت ۲۳ ماشین به پورت ۲۲ کانتینر فوروارد شود.
  19. خالی
  20. نام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.
  21. گفته میشود که کانتیتر از روی چه ایمیجی ساخته شود که در اینجا همان ایمجی است که برای کانتینر لودبالانسر ساخته شده است.
  22. هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.
  23. گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.
  24. گفته میشود پورت ۲۴ ماشین به پورت ۲۲ کانتینر فوروارد شود.

نکته مهم: فاصله ها در این فایل بسیار مهم میباشد و بایستی حتما سلسله مراتب در نوشتن این فایل رعایت شود.

نکته مهم: داکر دارای یک DNS سرور داخلی در هر شبکه خود هست و تمام کانتیر هایی که در یک شبکه قرار دارند تنها با نام میتوانند با یکدیگر ارتباط برقرار کنند. با استفاده از همین قابلیت در HAProxy در سرور لودبالانسر میتواند با سرور های Backend با نام ارتباط برقرار کند.

میتوانید برای دریافت فایل کانفیگ داکر کامپوز و راه اندازی سرور ها از دستورات زیر استفاده کنید:

git clone https://github.com/amirhne/flask-haproxy-scenario-lab.git
cd flask-haproxy-scenario-lab/
docker-compose up


انسیبل در حال حاضر فقط بر روی سیستم عامل گنو/لینوکس قابل نصب میباشد پس فرض بر این است که یا سیستم عامل ماشین شما گنو/لینوکس است یا ماشین مجازی با سیستم عامل گنو/لینوکس دارید که به داکر دسترسی شبکه دارد.

برای نصب انسیبل بر روی توزیع های بر پایه Debian از دستورات زیر استفاده کنید:

sudo apt update
sudo apt install ansible

برای نصب انسیبل بر روی توزیع های بر پایه RedHat از دستورات زیر استفاده کنید:

sudo yum -y install epel-repo
sudo yum -y update
sudo yum -y install ansible


عملکرد انسیبل برای مدیریت نود های هدف به صورت Agentless میباشد و فقط برای کنترل نود ها نیازمند دسترسی و ارتباط SSH است. برای سهولت و امنیت بیشتر بهتر است که احراز هویت با نود های هدف با کلید عمومی و خصوصی انجام شود که برای هر بار اتصال نیازمند وارد کردن پسورد نباشیم.

در ابتدا برای اینکار با دستور زیر در ماشین یا ماشین مجازی که انسیبل بر روی آن نصب شده است یک کلید میسازیم:

ssh-keygen

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

و سپس با زدن دستورات زیر در ماشین یا ماشین مجازی که انسیبل بر روی آن نصب است، کلید عمومی را بر روی سرور ها قرار میدهیم.

ssh-copy-id ansible@127.0.0.1 -p 22
ssh-copy-id ansible@127.0.0.1 -p 23
ssh-copy-id ansible@127.0.0.1 -p 24

در صورتی که از ماشین مجازی استفاده میکنید به جای ای پی 127.0.0.1، ای پی ماشینی را بزنید که داکر و کانتینر ها در آن قرار دارند.

با انجام مراحل بالا که شامل راه اندازی سرور ها در داکر، نصب و تنظیم انسیل بر روی نود کنترل کننده است؛ محیط مورد نظر برای پیاده سازی سناریو آماده شده است.



ساختار پلی بوک

ساختار پلی بوک به شکلی است که در ابتدا هاست هایی که قرار است عملیات روی آنها انجام شود مشخص میشود و پس از آن با مشخص کردن المان هایی مثل متغیر ها و دسترسی اجرای دستورات،‌ لیستی از کار ها که با نام task مشخص میشود، شکل میگیرد. نوعی از task هم به نام handler وجود دارد که فقط در صورت خوانده شدن توسط یک task و اعمال تغییرات توسط آن، اجرا میشود که در ادامه نمونه آن را مشاهده میکنید.

در زیر یک نمونه ساده از یک پلی بوک آورده شده است و در ادامه درباره آن توضیح داده میشود:

---
- hosts: machines
  become: yes
  vars:
    - test1: 1
    - test2: apache was not installed
  tasks:
    - name: First Test Task
      shell: echo 'the test1 var is {{ test1 }}' > /home/test.txt
    - name: Second Task
      apt:
        name: apache2
        update_cache: yes
        state: latest
      notify: A Handler is Called

  handlers:
    - name: A Handler is Called
      shell: cat '{{ test2 }}' > /home/apache_status.txt
  1. مشخص میشود که این یک فایل کانفیگ YAML میباشد.
  2. گفته میشود که قرار است بر روی چه نود یا نود هایی عملیات ها پیش رو انجام شود. این گروه از نود ها یا یک نود توسط یک فایل inventory مشخص میشوند که در ادامه مقاله نمومه آن آورده شده است. همچنین میتوان آنها در فایل etc/ansible/hosts/ مشخص کرد.
  3. گفته میشود که تمامی تسک ها با دسترسی روت انجام شوند.
  4. گفته میشود که یک سری متغییر در این پلی بوک وجود دارد.
  5. یک متغییر تعریف میشود.
  6. یک متغییر تعریف میشود.
  7. میشخص میشود که قرار است مجموعه ای از کار ها در ادامه انجام شود.
  8. یک تسک جدید با نام آن مشخص میشود.
  9. با استفاده از ماژول shell در نود هدف دستور داده شده را انجام شود. ماژول شل برای برای اجرای دستور در محیط دستوری گنو/لینوکس استفاده میشود. همانطور که مشاهده میکنید استفاده از متغییر در محیط انسیبل به شکل {{ var_name }} میباشد.
  10. یک تسک جدید با نام آن مشخص میشود.
  11. گفته میشود که از ماژول apt استفاده شود و کارهای آن در ادامه مشخص میشود. ماژول apt برای مدیریت پکیج ها در سیستم عامل های بر پایه دبین استفاده میشود.
  12. نام پیکیج مشخص میشود.
  13. گفته میشود که لیست ریپازیتوری های سیستم عامل بروز شود.
  14. گفته میشود که پکیج نام برده بایستی آخرین نسخه آن نصب باشد.
  15. یک handler با نام مشخص فراخوانی میشود که در صورت اجرا این تسک و ایجاد تغییر در نود هدف این handler اجرا میشود.
  16. خالی
  17. گفته میشود که لیست هندلرها در ادامه داده شده است.
  18. یک هندلر جدید با نام آن مشخص میشود.
  19. گفته میشود در صورت اجرای این هندلر با ماژول شل دستور مورد نظر اجرا شود.


با توضیحات ارایه شده مشخص شده است که ساختار یک پلی بوک چگونه میباشد ولی رایج است که برای پیاده سازی نقش ها در پلی بوک از یک ساختار پوشه ای به نام roles که در آن تمامی قسمت های مختلف یک پلی بوک در مسیر های جداگانه قرار داده میشوند، استفاده میشود. به این صورت که هر نقش یا role شامل یکسری task,vars, handlers و... مشخص میباشد که در یک ساختار پوشه قرار میگیرند.

در ادامه یک پلی بوک با نام site.yml با استفاده از roles اورده شده است که توضیحات درباره آن داده خواهد شد:

---
- hosts: machines
  become: yes
  roles:
  - webserver
  1. مشخص میشود که این فایل کانفیگ YAML هست.
  2. گفته میشود که قرار است بر روی چه نود یا نود هایی عملیات ها پیش رو انجام شود.
  3. گفته میشود که تمامی تسک ها با دسترسی روت انجام شوند.
  4. گفته میشود که قرار است که چه نقش هایی بر روی نود یا نود های هدف پیاده سازی شود.

همانطور که مشاهده میکنید پلی بوک اصلی به شکل فوق العاده ای ساده و خوانا شده است و فقط کافیست در مسیر همین پلی بوک یک پوشه با نام roles با ساختاری که در ادامه توضیح داده شده است پیاده سازی شود.

site.yml
roles/
    webserver/
        tasks/
            main.yml
        handlers/
            main.yml
        vars/
            main.yml

در این ساختار پوشه ای فقط کافی است که کدهای زیر هر قسمت اصلی از پلی بوک مانند tasks یا handlers در فایل main.yml هر پوشه با نام همان قسمت قرار داده شود و در پلی بوک اصلی فقط کافیست نام آن نقش که همان نام پوشه (در بالا درشت نوشته شده است) است، ذکر شود.

حال که ساختار پلی بوک و roles توضیح داده شد سراغ پیاده سازی سناریو مورد نظرمان توسط انسیبل میرویم.



پیاده سازی سناریو

برای پیاده سازی سناریو مورد نظرمان از یک پلی بوک استفاده خواهد شد که در آن از ساختار roles استفاده شده است. وظیفه این پلی بوک تنظیم یک سرور به عنوان لودبالانسر اصلی و دو سرور دیگر به عنوان سرور فلسک است. پروژه فلسک مورد استفاده قبلا در اینجا در داکر قرار داده شده است و در این سناریو با فرمی دیگر مورد استفاده قرار گرفته است.

لودبالانسر HAProxy برای تنظیمات خود از یک فایل کانفیگ در مسیر etc/haproxy/haproxy.cfg/ استفاده میکند.فایل کانفیگی که برای سرور لودبالانسر استفاده میشود مشابه زیر میباشد که در ادامه درباره آن توضیح داده میشود:

frontend loadbalancer
	bind	*:80
	option	forwardfor
	default_backend	flask_servers

backend	flask_servers
	balance	roundrobin
	server	server_1	flask_server_1:80	check
	server	server_2	flask_server_2:80	check
	option	httpchk
  1. مشخص میشود که سرور فرانت اند که وظیفه اصلی لودبالانسینگ را دارد در ادامه چه مشخصاتی خواهد داشت و نام آن مشخص میشود.
  2. گفته میشود که بر روی تمام ای پی های سرور و پورت ۸۰ ترافیک قبول شود.
  3. گفته میشود که ترافیک به سرور ها که بعدا در بک اند مشخص میشود، فروارد شود.
  4. نام سرور های بک اند مشخص میشود که در ادامه تعریف خواهد شد.
  5. خالی
  6. مشخص میشود که مشخصات سرور های بک اند چه خواهد بود و نام آن ها برای استفاده مشخص میشود. این دقیقا همان نام ای است که در قسمت فرانت اند در خط ۴ استفاده شده است.
  7. الگوریتم لودبالانسینگ round-robin مشخص میشود.
  8. یک سرور با نام server_1 با ادرس مشخص و پورت ۸۰ تعریف شده است، این آدرس دقیقا همان نامی است که هنگام ایجاد کانتینر با داکر کامپوز استفاده شده است و در ادامه گفته میشود که سرور را برای در دسترس بودن برای هر مدت کوتاه با برقراری یک کانکشن tcp چک کند.
  9. یک سروربا نام server_2 با ادرس مشخص و پورت ۸۰ تعریف شده است، این آدرس دقیقا همان نامی است که هنگام ایجاد کانتینر با داکر کامپوز استفاده شده است و در ادامه گفته میشود که سرور را برای در دسترس بودن برای هر مدت کوتاه با برقراری یک کانکشن tcp چک کند.
  10. گفته میشود که با دادن درخواست http بالا بودن سرور را برای هر مدت کوتاه چک کند که در صورت دادن پیغام خطا مانند ۵۰۰ دیکر از لیست خارج شود.


برای HAProxy هر کدام از سرور های فلسک که عمکرد داخلی دارد از یک فایل کانفیگ دقیقا مشابه همان که برای سرور لودبالانسر استفاده شده است، استفاده میکنیم ولی با یک تغییر کوچک که در ادامه درباره آن توضیح داده خواهد شد:

frontend loadbalancer
	bind	*:80
	option	forwardfor
	default_backend	flask_services

backend	flask_services
	balance	roundrobin
	server	flask_1	127.0.0.1:{{ flask_1_port }}	check
	server	flask_2	127.0.0.1:{{ flask_2_port }}	check
	option	httpchk

۷ و ۸. در اینجا از ای پی لوکال استفاده شده است و به جای پورت از یک متغییر در پلی بوک استفاده شده است که در هنگام کپی کردن بر روی سرور تبدیل به پورت دلخواه ما میشود که در اینجا ۳۰۰۰ و ۳۰۰۱ میباشد.


برای پیاده سازی سرویس فلسک از نمونه فایل زیر استفاده شده است که در ادامه درباره آن توضیح داده شده است:

from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
    return render_template('index.html')
if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0', port={{ flask_1_port }})

در خط آخر همانطور که مشاهده میکنید مجددا از متغییر پلی بوک برای پیاده سازی و مشخص کردن پورت وب اپلیکیشن استفاده شده است.

همچنین کد صفحه وبی که به کاربر نمایش داده میشود به شکل زیر میباشد:

<!DOCTYPE html>
<html lang=&quoten&quot>
<head>
<meta charset=&quotUTF-8&quot>
    <title> Hello World! </title>
</head>
<body>
<center>
<h2>This Message is shown from</h2> <h1>{{ ansible_hostname }}</h1> <h2>that is running flask on port</h2> <h1>{{ flask_1_port }}</h1>
</center>
</body>
</html>

در قسمت تگ h1 میبینید که مجددا از متغییر پلی بوک برای نمایش پورت فلسک و نام هاست به کاربر استفاده شده است.

نکته: استفاده از متغییر این امکان را به ما میدهد که به صورت همزمان فقط با یک تغییر هم امکان تغییر در کد برنامه فلسک و هم تغییر در فایل کانفگیگ HAProxy را داشته باشیم. همچنین بتوانیم با استفاده از متغییر هایی که توسط خود انسیل ساخته مانند : ansible_hostname که به ازای هر نود ساخته میشود و متفاوت میباشد، بتوانیم صفحه نمایش داده شده به کاربر را برای هر سرور به صورت اتوماتیک متمایز کنیم.


پلی بوک اصلی که برای پیاده سازی سناریو نوشته شده است از ساختار roles پیروی میکند. در سناریو ما دو نقش وجود که شامل نقش لودبالانسر و نقش سرور فلسک میباشد.

پلی بوک اصلی با نام site.yml مشابه زیر میباشد:

---
- hosts: loadbalancer
  become: yes
  roles:
    - loadbalancer
- hosts: flask_servers
  become: yes
  roles:
    - flask server with two service

درباره ساختار پلی بوک در قسمت قبل توضیح داده شد است و این پلی بود دارای دو نقش loadbalancer و flask server with two service میباشد که به ازا هر کدام یک پوشه با نام های مشابه در پوشه roles قرار دارد.

ساختار پروژه پلی بوک برای این سناریو به شکل زیر میباشد و درباره آنها توضیح داد خواهد شد:

site.yml
inventory
roles/
    flask server with two service/
        tasks/
            main.yml
        handlers/
            main.yml
        templates/
            flask_1/
                hello.py.j2
                index.html.j2
            flask_2/
                hello.py.j2
                index.html.j2
            haproxy.cfg.j2
        vars/
            main.yml
    loadbalancer/
        files/
            haproxy.cfg
        tasks/
            main.yml
        handlers/
            main.yml
  1. فایل اصلی پلی بوک
  2. یک فایل میباشد که شامل اطلاعات اتصال به نود های هدف و نام گذاری آن میباشد. این نام گذاری همان نام گذاری مورد استفاده در قسمت hosts پلی بوک میباشد.
  3. پوشه نقش ها
  4. پوشه نقش flask server with two service
  5. پوشه تسک های نقش سرور فلسک
  6. فایل تسک های نقش سرور فلسک
  7. پوشه هندلر های نقش سرور فلسک
  8. فایل هندلر های نقش سرور فلسک
  9. پوشه فایل هایی که در آنها از متغیر های پلی بوک استفاده کردیم و قرار است به روی سرورهایی با نقش سرور فلسک انتقال پیدا کنند.
  10. پوشه فایل های سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.
  11. فایل پایتون سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.
  12. فایل html سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.
  13. پوشه فایل های سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.
  14. فایل پایتون سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.
  15. فایل html سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.
  16. فایل کانفیگ HAProxy سرورهایی که نقش سرور فلسک را دارند.
  17. پوشه متغییر های نقش سرور فلسک
  18. فایل متغییر های نقش سرور فلسک
  19. پوشه نقش loadbalancer
  20. پوشه فایل هایی که قرار است به سرور نقش لودبالانسر انتقال پیدا کند.
  21. فایل کانفیگ HAProxy سرور لودبالانسر که در آن از متغییر استفاده نشده است.
  22. پوشه تسک های نقش سرور لودبالانسر
  23. فایل تسک های نقش سرور لودبالانسر
  24. پوشه هندلر های نقش سرور لودبالانسر
  25. فایل هندلر های نقش سرور لودبالانسر


فایل roles/loadbanalcer/tasks/main.yml که شامل تسک های نقش لودبالانسر میباشد، مشابه زیر است:

---
- name: Installing HAproxy on Loadbalance
  apt: 
    name: haproxy
    update_cache: yes
    state: latest

- name: Configure the HAproxy on Loadbalancer
  copy:
    src: haproxy.cfg
    dest: /etc/haproxy/haproxy.cfg
    mode: '755'
  notify: Restart HAproxy

توضیحات: درباره اولین تسک در قسمت ساختار پلی بوک توضیح داده شده است و در دومین تسک با استفاده از ماژول copy فایل کافیگ از مسیر files نقش loadbalancer بر روی مسیر فایل کانفیگ HAProxy سرور کپی میشود و پس از اعمال تغییرات درخواست اجرای هندلر Restart HAproxy را میدهد.


فایل های

roles/loadbanalcer/handlers/main.yml

roles/flask server with two service/handlers/main.yml

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

---
- name: Restart HAproxy
  service:
    name: haproxy
    state: restarted

توضیحات: با استفاده از ماژول سرویس درخواست ری استارت سرویس HAProxy داده میشود.


فایل roles/flask server with two service/tasks/main.yml که شامل تسک های نقش فلسک سرور میباشد،‌ مشابه زیر است:

---
- name: Installing HAproxy and Python3 on Flask Servers
  apt: 
    name:
      - haproxy
      - python3
      - python3-pip
    update_cache: yes
    state: latest

- name: Configure the HAproxy on Flask Servers
  template:
    src: haproxy.cfg.j2
    dest: /etc/haproxy/haproxy.cfg
    mode: '755'
  notify: Restart HAproxy

- name: Installing flask
  shell: pip3 install flask

- name: Create Folders for Flask
  shell: rm -rf /home/flask_1 /home/flask_2 && mkdir /home/flask_1 /home/flask_2/ /home/flask_1/templates/ /home/flask_2/templates/

- name: Copy Flask 1
  template:
    src: flask_1/hello.py.j2
    dest: /home/flask_1/hello.py
    mode: '755'

- name: Genarate HTML file on Flask 1
  template:
    src: flask_1/index.html.j2
    dest: /home/flask_1/templates/index.html
    mode: '755'

- name: Run the Flask 1
  shell: nohup python3 /home/flask_1/hello.py &

- name: Copy Flask 2
  template:
    src: flask_2/hello.py.j2
    dest: /home/flask_2/hello.py
    mode: '755'

- name: Genarate HTML file on Flask 2
  template:
    src: flask_2/index.html.j2
    dest: /home/flask_2/templates/index.html
    mode: '755'

- name: Run the flask 2
  shell: nohup python3 /home/flask_2/hello.py &

توضیحات: نام گذاری تسک به گونه ای انجام شده است که عمکرد هر تسک کاملا مشخص باشد. تمام ماژول های مورد استفاده توضیحات لازم درباره آنها داده شده است به جز ماژول templates که عمکلرد ان مشابه copy است اما به این تفاوت که فایل های با پسوند .j2 (که در آنها از متغییر های پلی بوک استفاده شده است) در هنگام انتقال همان مقدار متغییر را جایگزین میکنند.


فایل roles/flask server with two service/vars/main.yml که شامل متغییر های نقش فلسک سرور میباشد، مشابه زیر است:

---
flask_1_port: 3000
flask_2_port: 3001


فایل inventory که شامل اطلاعات اتصال به نود های هدف و نام گذاری آن میباشد،‌ مشابه زیر است:

[loadbalancer]
haproxy     ansible_host=127.0.0.1  ansible_port=22     ansible_user=ansible

[flask_servers]
server_1    ansible_host=127.0.0.1  ansible_port=23     ansible_user=ansible
server_2    ansible_host=127.0.0.1  ansible_port=24     ansible_user=ansible 
  1. در اینجا نام گروه ای از نود های مشخص میشود که در ادامه اطلاعات آنها داده خواهد شد.
  2. اطلاعات اتصال به یک نود با نام haproxy همراه با اطلاعات اتصال مانند: ای پی، پورت ssh و نام کاربری برای اتصال داده شده است.
  3. خالی
  4. در اینجا نام گروه ای از نود های مشخص میشود که در ادامه اطلاعات آنها داده خواهد شد.
  5. اطلاعات اتصال به یک نود با نام server_1 همراه با اطلاعات اتصال مانند: ای پی، پورت ssh و نام کاربری برای اتصال داده شده است.
  6. اطلاعات اتصال به یک نود با نام server_2 همراه با اطلاعات اتصال مانند: ای پی، پورت ssh و نام کاربری برای اتصال داده شده است.

نکته: در صورتی که انسیل بر روی ماشین مجازی نصب شده است به جای 127.0.0.1 ای پی ماشینی که داکر بر روی آن نصب است را بایستی جایگزین کرد.

از اطلاعات این فایل هنگام اجرای پلی بوک استفاده میشود.


تمام توضیحات داده شده در این مقاله آموزشی اگرچه زیاد بودند ولی اجرای آن فقط نیازمند چند دستور است که در ادامه اورده شده است.

پس از راه اندازی محیط آزمایشگاهی برای دریافت پروژه پلی بوک از گیتهاب و اجرای آن دستورات زیر را بر روی ماشینی که انسیبل را روی آن نصب کردیم، اجرا کنید:

git clone https://github.com/amirhne/flask-haproxy-scenario-playbook.git
cd flask-haproxy-scenario-playbook
ansible-playbook -i inventory site.yml --ask-vault-pass

فایل های پروژه با استفاده از قابلیت ansible-vault رمزنگاری شده اند و پس از اجرای آخرین دستور درخواست پسورد میشود که 1234567 را وارد کنید.

فقط همین سه دستور کافی بود که کل سناریو بدون هیچ تنظیم دستی راه اندازی شود و با باز کردن http://127.0.0.1:8080 با هر بار ریفرش یک صفحه متفاوت که شامل اطلاعات سرور و پورت سرویس فلسک میباشد از روی هر کدام از سرویس های فلسک راه اندازی شده به شما نمایش داده میشود.

نکته: در صورتی که انسیل بر روی ماشین مجازی نصب شده است به جای 127.0.0.1 ای پی ماشینی که داکر بر روی آن نصب است را بایستی جایگزین کرد.

امیدوارم این مطلب برای شما مفید بوده باشد.