أهلاً بكم! كجزء من عملي في الدورة التدريبية ، كنت أبحث عن إمكانيات منصة سحابية محلية مثل
ماذا تريد ان تحصل؟
بعد بدء تشغيل جهاز افتراضي بخادم ويب ، يمكنك الانتقال إلى مضيفه والحصول على واجهة مستخدم جميلة ، وتحديد قواعد البيانات كمصادر لمزيد من العمل ، وإنشاء لوحات معلومات ورسوم بيانية.
يحتوي الإصدار الأساسي على عيب كبير - فهو لا يتحمل الأخطاء على الإطلاق. أي أن الأداء الكامل للتطبيق يعتمد على صلاحية جهاز افتراضي واحد. إذا رفضت أو إذا فتح 10 أشخاص واجهة المستخدم في نفس الوقت ، فستظهر مشاكل.
يتم حلها ببساطة: تحتاج فقط إلى نشر العديد من الأجهزة الافتراضية المتطابقة مع خادم ويب ووضعها تحت موازن L3. لكن ليس كل شيء واضح المعالم هنا. يقوم Grafana بتخزين إعدادات المستخدم (المسارات إلى قواعد البيانات ، ولوحات المعلومات ، والرسومات ، وما إلى ذلك) مباشرةً على قرص الجهاز الظاهري الخاص به. وبالتالي ، إذا قمت بتغيير بعض الإعدادات في واجهة المستخدم ، فسيتم عرض هذه التغييرات فقط على الجهاز الظاهري الذي أرسلنا إليه الموازن. سيؤدي هذا إلى إعدادات غير متسقة لتطبيقنا ، ومشاكل في التشغيل والاستخدام.
هنا ستأتي قاعدة بيانات أخرى للإنقاذ ، على سبيل المثال ، MySQL أو ما يعادلها. أخبرنا جرافانا أنه يجب عليها تخزين إعدادات المستخدم في قاعدة البيانات "الاحتياطية" هذه. بعد ذلك ، يكفي تحديد المسار إلى قاعدة البيانات هذه على كل جهاز مرة واحدة ، وتعديل جميع إعدادات المستخدم الأخرى على أي من الأجهزة الظاهرية ، وسوف تنمو على الباقي.
فيما يلي رسم تخطيطي للبنية التحتية للتطبيق النهائي:
تعلم أن ترفع بيديك
MySQL و ClickHouse
قبل نشر مثل هذا التطبيق بنقرة زر واحدة ، كان من الضروري معرفة كيفية رفع كل مكون من مكوناته بالمقابض ودمجها مع بعضها البعض.
سيساعدنا Yandex.Cloud هنا ، والذي يوفر موازين L3 و ClickHouse و MySQL كخدمات مُدارة. يحتاج المستخدم فقط إلى تحديد المعلمات والانتظار حتى يجلب النظام الأساسي كل شيء إلى حالة العمل.
لقد قمت بالتسجيل وأنشأت حسابًا سحابيًا وحساب فواتير لنفسي. بعد ذلك ، دخلت إلى السحابة ورفعت مجموعات MySQL و ClickHouse مع الحد الأدنى من الإعدادات. انتظر حتى تصبح نشطة.
تحتاج أيضًا إلى تذكر إنشاء قاعدة بيانات في كل مجموعة وتهيئة الوصول إليها عن طريق تسجيل الدخول وكلمة المرور. لن أخوض في التفاصيل هنا - كل شيء واضح تمامًا في الواجهة.
كانت التفاصيل غير الواضحة هي أن قواعد البيانات هذه لديها العديد من المضيفين الذين يوفرون التسامح مع الخطأ. ومع ذلك ، يتطلب Grafana مضيفًا واحدًا بالضبط لكل قاعدة بيانات تعمل معها. قراءة طويلة c-<cluster_id>.rw.mdb.yandexcloud.net
تعيين إلى مضيف الكتلة الرئيسي النشط الحالي بالمعرف المقابل. هذا ما سنعطيه لغرافانا.
قاعدة بيانات للانترنت
الآن الأمر متروك لخادم الويب. لنقم بإنشاء آلة افتراضية عادية مع Linux ونقوم بإعداد Grafana عليها بأيدينا.
دعنا نتصل عبر ssh ونقوم بتثبيت الحزم الضرورية.
sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise
بعد ذلك ، سنبدأ Grafana ضمن systemctl ونقوم بتثبيت المكون الإضافي للعمل مع ClickHouse (نعم ، لم يتم توفيره في الحزمة الأساسية).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
كل شيء بعد ذلك بأمر بسيط
sudo service grafana-server start
سنبدأ خادم الويب. الآن سيكون من الممكن القيادة في عنوان IP الخارجي للجهاز الظاهري في المتصفح ، وتحديد المنفذ 3000 ومشاهدة واجهة المستخدم الجميلة grafana.
لكن لا تتعجل ، قبل إعداد Grafana ، يجب ألا تنسى تحديد المسار إلى MySQL لتخزين الإعدادات هناك.
التكوين الكامل لخادم الويب Grafana موجود في الملف /etc/grafana/grafana.ini
. يبدو السطر المطلوب كما يلي:
;url =
نعرض المضيف لمجموعة MySQL. يحتوي الملف نفسه على معلومات تسجيل الدخول وكلمة المرور للوصول إلى Grafana في الصورة أعلاه ، وكلاهما متساويان افتراضيًا admin
.
يمكنك استخدام أوامر sed:
sudo sed -i "s#.*;url =.*#url = mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${GRAFANA_USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${GRAFANA_PASSWORD}#" /etc/grafana/grafana.ini
حان الوقت لإعادة تشغيل خادم الويب!
sudo service grafana-server restart
الآن في Grafana UI ، سنحدد ClickHouse باعتباره مصدر البيانات.
تمكنت من تحقيق تكوين عمل بالإعدادات التالية:
لقد أعطيت عنوان URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443
الجميع! لدينا آلة افتراضية واحدة تعمل بخادم ويب متصل بـ CH و MySQL. يمكنك بالفعل تحميل مجموعة البيانات إلى ClickHouse وإنشاء لوحات معلومات. ومع ذلك ، لم نصل بعد إلى هدفنا ولم ننشر بنية تحتية كاملة.
العتال
يتيح لك Yandex.Cloud إنشاء صورة قرص لجهاز افتراضي موجود ، وبناءً عليه ، يمكنك إنشاء العديد من الأجهزة المماثلة كما تريد. هذا هو بالضبط ما سنستخدمه. لتجميع الصورة بشكل ملائم ، خذ الأداة
سيتألف ملف json الخاص بنا من كتلتين: البناة والمزودون. تصف الكتلة الأولى معلمات الصورة نفسها ككيان ، وتصف الكتلة الثانية الإرشادات الخاصة بملئها بالمحتوى الضروري.
بناة
{
"builders": [
{
"type": "yandex",
"endpoint": "{{user `endpoint`}}",
"folder_id": "<folder_id>",
"subnet_id": "{{user `subnet_id`}}",
"zone": "{{user `zone`}}",
"labels": {},
"use_ipv4_nat": true,
"use_internal_ip": false,
"service_account_key_file": "<service_account_key_file>",
"image_name": "grafana-{{timestamp}}",
"image_family": "grafana",
"image_labels": {},
"image_description": "GRAFANA",
"source_image_family": "ubuntu-1804-lts",
"disk_size_gb": 3,
"disk_type": "network-hdd",
"ssh_username": "ubuntu"
}
],
...
}
في هذا القالب ، تحتاج إلى تعيين معرف القسم في السحابة حيث تريد إنشاء صورة ، وكذلك المسار إلى الملف باستخدام المفاتيح من حساب الخدمة الذي تم إنشاؤه مسبقًا في هذا القسم. يمكنك قراءة المزيد حول إنشاء حسابات الخدمة والمفاتيح في شكل ملف في القسم المقابل.
يشير هذا التكوين إلى أنه سيتم إنشاء صورة القرص بناءً على النظام الأساسي ubuntu-1804-lts
، في قسم المستخدم المناسب في مجموعة الصور GRAFANA
تحت الاسم grafana-{{timestamp}}
.
الممولين
الآن للجزء الأكثر إثارة للاهتمام من التكوين. سيصف تسلسل الإجراءات التي يجب تنفيذها على جهاز افتراضي قبل تجميد حالته في صورة قرص.
{
...,
"provisioners": [
{
"type": "shell",
"pause_before": "5s",
"scripts": [
"prepare-ctg.sh"
]
},
{
"type": "file",
"source": "setup.sh",
"destination": "/opt/grafana/setup.sh"
},
{
"type": "shell",
"execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
"pause_before": "5s",
"scripts": [
"install-packages.sh",
"grafana-setup.sh",
"run-setup-at-reboot.sh"
]
}
]
}
هنا ، يتم تقسيم جميع الإجراءات إلى 3 مراحل. في المرحلة الأولى ، يتم تنفيذ نص بسيط يقوم بإنشاء دليل مساعد.
تحضير- ctg.sh:
#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana
في المرحلة التالية ، نضع برنامجًا نصيًا في هذا الدليل ، والذي سيحتاج إلى التشغيل فور بدء تشغيل الجهاز الظاهري. سيضع هذا البرنامج النصي متغيرات المستخدم التي سيتم تعيينها في تكوين Grafana وإعادة تشغيل خادم الويب.
الإعداد.sh:
#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart
بعد ذلك ، هناك 3 أشياء للقيام بها:
1) تثبيت الحزم
2) ابدأ Grafana ضمن systemctl وقم بتثبيت البرنامج المساعد ClickHouse
3) ضع البرنامج النصي setup.sh في قائمة الانتظار ليتم تشغيله فورًا بعد تشغيل الجهاز الظاهري.
تثبيت الحزم.sh:
#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise
جرافانا-setup.sh:
#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource
تشغيل الإعداد في reboot.sh:
#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;
الآن يبقى تشغيل Packer ووضع صورة الإخراج في القسم المحدد. عند إنشاء جهاز افتراضي ، يمكنك تحديده كقرص تمهيد ، وبعد البدء ، يمكنك الحصول على خادم ويب Grafana جاهز.
مجموعة المثيل والموازن
بمجرد وجود صورة قرص تسمح لك بإنشاء العديد من خوادم ويب Grafana المتطابقة ، يمكننا إنشاء مجموعة مثيلات. على منصة Yandex.Cloud ، يشير هذا المصطلح إلى اتحاد الأجهزة الافتراضية التي لها نفس الخصائص. عند إنشاء مجموعة مثيل ، يتم تكوين النموذج الأولي لجميع الأجهزة في هذه المجموعة ، ثم خصائص المجموعة نفسها (على سبيل المثال ، الحد الأدنى والحد الأقصى لعدد الأجهزة النشطة). إذا كان الرقم الحالي لا يلبي هذا المعيار ، فستقوم مجموعة المثيل نفسها بإزالة الأجهزة غير الضرورية أو إنشاء أجهزة جديدة في الصورة والتشابه.
كجزء من مهمتنا ، سننشئ مجموعة مثيل من خوادم الويب التي سيتم إنتاجها من صورة القرص التي تم إنشاؤها مسبقًا.
يعد إعداد مجموعة المثيل الأخير ملحوظًا حقًا. ستساعدك المجموعة المستهدفة بالتكامل مع Load Balancer في إعداد موازن L3 أعلى الأجهزة الافتراضية لهذه المجموعة عن طريق الضغط على اثنين من الأزرار.
عند إعداد الموازن ، قمت بتنفيذ نقطتين مهمتين:
- لقد قمت بذلك بحيث يقبل الموازن حركة مرور المستخدم على المنفذ 80 ، وأعاد توجيهه إلى المنفذ 3000 من الأجهزة الافتراضية ، حيث تعيش Grafana فقط.
- قم بإعداد فحوصات صحة الجهاز عن طريق اختبار الاتصال على المنفذ 3000.
المجموع المصغر
أخيرًا ، تمكنا من نشر البنية التحتية المطلوبة يدويًا ، والآن لدينا خدمة Grafana عالية المرونة. من الضروري فقط معرفة عنوان IP الخاص بالموازن كنقطة دخول إلى التطبيق ومضيف مجموعة ClickHouse لتحميل مجموعة البيانات فيه.
يبدو انتصارا؟ نعم انتصار. لكن شيئًا ما لا يزال يزعجني. تتطلب العملية بأكملها أعلاه الكثير من الإجراءات اليدوية ولا تتسع على الإطلاق ، وأريد أتمتة ذلك إن أمكن. سيكون هذا هو محور القسم التالي.
التكامل مع Terraform
سنستخدم مرة أخرى أداة من HashiCorp تسمى
ينحصر العمل في Terraform في كتابة ملف التكوين (*.tf
) وإنشاء البنية التحتية القائمة عليها.
المتغيرات
في بداية الملف ، سنقوم بإخراج المتغيرات التي تحدد مكان وكيفية نشر البنية التحتية المستقبلية.
variable "oauth_token" {
type = string
default = "<oauth-token>"
}
variable "cloud_id" {
type = string
default = "<cloud-id>"
}
variable "folder_id" {
type = string
default = "<folder_id>"
}
variable "service_account_id" {
type = string
default = "<service_account_id>"
}
variable "image_id" {
type = string
default = "<image_id>"
}
variable "username" {
type = string
default = "<username>"
}
variable "password" {
type = string
default = "<password>"
}
variable "dbname" {
type = string
default = "<dbname>"
}
variable "public_key_path" {
type = string
default = "<path to ssh public key>"
}
ستتمثل عملية نشر التطبيق بأكملها في بناء صورة قرص وتعيين هذه المتغيرات. اسمحوا لي أن أشرح مسؤولياتهم:
oauth_token - رمز للوصول إلى السحابة. يمكن الحصول عليها عن طريق
cloud_id - معرّف السحابة حيث سننشر التطبيق
Folder_id - معرّف القسم الذي سننشر فيه التطبيق
Service_account_id - معرف حساب الخدمة في القسم المقابل من السحابة.
معرّف_صورة - معرّف صورة القرص التي تم الحصول عليها باستخدام Packer
اسم المستخدم и كلمه السر - اسم المستخدم وكلمة المرور للوصول إلى كل من قواعد البيانات وخادم الويب Grafana
com.dbname - اسم قاعدة البيانات داخل مجموعات CH و MySQL
public_key_path - المسار إلى الملف باستخدام مفتاح ssh العام الخاص بك ، والذي يمكنك من خلاله الاتصال تحت الاسم ubuntu
إلى الأجهزة الافتراضية مع خوادم الويب
إعداد المزود
أنت الآن بحاجة إلى تكوين موفر Terraform - في حالتنا ، Yandex:
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
يمكنك أن ترى أننا هنا نستخدم المتغيرات المحددة أعلاه.
الشبكة والعناقيد
لنقم الآن بإنشاء شبكة تتواصل فيها عناصر بنيتنا التحتية ، ثلاث شبكات فرعية (واحدة في كل منطقة) وترفع مجموعات CH و MySQL.
resource "yandex_vpc_network" "grafana_network" {}
resource "yandex_vpc_subnet" "subnet_a" {
zone = "ru-central1-a"
network_id = yandex_vpc_network.grafana_network.id
v4_cidr_blocks = ["10.1.0.0/24"]
}
resource "yandex_vpc_subnet" "subnet_b" {
zone = "ru-central1-b"
network_id = yandex_vpc_network.grafana_network.id
v4_cidr_blocks = ["10.2.0.0/24"]
}
resource "yandex_vpc_subnet" "subnet_c" {
zone = "ru-central1-c"
network_id = yandex_vpc_network.grafana_network.id
v4_cidr_blocks = ["10.3.0.0/24"]
}
resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
name = "grafana-clickhouse"
environment = "PRODUCTION"
network_id = yandex_vpc_network.grafana_network.id
clickhouse {
resources {
resource_preset_id = "s2.micro"
disk_type_id = "network-ssd"
disk_size = 16
}
}
zookeeper {
resources {
resource_preset_id = "s2.micro"
disk_type_id = "network-ssd"
disk_size = 10
}
}
database {
name = var.dbname
}
user {
name = var.username
password = var.password
permission {
database_name = var.dbname
}
}
host {
type = "CLICKHOUSE"
zone = "ru-central1-a"
subnet_id = yandex_vpc_subnet.subnet_a.id
}
host {
type = "CLICKHOUSE"
zone = "ru-central1-b"
subnet_id = yandex_vpc_subnet.subnet_b.id
}
host {
type = "CLICKHOUSE"
zone = "ru-central1-c"
subnet_id = yandex_vpc_subnet.subnet_c.id
}
host {
type = "ZOOKEEPER"
zone = "ru-central1-a"
subnet_id = yandex_vpc_subnet.subnet_a.id
}
host {
type = "ZOOKEEPER"
zone = "ru-central1-b"
subnet_id = yandex_vpc_subnet.subnet_b.id
}
host {
type = "ZOOKEEPER"
zone = "ru-central1-c"
subnet_id = yandex_vpc_subnet.subnet_c.id
}
}
resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
name = "grafana_mysql"
environment = "PRODUCTION"
network_id = yandex_vpc_network.grafana_network.id
version = "8.0"
resources {
resource_preset_id = "s2.micro"
disk_type_id = "network-ssd"
disk_size = 16
}
database {
name = var.dbname
}
user {
name = var.username
password = var.password
permission {
database_name = var.dbname
roles = ["ALL"]
}
}
host {
zone = "ru-central1-a"
subnet_id = yandex_vpc_subnet.subnet_a.id
}
host {
zone = "ru-central1-b"
subnet_id = yandex_vpc_subnet.subnet_b.id
}
host {
zone = "ru-central1-c"
subnet_id = yandex_vpc_subnet.subnet_c.id
}
}
كما ترى ، تم تصميم كل مجموعة من المجموعتين لتكون قادرة على تحمل الأخطاء إلى حد ما من خلال وضعها في ثلاث مناطق توافر خدمات.
خوادم الويب
يبدو أنه يمكنك الاستمرار بنفس الروح ، لكنني واجهت صعوبة. قبل ذلك ، قمت أولاً برفع مجموعة MySQL ، وبعد ذلك فقط ، مع معرفة معرفها ، جمعت صورة قرص بالتكوين المطلوب ، حيث حددت المضيف إلى الكتلة. لكننا الآن لا نعرف معرف الكتلة قبل إطلاق Terraform ، بما في ذلك وقت إنشاء الصورة. لذلك اضطررت إلى اللجوء إلى ما يلي
باستخدام خدمة البيانات الوصفية من Amazon ، سنقوم بتمرير بعض المعلمات إلى الجهاز الظاهري ، والتي سيقبلها ويعالجها. نحتاج إلى أن ينتقل الجهاز إلى البيانات الوصفية لمضيف MySQL للمجموعة ولإسم المستخدم وكلمة المرور التي حددها المستخدم في ملف Terraform بعد البدء. قم بتغيير محتويات الملف قليلاً setup.sh
، والذي يتم تشغيله عند تشغيل الجهاز الظاهري.
الإعداد.sh:
#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart
مجموعة Intance وموازن
بعد إعادة بناء صورة القرص الجديدة ، يمكننا أخيرًا إضافة ملفنا لـ Terraform.
نشير إلى أننا نريد استخدام صورة قرص موجودة:
data "yandex_compute_image" "grafana_image" {
image_id = var.image_id
}
لنقم الآن بإنشاء مجموعة مثيل:
resource "yandex_compute_instance_group" "grafana_group" {
name = "grafana-group"
folder_id = var.folder_id
service_account_id = var.service_account_id
instance_template {
platform_id = "standard-v1"
resources {
memory = 1
cores = 1
}
boot_disk {
mode = "READ_WRITE"
initialize_params {
image_id = data.yandex_compute_image.grafana_image.id
size = 4
}
}
network_interface {
network_id = yandex_vpc_network.grafana_network.id
subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
nat = "true"
}
metadata = {
mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
username = var.username
password = var.password
ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
}
network_settings {
type = "STANDARD"
}
}
scale_policy {
fixed_scale {
size = 6
}
}
allocation_policy {
zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
}
deploy_policy {
max_unavailable = 2
max_creating = 2
max_expansion = 2
max_deleting = 2
}
load_balancer {
target_group_name = "grafana-target-group"
}
}
يجدر الانتباه إلى كيفية تمريرنا للبيانات الوصفية cluster_uri
, username
и password
. إن الآلة الافتراضية الخاصة بهم هي التي ستحصل عليها عند بدء التشغيل وتضعها في تكوين Grafana.
يتعلق الأمر بالموازن.
resource "yandex_lb_network_load_balancer" "grafana_balancer" {
name = "grafana-balancer"
listener {
name = "grafana-listener"
port = 80
target_port = 3000
external_address_spec {
ip_version = "ipv4"
}
}
attached_target_group {
target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id
healthcheck {
name = "healthcheck"
tcp_options {
port = 3000
}
}
}
}
قليل من السكر
كان هناك القليل جدا من اليسار. بعد نشر البنية التحتية ، سيتعين عليك الانتقال إلى واجهة مستخدم Grafana وإضافة مجموعة CH يدويًا (التي لا تزال بحاجة إلى معرفتها) كمصدر بيانات. لكن Terraform يعرف معرف الكتلة. دعنا نجعله ينهي المهمة.
دعنا نضيف مزودًا جديدًا - Grafana ، وننزع عنوان IP الموازن كمضيف. جميع التغييرات التي تجريها Terraform على الجهاز حيث يحدد موازنها ستنمو في MySQL ، وبالتالي على جميع الأجهزة الأخرى.
provider "grafana" {
url = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
auth = "${var.username}:${var.password}"
}
resource "grafana_data_source" "ch_data_source" {
type = "vertamedia-clickhouse-datasource"
name = "grafana"
url = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
basic_auth_enabled = "true"
basic_auth_username = var.username
basic_auth_password = var.password
is_default = "true"
access_mode = "proxy"
}
دعونا تمشيط
عرض IP موازن ومضيف كتلة ClickHouse
output "grafana_balancer_ip_address" {
value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}
output "clickhouse_cluster_host" {
value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}
استطيع الركض
الجميع! ملف التكوين الخاص بنا جاهز ويمكننا ، من خلال تعيين المتغيرات ، إخبار Terraform لرفع كل ما وصفناه أعلاه. استغرقت العملية برمتها حوالي 15 دقيقة.
في النهاية يمكنك رؤية رسالة جميلة:
Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:
clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25
وفي السحابة ، ستكون عناصر البنية التحتية المرتفعة مرئية:
تلخيص
الآن ، باستخدام مثال Grafana ، يمكن لكل واحد منكم نشر التطبيقات ذات البنية السحابية المترامية الأطراف على منصة Yandex.Cloud. يمكن أن تساعدك الأدوات المفيدة من HashiCorp مثل Packer و Terraform في ذلك. آمل أن يجد شخص ما هذه المقالة مفيدة 🙂
ملاحظة أدناه ، سأرفق رابطًا للمستودع ، حيث يمكنك العثور على وصفات جاهزة لـ Packer و Terraform ، والتي أشرت إلى أجزاء منها في هذه المقالة.
المصدر: www.habr.com