Përshëndetje të gjithëve! Në kuadër të punës së kursit, kam studiuar mundësitë e një platforme të brendshme cloud si . Platforma ofron shërbime të ndryshme për zgjidhjen e problemeve praktike. Megjithatë, ndonjëherë është e nevojshme të konfiguroni aplikacionin tuaj cloud duke e bazuar atë në këto shërbime me një infrastrukturë të gjerë. Në këtë artikull, dëshiroj të ndaj përvojën time të vendosjes së një aplikacioni të tillë.

ĂfarĂ« dĂ«shirojmĂ« tĂ« arrijmĂ«?
â njĂ« mjet tĂ« fuqishĂ«m pĂ«r zgjidhjen e problemeve analitike ose pĂ«r monitorimin e sistemeve tĂ« ndryshme. NĂ« konfigurimin e tij bazĂ«, ai Ă«shtĂ« njĂ« makinĂ« virtuale me njĂ« server web Grafana, si dhe njĂ« bazĂ« tĂ« dhĂ«nash (ClickHouse, InfluxDB, etj.) me njĂ« dataset mbi tĂ« cilin do tĂ« ndĂ«rtohet analiza.
Pas nisjes së makinës virtuale me serverin web, do të mund të hyni në hostin e saj dhe të merrni një UI të bukur, të specifikoni bazat e të dhënave si burimet për punë të mëtejshme, të krijoni dashboard dhe grafikë.

Versioni bazĂ« ka njĂ« tĂ« metĂ« tĂ« rĂ«ndĂ«sishme â ai nuk Ă«shtĂ« aspak i qĂ«ndrueshĂ«m. Kjo do tĂ« thotĂ« se e gjithĂ« funksionaliteti i aplikacionit varet nga jetĂ«sia e njĂ« makine virtuale. NĂ«se ajo dĂ«shton ose nĂ«se 10 persona hapin njĂ«herĂ«sh UI-nĂ«, do tĂ« lindin probleme.
Problemet zgjidhen thjesht: duhet vetëm... të vendosni shumë makina virtuale të njëjta me server web dhe t'i vendosni ato nën balancuesin L3. Por këtu nuk është gjithçka ashtu siç duket. Grafana ruan konfigurimet e përdoruesve (rrugët për në bazat e të dhënave, dashboardët, grafikët, etj.) direkt në diskun e makinës virtuale. Kështu, nëse ndryshoni ndonjë konfigurim në UI, ato ndryshime do të shfaqen vetëm në atë makinë virtuale, në të cilën na dërgoi balancuesi. Kjo do të çojë në konfigurime jo konsistente të aplikacionit tonë, do të lindin probleme me nisjen dhe përdorimin.
Në ndihmë vjen një tjetër bazë të dhënash, për shembull, MySQL ose një analog të saj. I themi Grafanës që duhet të ruajë konfigurimet e përdoruesve pikërisht në këtë "rezervë" të bazës. Pas kësaj, mjafton të specifikoni një herë rrugën për në këtë DB në çdo makinë dhe të editojmë të gjitha konfigurimet e tjera të përdoruesve në çdo makinë virtuale, ato do të propogojnë në të tjerat.
Këtu është skema e infrastrukturës përfundimtare të aplikacionit:

Do të mësojmë të ngremë manualisht
MySQL dhe ClickHouse
Para të vendosni një aplikacion të tillë me një klik, ishte e nevojshme të mësoheshit të ngrinit manualisht çdo komponent dhe t'i integroshit ato me njëri-tjetrin.
Këtu na ndihmon Yandex.Cloud, e cila ofron balancues L3, ClickHouse dhe MySQL si shërbime me menaxhim. Përdoruesi vetëm duhet të tregojë parametrat dhe të presë derisa platforma t'i sjellë ato në gjendje funksionimi.
Unë u regjistrova, krijova një cloud dhe një llogari pagesash. Pas kësaj, hyra në cloud dhe ngrita klasterët MySQL dhe ClickHouse me konfigurime minimale. Prita derisa ato të bëhen aktive.


