Projekt automatyzuje pelny cykl IaC:
- provisioning infrastruktury Azure przez Terraform,
- bootstrap i konfiguracje hostow przez Ansible,
- uruchomienie Zabbix Server/Web/DB przez Docker Compose,
- instalacje i konfiguracje Zabbix Agent 2 na obu VM.
Topologia:
group8VM(grupaazure_vm): host glowny, Docker + Zabbix (web na porcie80), lokalny Agent 2,group8AgentVM(grupaagent_vm): host monitorowany, Agent 2 + Nginx + MariaDB.
Kolejnosc uruchomienia (make deploy):
terraform inititerraform applytworza zasoby oraz generujaansible/inventory.ini.ansible/playbook.yamluruchamia rolebase,docker,zabbix_server,zabbix_agent,zabbix_config,nginx,mariadbdla odpowiednich grup (azure_vm,agent_vm) i uzywa sekretowpg_monitor_passwordorazzabbix_api_passwordz Vault.- Rola
zabbix_serverkopiujeansible/roles/zabbix_server/files/docker-compose.yamlorazansible/roles/zabbix_server/files/.envna host glowny i uruchamia stack kontenerow, azabbix_agentkonfiguruje natywnego agenta. - Rola
zabbix_configczeka na pelna gotowosc API/DB Zabbixa i automatycznie tworzy/aktualizuje hosty monitorowane przez API. make openprobuje otworzychttp://<public_ip_address>z outputu Terraform.
Istotne zaleznosci:
ansible/playbook.yamlwymaga lokalnego plikuansible/roles/zabbix_server/files/.env.ansible/playbook.yamlwymaga odszyfrowywalnegoansible/secrets.yml.- inventory jest artefaktem Terraform (
local_file) i moze zostac nadpisane przy kolejnymapply.
Makefile- orchestration (init,plan,apply,provision,deploy,destroy).terraform/main.tf- RG, VNet, Subnet, NSG, NIC, 2x VM i zasoby pomocnicze.terraform/inventory.tf- generatoransible/inventory.ini(resourcelocal_file).terraform/outputs.tf- outputy Terraform (public_ip_address,agent_private_ip).terraform/templates/ansible_inventory.tftpl- szablon inventory dla Ansible.ansible/playbook.yaml- glowny playbook uruchamiajacy role dla obu VM.ansible/ansible.cfg- lokalna konfiguracja Ansible (inventory, roles_path, SSH).ansible/requirements.yml- kolekcje Ansible wymagane przez role.ansible/group_vars/azure_vm.yml- zmiennezabbix_agentorazhttpapidla rolizabbix_config.ansible/group_vars/agent_vm.yml- zmiennezabbix_agentdla hosta monitorowanego.ansible/roles/base/tasks/main.yaml- wspolne taski bazowe (pakiety + klucze SSH).ansible/roles/docker/tasks/main.yaml- instalacja Dockera i Compose naazure_vm.ansible/roles/zabbix_server/tasks/main.yaml- uruchomienie Zabbix Server/Web/DB przez Docker Compose naazure_vm.ansible/roles/zabbix_agent/tasks/main.yaml- instalacja i konfiguracja Zabbix Agent 2 na hostach.ansible/roles/nginx/tasks/main.yaml- osobna konfiguracja Nginx naagent_vm.ansible/roles/mariadb/tasks/main.yaml- osobna konfiguracja MariaDB naagent_vm.ansible/roles/zabbix_server/files/docker-compose.yaml-mysql:8.0,zabbix-server,zabbix-web.ansible/roles/zabbix_server/files/.env.example- template zmiennych dla Compose.ansible/secrets.example.yml- template sekretow do zaszyfrowania Vaultem.
Niezbedne narzedzia lokalnie:
terraformansibleansible-galaxy(do instalacji kolekcji)az(Azure CLI)ssh-keygen
Wymagane kolekcje Ansible (wersje przypiete dla powtarzalnosci):
ansible-galaxy collection install -r ansible/requirements.ymlAktualny zestaw zaklada:
community.docker==3.7.0(kompatybilne zansible-core 2.16.x),community.zabbix==4.1.1(kompatybilne z Zabbix 7.0 API).
Możesz tez uzyc celu Makefile:
make ansible-depsAutoryzacja Azure:
az login
az account showUtworz plik runtime dla Compose:
cp ansible/roles/zabbix_server/files/.env.example ansible/roles/zabbix_server/files/.envMinimalna konfiguracja:
MYSQL_ROOT_PASSWORD=STRONG_ROOT_PASSWORD
MYSQL_USER=zabbix
MYSQL_PASSWORD=STRONG_ZABBIX_PASSWORD
MYSQL_DATABASE=zabbixUwagi:
ansible/roles/zabbix_server/files/.envjest ignorowane przez.gitignore.- brak pliku przerwie playbook
ansible/playbook.yamlna tasku kopiowania.env.
Przygotowanie i szyfrowanie:
cp ansible/secrets.example.yml ansible/secrets.yml
ansible-vault encrypt ansible/secrets.ymlEdycja zaszyfrowanego pliku:
ansible-vault edit ansible/secrets.ymlMinimalne sekrety wymagane przez playbook:
pg_monitor_password: "<haslo_uzytkownika_mysql_monitoring>"
zabbix_api_password: "<haslo_uzytkownika_api_zabbix>"make provision uruchamia playbook z --ask-vault-pass, wiec haslo Vault jest wymagane interaktywnie.
Terraform i Ansible oczekuja klucza:
- prywatny:
terraform/.ssh/id_rsa - publiczny:
terraform/.ssh/id_rsa.pub
Generowanie:
mkdir -p terraform/.ssh
ssh-keygen -t rsa -b 4096 -f terraform/.ssh/id_rsa -N ""Playbooki referencuja dodatkowo klucze w terraform/.ssh/others/ (sekcja authorized_key). Jesli ich nie posiadasz, utworz:
mkdir -p terraform/.ssh/others
ssh-keygen -t rsa -b 4096 -f terraform/.ssh/others/id_rsa -N ""
ssh-keygen -t rsa -b 4096 -f terraform/.ssh/others/id_rsa_m -N ""make ansible-deps
make init
make plan
make apply AUTO=1
make ansible-check
make provision
make status
make openmake deployPo make deploy panel powinien otworzyc sie automatycznie (make deploy zawiera make open).
Konfiguracja hostow jest wykonywana automatycznie przez role zabbix_config.
Rola ustawia m.in.:
- host
group8AgentVM(interfejs na prywatnym IPagent_vm), - host
Zabbix server(interfejs na prywatnym IPazure_vm), - grupy hostow i template'y,
- makra
{$MYSQL.*}dla monitoringu MySQL.
Szybka walidacja po provisioning:
- Wejdz na
http://<public_ip_glownej_vm>i zaloguj sie do Zabbixa. - Przejdz do
Data collection -> Hostsi sprawdz, czygroup8AgentVMorazZabbix servermaja statusEnabled. - Dla hosta z chwilowym
Not availablekliknijCheck nowi odczekaj ~1 minute (agent i server potrzebuja czasu po restarcie). - Sprawdz metryki w
Monitoring -> Latest data.
Mapowanie IP i grup z infrastruktury:
group8VM(azure_vm) - host glowny Zabbixa.- interfejs dockerowy serwera Zabbix:
172.17.0.21. group8AgentVM(agent_vm) - host monitorowany dodawany w UI.- prywatny adres agenta:
10.0.1.4. - Aktualne adresy sprawdzaj w
ansible/inventory.ini(plik jest generowany przez Terraform).
Walidacja po konfiguracji:
make status
make ping
cat ansible/inventory.iniPonizsze komendy uruchamiaj po SSH na group8AgentVM jako uzytkownik z uprawnieniami sudo.
Szybki test endpointu:
curl -I http://127.0.0.1/Symulacja ruchu HTTP w tle i bez outputu:
nohup bash -c 'while true; do curl -s -o /dev/null http://127.0.0.1/; done' >/dev/null 2>&1 & echo $! > /tmp/zbx_http_load.pidZatrzymanie:
kill "$(cat /tmp/zbx_http_load.pid)"
rm -f /tmp/zbx_http_load.pidZaklada konto monitorujace zbx_monitor skonfigurowane przez Ansible.
Pojedynczy test logowania:
mysql -u zbx_monitor -p -h 127.0.0.1 -e "SELECT NOW();"Symulacja ruchu SQL w tle i bez outputu:
nohup bash -c 'export MYSQL_PWD="<haslo_zbx_monitor>"; while true; do mysql -u zbx_monitor -h 127.0.0.1 -e "SHOW STATUS LIKE "'"'Threads_connected'"'";" >/dev/null 2>&1; done' >/dev/null 2>&1 & echo $! > /tmp/zbx_sql_load.pidZatrzymanie:
kill "$(cat /tmp/zbx_sql_load.pid)"
rm -f /tmp/zbx_sql_load.pidObciazenie CPU w tle i bez outputu (2 procesy yes):
nohup bash -c 'yes >/dev/null 2>&1 & yes >/dev/null 2>&1 & wait' >/dev/null 2>&1 & echo $! > /tmp/zbx_cpu_load.pidDla mocniejszego obciazenia (4 procesy):
nohup bash -c 'yes >/dev/null 2>&1 & yes >/dev/null 2>&1 & yes >/dev/null 2>&1 & yes >/dev/null 2>&1 & wait' >/dev/null 2>&1 & echo $! > /tmp/zbx_cpu_load.pidZatrzymanie:
kill "$(cat /tmp/zbx_cpu_load.pid)"
pkill -f '^yes$' || true
rm -f /tmp/zbx_cpu_load.pidW trakcie testow monitoruj zuzycie CPU i load:
top
uptimeVault secret not found/Decryption failed: brakansible/secrets.ymllub bledne haslo Vault.copy .env failed: brakansible/roles/zabbix_server/files/.envlokalnie.UNREACHABLE!: niespojny klucz SSH, zly user, niedostepny host.- Zabbix UI na
:80nie odpowiada: kontenery jeszcze startuja lub blad DB init. dbversion table was not found: API startuje szybciej niz inicjalizacja DB; rolazabbix_configma retry, ale przy pierwszym starcie moze to wydluzyc provisioning.[WARNING] Collection community.docker does not support Ansible version ...: sprawdz, czy kolekcje sa zainstalowane zansible/requirements.yml(w tym repo przypieta jest wersja3.7.0).- Rozjazd IP:
ansible/inventory.ininadpisywane przez Terraform, nie edytowac recznie trwale.
- Sekrety trzymaj tylko w
ansible/secrets.yml(Vault) i lokalnymansible/roles/zabbix_server/files/.env. - Nie commituj
terraform/.ssh/,ansible/secrets.yml,.env. - Ograniczaj publiczny dostep do NSG (obecnie otwarte
22i80globalnie). - Po testach usun zasoby, aby uniknac kosztow.
make destroy CONFIRM=YES AUTO=1Komenda usuwa zasoby Terraform utworzone w Azure.
- Paweł Buczek
- Michał Brzeziński,