ایلانماسک برای ارسال یک ماهواره به مدار زمین، نیازمند یک کلاستر ردیس میباشد؛ اما او، پس از ریزش شدید *dogecoin،* بهشدت بیپول شده است و نمیتواند هزینهی اجارهی چند سرور ابری برای ایجاد یک کلاستر ردیس را پرداخت کند. بنابراین میخواهد یک کلاستر ردیس را بر روی چند *docker container* با کمک *Ansible* بالا بیاورد. او در این مسیر نیازمند کمک شماست.
برای دانلود پروژهی اولیه روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/129770/) کلیک کنید.
## کانتینرهای **Redis**
در ابتدای کار، برای ایجاد کانتینرهای ردیس، نیاز است که فایل `docker-compose.yml` را تکمیل کنید. توجه داشته باشید که شما اجازهی *build* کردن یک *Image* جدید **نخواهید داشت** و باید از *Imageهای* استاندارد استفاده کنید. بهطور خاص، برای *Redis* میتوانید از *Image* زیر استفاده کنید:
```
registry.gitlab.com/qio/standard/redis:latest
```
توجه داشته باشید که باید فایل `docker-compose.yml` را بهشکلی تکمیل کنید که پس از `up` کردن آن، ۶ کانتینر *Redis* اجرا شوند که ۳ تا از آنها برای *Nodeهای master* و ۳ تای دیگر آنها برای *Nodeهای slave* استفاده خواهند شد. **پس توجه داشته باشید که ما از شما انتظار داریم که به ازای هر *Node* اصلی، یک *replica* ایجاد شود** همچنین *network* همهی کانتینرها `host` باشد و در نظر داشته باشید ایمیج `registry.gitlab.com/qio/standard/redis:latest` برابر با همان ایمیج `redis` اصلی است و داکیومنت آن در [این لینک](https://hub.docker.com/_/redis) قابل مشاهده است.
### شرایط *containerها*
**۱. نام containerها باید حتماً به شکل زیر باشد:**
```
master1
master2
master3
slave1
slave2
slave3
```
توجه کنید، آن کانتینری که نامش با *master* شروع میشود، در انتهای کار، باید واقعاً حاوی یک *Node* از ردیس *Master* باشد و آن کانتینری که نامش با *slave* شروع میشود، در انتهای کار، باید واقعاً حاوی یک *Node* از ردیس *Slave* یا *replica* باشد.
**۲. هریک از این containerها باید روی پورت مشخصی که مربوط به آنها میباشد قرار گیرند.** دقیقاً به شکل زیر:
```
port of master1 = 7000
port of master2 = 7001
port of master3 = 7002
port of slave1 = 7003
port of slave2 = 7004
port of slave3 = 7005
```
### ایجاد *Volume*
در صورتیکه نیاز دارید فایل یا مسیری را به درون هریک از *containerها Volume* کنید، میتوانید از پوشهای بهنام `data` استفاده کنید. و برای ایجاد *Volume* از *Relative Path* استفاده کنید. برای مثال:
```yaml docker-compose.yml
services:
sample_container:
image: "registry.gitlab.com/qio/standard/redis:latest"
network_mode: host
volumes:
- ./data/somefile:/somefile
```
فراموش نکنید که فایل `somefile` را درون پوشهی `data` قرارداده و آن را برای داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
```
.
├── data
│ └── somefile
├── docker-compose.yml
├── requirements.txt
├── roles
│ └── redis
│ ├── handlers
│ ├── tasks
│ │ ├── cluster.yml
│ │ └── main.yml
│ └── templates
└── site.yml
```
درصورتی که علاقهمند به استفاده از پوشهی `data` نیستید نیز مشکلی نیست و میتوانید آن را ارسال نکنید.
**توجه:** سیستم داوری کوئرا بهصورت خودکار فایل `docker-compose.yml` را با کامند `up` اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
## ایجاد *cluster* با *Ansible*
پس از بالا آمدن *containerهای Redis،* که سیستم داوری کوئرا بهصورت خودکار آنها را با استفاده از فایل `docker-compose.yml` شما بالا میآورد، شما نیازمند ایجاد هماهنگی میان این *Nodeهای Redis* خواهید بود. برای ایجاد این هماهنگی (یا اصطلاحاً ایجاد *cluster*)، میتوانید از *Ansible* استفاده کنید.
پس از بالا آمدن کامل همهی *containerهای Redis،* فایل `site.yml` با دستور `ansible-playbook` اجرا خواهد شد. شما میتوانید فایل `cluster.yml` را به هر صورتی که نیاز دارید تغییر دهید، بهشکلی که *cluster* مربوط به *Nodeهای Redis* ایجاد شود.
**توجه:** شما در سیستم *host،* به `redis-cli` دسترسی ندارید. در واقع، `redis-server` در سیستم *host* نصب نیست. (راهنمایی: اما در تمامی *Nodeها* نصب است!)
## شرایط نمرهدهی
در صورتی که علاقهمند به استفاده از *Ansible* برای اجرای کلاستر نیستید، میتوانید از آن استفاده نکنید. تمامی نمرهای که شما دریافت میکنید، مربوط به اجرای درست و دقیق کلاستر خواهد بود. پس اگر میتوانید بدون استفاده از *Ansible،* یک کلاستر ردیس میان ۶ کانتینر ایجاد کنید، این کار را انجام دهید. بههرحال این امکان برای شما وجود دارد که از *Ansible* برای اجرای دستوراتی که علاقهمند به اجرای آنها در سیستم *host* هستید استفاده کنید.
## نحوه ارسال پاسخ
شما فقط میتوانید مسیرهای هایلایت شده را تغییر دهید:
```
.
├── <mark class="yellow" title="این پوشه را میتوانید تغییر دهید"> data </mark>
│ └── ...
├── <mark class="yellow" title="این فایل را میتوانید تغییر دهید"> docker-compose.yml </mark>
├── requirements.txt
├── roles
│ └── redis
│ ├── handlers
│ ├── tasks
│ │ ├── <mark class="yellow" title="این فایل را میتوانید تغییر دهید"> cluster.yml </mark>
│ │ └── main.yml
│ └── templates
└── site.yml
```
در نهایت این پوشه را *zip* کرده و ارسال کنید. توجه کنید که پس از *extract* کردن فایل *zip* شما، باید فایل `docker-compose.yml` را ببینیم.