Gjithashtu, nuk duhet harruar tĂ« krijoni njĂ« bankĂ« tĂ« dhĂ«nash nĂ« çdo klaster dhe tĂ« konfiguroni aksesin nĂ« tĂ« me emrin dhe fjalĂ«kalimin. Nuk do tĂ« hyj nĂ« detaje kĂ«tu â nĂ« ndĂ«rfaqe gjithçka Ă«shtĂ« mjaft e qartĂ«.
Një detaj që nuk është i qartë ishte se këto baza të dhënash kanë shumë host-e, të cilat sigurojnë qëndrueshmërinë e tyre. Megjithatë, Grafana kërkon saktësisht një host për çdo bazë të dhënash me të cilën punon. Cloudi më çoi në një zgjidhje. Të duket se host-i i tipit c-<cluster_id>.rw.mdb.yandexcloud.net mapohet me host-in aktiv master të klasterit me id-në përkatëse. Pikërisht atë do t'i japim Grafanës.
Server web
Tani është radha e serverit web. Do të ngremë një makinë virtuale normale me Linux dhe do ta konfigurim manualisht Grafanën mbi të.


Do të lidhemi me ssh dhe do të instalojmë paketat e nevojshme.
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
Pas kësaj, do të ndihmojmë Grafanën përmes systemctl dhe do të instalojmë plugin-in për të punuar me ClickHouse (po, ai nuk është i përfshirë në paketën themelore).
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasourceTë gjitha, pas kësaj thjesht me komandën
sudo service grafana-server startne do të fillojmë serverin web. Tani mund të shkruajmë në shfletues IP-në e jashtme të makinës virtuale, të përcaktojmë portin 3000 dhe të shohim UI-në e bukur të Grafanës.

Por mos u nxito, përpara se të konfiguroni Grafanën, mos harroni t'i tregoni asaj rrugën drejt MySQL, që të ruajë konfigurimet atje.
Të gjitha konfigurimet e serverit web të Grafanës ndodhin në skedarin /etc/grafana/grafana.ini. Linja e nevojshme duket kështu:
;url =Ne e koha për të ndërlidhur hostin me klasterin MySQL. Në këtë skedë ndodhen emri dhe fjalëkalimi për qasjen në Grafana siç shihet në imazhin e mësipërm, të dyja përshekohen me të njëjtin vlerë prej default. admin.
Mund të përdorni komandat 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
Ka ardhur koha për ta rinuar serverin e uebit!
sudo service grafana-server restartTani në UI të Grafanës do të caktojmë ClickHouse si DataSource.
Arrita të kem një konfigurim funksional me këto cilësime:

