راه اندازی 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' در اینجا نسخه فایل داکر کامپوز مشخص شده است.خالیمشخص میشود که چه کانتینر هایی قرار است راه اندازی شوند.نام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.گفته میشود ایمیجی که قرار است کانتینر از روی آن ساخته شود بایستی با مشخصات بعدی ساخته شود.مسیر داکر فایل مورد نظر برای ساخت ایمیج داده شده است که همان مسیری است که فایل کامپوز قرار دارد.نام داکر فایل داده شده است.گفته میشود داکر ایمیج ساخته شده در مرحله قبل با چه نامی ذخیره شود.هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.گفته میشود پورت ۲۲ ماشین به پورت ۲۲ کانتینر فوروارد شود.گفته میشود پورت ۸۰۸۰ ماشین به پورت ۸۰ کانتینر فوروارد شود.خالینام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.گفته میشود که کانتیتر از روی چه ایمیجی ساخته شود که در اینجا همان ایمجی است که برای کانتینر لودبالانسر ساخته شده است.هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.گفته میشود پورت ۲۳ ماشین به پورت ۲۲ کانتینر فوروارد شود.خالینام کانتینر مشخص میشود و گفته میشود که تنظیمات آن در ادامه قرار دارد.گفته میشود که کانتیتر از روی چه ایمیجی ساخته شود که در اینجا همان ایمجی است که برای کانتینر لودبالانسر ساخته شده است.هاست نیم (etc/hostname/) کانتینر پس از راه اندازی مشخص میشود.گفته میشود که قرار است چه پورت هایی از بیرون کانتینر در دسترس قرار داشته باشند.گفته میشود پورت ۲۴ ماشین به پورت ۲۲ کانتینر فوروارد شود.نکته مهم: فاصله ها در این فایل بسیار مهم میباشد و بایستی حتما سلسله مراتب در نوشتن این فایل رعایت شود.نکته مهم: داکر دارای یک 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 مشخص میشود که این یک فایل کانفیگ YAML میباشد.گفته میشود که قرار است بر روی چه نود یا نود هایی عملیات ها پیش رو انجام شود. این گروه از نود ها یا یک نود توسط یک فایل inventory مشخص میشوند که در ادامه مقاله نمومه آن آورده شده است. همچنین میتوان آنها در فایل etc/ansible/hosts/ مشخص کرد.گفته میشود که تمامی تسک ها با دسترسی روت انجام شوند.گفته میشود که یک سری متغییر در این پلی بوک وجود دارد.یک متغییر تعریف میشود.یک متغییر تعریف میشود.میشخص میشود که قرار است مجموعه ای از کار ها در ادامه انجام شود.یک تسک جدید با نام آن مشخص میشود.با استفاده از ماژول shell در نود هدف دستور داده شده را انجام شود. ماژول شل برای برای اجرای دستور در محیط دستوری گنو/لینوکس استفاده میشود. همانطور که مشاهده میکنید استفاده از متغییر در محیط انسیبل به شکل {{ var_name }} میباشد.یک تسک جدید با نام آن مشخص میشود.گفته میشود که از ماژول apt استفاده شود و کارهای آن در ادامه مشخص میشود. ماژول apt برای مدیریت پکیج ها در سیستم عامل های بر پایه دبین استفاده میشود.نام پیکیج مشخص میشود.گفته میشود که لیست ریپازیتوری های سیستم عامل بروز شود.گفته میشود که پکیج نام برده بایستی آخرین نسخه آن نصب باشد.یک handler با نام مشخص فراخوانی میشود که در صورت اجرا این تسک و ایجاد تغییر در نود هدف این handler اجرا میشود.خالیگفته میشود که لیست هندلرها در ادامه داده شده است.یک هندلر جدید با نام آن مشخص میشود.گفته میشود در صورت اجرای این هندلر با ماژول شل دستور مورد نظر اجرا شود.با توضیحات ارایه شده مشخص شده است که ساختار یک پلی بوک چگونه میباشد ولی رایج است که برای پیاده سازی نقش ها در پلی بوک از یک ساختار پوشه ای به نام roles که در آن تمامی قسمت های مختلف یک پلی بوک در مسیر های جداگانه قرار داده میشوند، استفاده میشود. به این صورت که هر نقش یا role شامل یکسری task,vars, handlers و... مشخص میباشد که در یک ساختار پوشه قرار میگیرند.در ادامه یک پلی بوک با نام site.yml با استفاده از roles اورده شده است که توضیحات درباره آن داده خواهد شد:--- - hosts: machines become: yes roles: - webserverمشخص میشود که این فایل کانفیگ YAML هست. گفته میشود که قرار است بر روی چه نود یا نود هایی عملیات ها پیش رو انجام شود.گفته میشود که تمامی تسک ها با دسترسی روت انجام شوند.گفته میشود که قرار است که چه نقش هایی بر روی نود یا نود های هدف پیاده سازی شود.همانطور که مشاهده میکنید پلی بوک اصلی به شکل فوق العاده ای ساده و خوانا شده است و فقط کافیست در مسیر همین پلی بوک یک پوشه با نام 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 مشخص میشود که سرور فرانت اند که وظیفه اصلی لودبالانسینگ را دارد در ادامه چه مشخصاتی خواهد داشت و نام آن مشخص میشود.گفته میشود که بر روی تمام ای پی های سرور و پورت ۸۰ ترافیک قبول شود.گفته میشود که ترافیک به سرور ها که بعدا در بک اند مشخص میشود، فروارد شود.نام سرور های بک اند مشخص میشود که در ادامه تعریف خواهد شد.خالیمشخص میشود که مشخصات سرور های بک اند چه خواهد بود و نام آن ها برای استفاده مشخص میشود. این دقیقا همان نام ای است که در قسمت فرانت اند در خط ۴ استفاده شده است.الگوریتم لودبالانسینگ round-robin مشخص میشود. یک سرور با نام server_1 با ادرس مشخص و پورت ۸۰ تعریف شده است، این آدرس دقیقا همان نامی است که هنگام ایجاد کانتینر با داکر کامپوز استفاده شده است و در ادامه گفته میشود که سرور را برای در دسترس بودن برای هر مدت کوتاه با برقراری یک کانکشن tcp چک کند. یک سروربا نام server_2 با ادرس مشخص و پورت ۸۰ تعریف شده است، این آدرس دقیقا همان نامی است که هنگام ایجاد کانتینر با داکر کامپوز استفاده شده است و در ادامه گفته میشود که سرور را برای در دسترس بودن برای هر مدت کوتاه با برقراری یک کانکشن tcp چک کند. گفته میشود که با دادن درخواست 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 فایل اصلی پلی بوکیک فایل میباشد که شامل اطلاعات اتصال به نود های هدف و نام گذاری آن میباشد. این نام گذاری همان نام گذاری مورد استفاده در قسمت hosts پلی بوک میباشد.پوشه نقش هاپوشه نقش flask server with two serviceپوشه تسک های نقش سرور فلسکفایل تسک های نقش سرور فلسکپوشه هندلر های نقش سرور فلسکفایل هندلر های نقش سرور فلسکپوشه فایل هایی که در آنها از متغیر های پلی بوک استفاده کردیم و قرار است به روی سرورهایی با نقش سرور فلسک انتقال پیدا کنند.پوشه فایل های سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.فایل پایتون سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.فایل html سرویس فلسک اول بر روی سرور هایی که نقش سرور فلسک را دارند.پوشه فایل های سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.فایل پایتون سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.فایل html سرویس فلسک دوم بر روی سرور هایی که نقش سرور فلسک را دارند.فایل کانفیگ HAProxy سرورهایی که نقش سرور فلسک را دارند.پوشه متغییر های نقش سرور فلسکفایل متغییر های نقش سرور فلسکپوشه نقش loadbalancerپوشه فایل هایی که قرار است به سرور نقش لودبالانسر انتقال پیدا کند.فایل کانفیگ HAProxy سرور لودبالانسر که در آن از متغییر استفاده نشده است.پوشه تسک های نقش سرور لودبالانسرفایل تسک های نقش سرور لودبالانسرپوشه هندلر های نقش سرور لودبالانسرفایل هندلر های نقش سرور لودبالانسرفایل 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.ymlroles/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 در اینجا نام گروه ای از نود های مشخص میشود که در ادامه اطلاعات آنها داده خواهد شد.اطلاعات اتصال به یک نود با نام haproxy همراه با اطلاعات اتصال مانند: ای پی، پورت ssh و نام کاربری برای اتصال داده شده است.خالیدر اینجا نام گروه ای از نود های مشخص میشود که در ادامه اطلاعات آنها داده خواهد شد.اطلاعات اتصال به یک نود با نام server_1 همراه با اطلاعات اتصال مانند: ای پی، پورت ssh و نام کاربری برای اتصال داده شده است.اطلاعات اتصال به یک نود با نام 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 ای پی ماشینی که داکر بر روی آن نصب است را بایستی جایگزین کرد.امیدوارم این مطلب برای شما مفید بوده باشد.