Si URL kam vendosur https://c-.rw.mdb.yandexcloud.net:8443
Këtu! Kemi një makinë virtuale funksionale me serverin e uebit të lidhur me CH dhe MySQL. Tashmë mund të ngarkohet dataset në ClickHouse dhe të ndërtohen dashboard-e. Megjithatë, ende nuk e kemi arritur qëllimin tonë dhe nuk kemi krijuar një infrastrukturë të plotë.
Packer
Yandex.Cloud lejon krijimin e një imazhi disku të një makine virtuale ekzistuese, dhe mbi këtë bazë - sa më shumë makina identike. Pikërisht kështu do ta shfrytëzojmë këtë mundësi. Për të mbledhur imazhin lehtësisht, do të përdorim një mjet nga HashiCorp. Ai pranon si input një skedë json me udhëzimin për ndërtimin e imazhit.
Skeda jonë json do të përbëhet nga dy blloqe: builders dhe provisioners. Blloku i parë përshkruan parametrat e imazhit si entitet dhe blloku i dytë - udhëzimin për mbushjen me përmbajtjen e nevojshme.
Builders
{
"builders": [
{
"type": "yandex",
"endpoint": "{{user `endpoint`}}",
"folder_id": "",
"subnet_id": "{{user `subnet_id`}}",
"zone": "{{user `zone`}}",
"labels": {},
"use_ipv4_nat": true,
"use_internal_ip": false,
"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"
}
],
...
}Në këtë shabllon duhet të caktoni identifikuesin e seksionit në cloud ku dëshironi të krijoni imazhin, si dhe rrugën për skedën me çelësat e llogarisë shërbyese, e cila duhet të jetë krijuar më parë në këtë seksion. Më shumë rreth krijimit të llogarive shërbyese dhe çelësave në formë skede mund të lexoni në seksionin përkatës .
Kjo konfigurim thotë që imazhi i diskut do të ndërtohet mbi platformën ubuntu-1804-lts, i vendosur në seksionin përkatës të përdoruesit në familjen e imazheve GRAFANA me emrin grafana-{{timestamp}}.
Provisioners
Pjesa më interesante e konfigurimit tani. Ajo do të përshkruajë se si duhet të veprohet në makinat virtuale para se të ngrijmë gjendjen e saj në një imazh disku.
{
...,
"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"
]
}
]
}Të gjitha veprimet janë të ndara në 3 etapa. Në etapën e parë, ekzekutohet një skenar i thjeshtë që krijon një direktori ndihmëse.
prepare-ctg.sh:
#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafanaNë etapën tjetër, në këtë direktor, vendosim skenarin që duhet të ekzekutohet menjëherë pas nisjes së makinës virtuale. Ky skenar do të vendosë variablat e përdoruesit në konfigurimin e Grafanës dhe do të rinisë serverin web.
setup.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 restartPas kësaj, mbetet të bëhen 3 gjëra:
1) të instalohet paketat
2) të aktivizohet Grafana me systemctl dhe të instalohet plugin ClickHouse
3) të vendoset skenari setup.sh në radhë për t'u ekzekutuar menjëherë pas nisjes së makinës virtuale.
install-packages.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 grafana-setup.sh:
#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasourcerun-setup-at-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;Tani mbetet të ekzekutohet Packer dhe të kemi një imazh të vendosur në divisionin e specifikuar. Gjatë krijimit të makinës virtuale, mund të zgjidhni atë si disk nisës dhe pas nisjes të merrni një server web të gatshëm të Grafanës.


Grupi i instancave dhe balancuesi
Pasi të krijohet imazhi i diskut që lejon krijimin e shumë serverëve web të njëjtë të Grafanës, mund të krijojmë një grup instancash. Në platformën Yandex.Cloud, ky term i referohet një bashkimi të makinave virtuale që kanë karakteristika të njëjta. Gjatë krijimit të grupit të instancave, konfigurohet prototipi i të gjitha makinave në këtë grup, dhe pastaj karakteristikat e vetë grupit (p.sh., numri minimal dhe maksimal i makinave aktive). Nëse numri aktual nuk përputhet me këto kritere, grupi i instancave do të fshijë vetë makinat e panevojshme ose do të krijojë të reja sipas imazhit dhe ngjashmërisë.
Në kuadër të detyrës sonë, do të krijojmë një grup instancash të serverëve web, të cilat do të krijohen nga imazhi i diskut të krijuar më parë.


Me vĂ«rtetĂ« e veçantĂ« Ă«shtĂ« konfigurimi i fundit i grupit tĂ« instancave. Grupi i synuar nĂ« integrimin me Load Balancer do tĂ« ndihmojĂ«, me njĂ« tĂ« shtypur tĂ« disa dĂŒtyrave, tĂ« konfigurojĂ« L3-balancer mbi makinat virtuale tĂ« kĂ«tij grupi.

Në konfigurimin e balancer-it realizova dy pika të rëndësishme:
- E vendosa balancer-in që të pranojë trafik përdoruesi në portin 80, duke e redirectuar atë në portin 3000 të makinave virtuale, aty ku qëndron Grafana.
- Konfigurova kontrollin e jetës së makinave duke i pinguar ato në portin 3000.

Mini përfundim
M finally we managed to manually deploy the desired infrastructure of the application, and now we have a highly available Grafana service. Itâs only necessary to know the IP address of the balancer as the entry point into the application and the host of the ClickHouse cluster to load the dataset into it.
Duket si njĂ« fitore? Po, Ă«shtĂ« njĂ« fitore. Por diçka po shqetĂ«son gjithsesi. I gjithĂ« procesi mĂ« sipĂ«r kĂ«rkon shumĂ« veprime manuale dhe nuk Ă«shtĂ« aspak i shkallĂ«zueshĂ«m, prandaj dĂ«shiroj ta automatizoj sa mĂ« shumĂ« tĂ« jetĂ« e mundur. KĂ«saj do tâi kushtohet seksioni i ardhshĂ«m.
Integrimi me Terraform
Sërish do të përdorim një mjet nga kompania HashiCorp i quajtur . Ai do të ndihmojë, me një të shtypur të butonit, të zhvillohet e gjithë infrastruktura e aplikacionit, bazuar në disa variabla të përcaktuar nga përdoruesi. Le të shkruajmë një recetë që mund të ekzekutohet shumë herë në seksione të ndryshme të përdoruesve të ndryshëm.
E gjithë puna me Terraform përqendrohet në shkrimin e një skedari konfigurimi (*.tf) dhe krijimin e infrastrukturës mbi këtë bazë.
Variablat
Në fillim të skedarit do të nxjerrim variablat, të cilat varen nga vendi dhe si do të zhvillohet infrastruktura e ardhshme.
variable "oauth_token" {
type = string
default = ""
}
variable "cloud_id" {
type = string
default = ""
}
variable "folder_id" {
type = string
default = ""
}
variable "service_account_id" {
type = string
default = ""
}
variable "image_id" {
type = string
default = ""
}
variable "username" {
type = string
default = ""
}
variable "password" {
type = string
default = ""
}
variable "dbname" {
type = string
default = ""
}
variable "public_key_path" {
type = string
default = ""
}I gjithë procesi i zhvillimit të aplikacionit do të reduktohet në ndërtimin e imazhit të disku dhe vendosjen e këtyre variablave. Do të shpjegoj se për çfarë përgjigjen ato:
oauth_token â njĂ« token pĂ«r akses nĂ« cloud. Mund tĂ« merret nga .
cloud_id â identifikuesi i cloud-it, ku do tĂ« zhvillohet aplikacioni
folder_id â identifikuesi i seksionit ku do tĂ« zhvillojmĂ« aplikacionin
service_account_id â identifikuesi i llogarisĂ« sĂ« shĂ«rbimit nĂ« seksionin pĂ«rkatĂ«s tĂ« reve.
image_id â identifikuesi i imazhit tĂ« diskut, i marrĂ« me Packer
username dhe password â emri i pĂ«rdoruesit dhe fjalĂ«kalimi pĂ«r akses nĂ« tĂ« dyja bazat e tĂ« dhĂ«nave dhe nĂ« serverin web tĂ« GrafanĂ«s
dbname â emri i bazĂ«s sĂ« tĂ« dhĂ«nave brenda grupeve CH dhe MySQL
public_key_path â rruga drejt skedarit me çelĂ«sin tuaj publik ssh, me tĂ« cilin do tĂ« lidheni nĂ«n emrin ubuntu tek makinat virtuale me servera web
Konfigurimi i ofruesit
Tani duhet tĂ« konfiguroni ofruesin e Terraform â nĂ« rastin tonĂ« Yandex:
provider "yandex" {
token = var.oauth_token
cloud_id = var.cloud_id
folder_id = var.folder_id
zone = "ru-central1-a"
}
Vini re se këtu po përdorim variablët e përcaktuar më lart.
Rrjeti dhe grupet
Tani do të krijojmë një rrjet në të cilin do të komunikojnë elementet e infrastrukturës tonë, tre subnet (një në secilin rajon) dhe do të ngremë grupet CH dhe 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
}
}Si e vërtetë, secili nga dy klasterët është krijuar mjaft i qëndrueshëm duke u shpërndarë në tre zona disponueshmërie.
Serverët e uebit
Në dukje, mund të vazhdoja në të njëjtën mënyrë, por u përballa me një vështirësi. Më parë, unë fillimisht ngrita klasterin MySQL dhe vetëm më pas, duke ditur ID-në e tij, krijoja imazhin e disks me konfigurimin e nevojshëm, ku specifikoja hostin e klasterit. Por tani nuk e dimë ID-në e klasterit para se të fillojmë Terraform, përfshirë dhe në momentin e ndërtimit të imazhit. Prandaj më duhej të përdorja këtë .
Duke përdorim shërbimin e metadatas nga Amazon, ne do t'i dërgojmë makinerisë virtuale disa parametra, të cilat ajo do i pranojë dhe përpunojë. Ne duhet që, pas aktivizimit, makina të shkojë në metadata për hostin e klastras MySQL dhe për emrin e përdoruesit dhe fjalëkalimin, të cilat përdoruesi i kishte caktuar në skedarin Terraform. Do ta ndryshojmë pak përmbajtjen e skedarit setup.sh, i cili aktivizohet kur aktivizohet makineria virtuale.
setup.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 restartGrupi i instancave dhe balancuesi
Pasi të kemi rikonstruktuar imazhin e ri të diskut, ne mund të shtojmë përfundimisht skedarin tonë për Terraform.
Do të tregojmë se duam të përdorim imazhin ekzistues të diskut:
data "yandex_compute_image" "grafana_image" {
image_id = var.image_id
}Tani do të krijojmë një grup instancash:
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"
}
}Vlen të theksohet se si i kemi dërguar në metadata cluster_uri, username dhe password. Ajo është që makina virtuale, kur aktivizohet, do ta nxjerrë dhe do ta vendosë në konfigurimin e Grafanës.
Kemi përfunduar me balancuesin.
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
}
}
}
}Pak sheqer
Ka mbetur vetëm një detyrë e vogël. Pasi infrastruktura të jetë instaluar, do të duhet të shkojmë në UI të Grafanës dhe të shtojmë me dorë klasrin CH (ID e të cilit duhet të nxirret ende) si Burim të Dhënash. Por ID e klasit e di Terraform. Do t'i japim atij për të përfunduar punën.
Do tĂ« shtojmĂ« njĂ« ofrues tĂ« ri â Grafana, dhe si host do t'i japim adresĂ«n IP tĂ« balansuesit. TĂ« gjitha ndryshimet qĂ« do tĂ« bĂ«jĂ« Terraform nĂ« makinĂ«, ku do tĂ« caktojĂ« balansuesi, do tĂ« grumbullohen nĂ« MySQL, dhe kĂ«shtu do tĂ« ndodhin nĂ« tĂ« gjitha makinat e tjera.
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"
}Do tâi japim njĂ« stilim
Do të nxjerrim adresën IP të balansuesit dhe hostin e klasterit 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"
}Mund të nisni
E gjitha! Skedari ynë i konfigurimit është përfunduar dhe tani, duke vendosur variablat, mund t'i themi Terraform-it të ngrejë të gjitha ato që përshkruam më sipër. Të gjithë procesi më mori rreth 15 minuta.
Në fund mund të shihni një mesazh të bukur:
Aplikimi përfundoi! Burimet: 9 të shtuar, 0 të ndryshuara, 0 të shkatërrohen.
Daljet:
clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25Dhe në re do të jenë të dukshme elementet e infrastrukturës së ngritur:

Le të përmbledhim
Tani, me shembullin e GrafanĂ«s, secili nga ju di si tĂ« zhvilloni aplikacione me njĂ« arkitekturĂ« tĂ« zgjuar nĂ« platformĂ«n Yandex.Cloud. NĂ« kĂ«tĂ«, mund t'ju ndihmojnĂ« mjete tĂ« dobishme nga HashiCorp, si Packer dhe Terraform. Shpresoj qĂ« kjo artikull tĂ« jetĂ« e dobishme pĂ«r dikĂ« đ
P.S. Më poshtë do të shtoj një lidhje në depo, ku mund të gjeni receta të gatshme për Packer dhe Terraform, disa nga fragmentet që përmenda në këtë artikull.
Burimi: habr.com
