Add monitoring auto-deployment
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
authorized_key.json
|
||||
*.pem
|
||||
*.key
|
||||
*.pub
|
||||
|
||||
.terraform/
|
||||
*.tfstate
|
||||
*.tfstate.*
|
||||
crash.log
|
||||
crash.*.log
|
||||
*.tfvars
|
||||
*.tfvars.json
|
||||
override.tf
|
||||
override.tf.json
|
||||
*_override.tf
|
||||
*_override.tf.json
|
||||
.terraform.lock.hcl
|
||||
|
||||
*.retry
|
||||
.vault_pass.txt
|
||||
inventory.ini
|
||||
host_vars/
|
||||
@@ -0,0 +1,2 @@
|
||||
[defaults]
|
||||
host_key_checking = False
|
||||
@@ -0,0 +1,3 @@
|
||||
monitoring_dir: /opt/monitoring
|
||||
node_exporter_version: "1.12.1"
|
||||
node_exporter_arch: "amd64"
|
||||
@@ -0,0 +1,20 @@
|
||||
$ANSIBLE_VAULT;1.1;AES256
|
||||
31613364333637343830653564643662323365306334656633626339356261613161323564666234
|
||||
3431373364663734626539353264343633303862616133320a363739313230616566316234656262
|
||||
62396666633634323339316265393136383232386566653364626436623939323362353063373835
|
||||
3132386436313536660a306334653032353038383166303535353262373335343361626564353366
|
||||
34316439303334323839396535343237613437356632336131373561323862363864666161656137
|
||||
64663231316337343838386338313065336135313535333738616162646430343863393961396432
|
||||
34383066666335386330353536333664353566623964616132323964613961663732336565343066
|
||||
31643031626261326138633131303638336465376664653366646331333961396139636336643232
|
||||
66323339373133346439646237303732383138393762643331336636333965336335643433343265
|
||||
61306533373932396366613233356539393339346133616631663738613862373464306434396538
|
||||
37626566326532363131356239656339386662363931343930633630393636383261613832313037
|
||||
38623766653133626238393165356630623238653765343262613832313230653334393764326466
|
||||
37383630343830636630313964303731623363383234626632626236333035636465356365353863
|
||||
36636531613762396364643732356635336232336334633561623632633931613339303230383639
|
||||
62343963636531343939623965656263306631356435626236623232616636643939393038353135
|
||||
63636665633835623034353566323530613762623361363535316634363034626264393738613938
|
||||
39633631663631666163623562666163386634336631343439646238323733303333346431376433
|
||||
36373036323631316164656131626530646339323939316630626438376632386337643862383330
|
||||
613532623061623364333765363739386564
|
||||
+177
@@ -0,0 +1,177 @@
|
||||
---
|
||||
- name: Deploy Monitoring on general_server
|
||||
hosts: general_server
|
||||
become: yes
|
||||
vars_files:
|
||||
- group_vars/all/vars.yml
|
||||
- group_vars/all/vault.yml
|
||||
|
||||
tasks:
|
||||
- name: Создание системного юзера
|
||||
ansible.builtin.user:
|
||||
name: metrics
|
||||
state: present
|
||||
shell: /usr/sbin/nologin
|
||||
|
||||
- name: Создать директории для проекта
|
||||
ansible.builtin.file:
|
||||
path: "{{ item }}"
|
||||
state: directory
|
||||
mode: '0755'
|
||||
owner: metrics
|
||||
group: metrics
|
||||
loop:
|
||||
- "{{ monitoring_dir }}"
|
||||
- "{{ monitoring_dir }}/grafana_provisioning"
|
||||
|
||||
- name: Устанавливаем Docker и утилиты
|
||||
apt:
|
||||
name:
|
||||
- docker.io
|
||||
- docker-compose
|
||||
- python3-pip
|
||||
- ufw
|
||||
- git
|
||||
- htop
|
||||
- rsync
|
||||
state: present
|
||||
update_cache: yes
|
||||
|
||||
- name: Скопировать конфигурации сервисов
|
||||
ansible.builtin.template:
|
||||
src: "{{ item.src }}"
|
||||
dest: "{{ monitoring_dir }}/{{ item.dest }}"
|
||||
mode: '0644'
|
||||
owner: metrics
|
||||
group: metrics
|
||||
loop:
|
||||
- { src: "prometheus.yml.j2", dest: "prometheus.yml" }
|
||||
- { src: "prometheus-web.yml.j2", dest: "prometheus-web.yml" }
|
||||
- { src: "node-exporter-web.yml.j2", dest: "node-exporter-web.yml" }
|
||||
- { src: "grafana-datasource.yml.j2", dest: "grafana_provisioning/datasource.yml" }
|
||||
- { src: "docker-compose.yml.j2", dest: "docker-compose.yml" }
|
||||
|
||||
notify: Restart docker-compose
|
||||
|
||||
- name: Запустить Docker Compose
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: "{{ monitoring_dir }}"
|
||||
state: present
|
||||
|
||||
handlers:
|
||||
- name: Restart docker-compose
|
||||
community.docker.docker_compose_v2:
|
||||
project_src: "{{ monitoring_dir }}"
|
||||
state: restarted
|
||||
|
||||
# ==============================================================================================================
|
||||
|
||||
- name: Deploy Exporter on other servers
|
||||
hosts: all
|
||||
become: yes
|
||||
vars_files:
|
||||
- group_vars/all/vars.yml
|
||||
- group_vars/all/vault.yml
|
||||
|
||||
tasks:
|
||||
- name: Создание системного юзера
|
||||
ansible.builtin.user:
|
||||
name: metrics
|
||||
state: present
|
||||
shell: /usr/sbin/nologin
|
||||
|
||||
- name: Установить понятное имя хоста с индексом
|
||||
ansible.builtin.hostname:
|
||||
name: "node-{{ ansible_play_hosts.index(inventory_hostname) }}"
|
||||
when: ansible_play_hosts.index(inventory_hostname) > 0
|
||||
notify: restart node-exporter
|
||||
|
||||
- name: Создать директории для проекта
|
||||
ansible.builtin.file:
|
||||
path: "{{ monitoring_dir }}"
|
||||
state: directory
|
||||
mode: '0700'
|
||||
owner: metrics
|
||||
group: metrics
|
||||
|
||||
- name: Устанавливаем Docker и утилиты
|
||||
apt:
|
||||
name:
|
||||
- python3-pip
|
||||
- ufw
|
||||
- git
|
||||
- htop
|
||||
- rsync
|
||||
state: present
|
||||
update_cache: yes
|
||||
|
||||
- name: Создать системного пользователя для Node Exporter
|
||||
ansible.builtin.user:
|
||||
name: node_exporter
|
||||
shell: /usr/sbin/nologin
|
||||
system: true
|
||||
create_home: false
|
||||
|
||||
- name: Создать директорию под конкретную версию
|
||||
ansible.builtin.file:
|
||||
path: "/opt/node_exporter-{{ node_exporter_version }}"
|
||||
state: directory
|
||||
owner: node_exporter
|
||||
group: node_exporter
|
||||
mode: '0700'
|
||||
|
||||
- name: Скачать и распаковать архив экспортера
|
||||
ansible.builtin.unarchive:
|
||||
src: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-{{ node_exporter_arch }}.tar.gz"
|
||||
dest: "/opt/node_exporter-{{ node_exporter_version }}"
|
||||
remote_src: true
|
||||
extra_opts:
|
||||
- "--strip-components=1"
|
||||
creates: "/opt/node_exporter-{{ node_exporter_version }}/node_exporter"
|
||||
owner: node_exporter
|
||||
group: node_exporter
|
||||
|
||||
- name: Создать симлинк на исполняемый файл
|
||||
ansible.builtin.file:
|
||||
src: "/opt/node_exporter-{{ node_exporter_version }}/node_exporter"
|
||||
dest: "/usr/local/bin/node_exporter"
|
||||
state: link
|
||||
force: true
|
||||
|
||||
- name: Создать директорию для конфигурации экспортера
|
||||
ansible.builtin.file:
|
||||
path: /etc/node_exporter
|
||||
state: directory
|
||||
owner: node_exporter
|
||||
group: node_exporter
|
||||
mode: '0750'
|
||||
|
||||
- name: Скопировать конфиг веб-авторизации для Node Exporter
|
||||
ansible.builtin.template:
|
||||
src: node-exporter-web.yml.j2
|
||||
dest: /etc/node_exporter/web.yml
|
||||
owner: node_exporter
|
||||
group: node_exporter
|
||||
mode: '0600'
|
||||
|
||||
- name: Создать systemd unit файл
|
||||
ansible.builtin.template:
|
||||
src: node_exporter.service.j2
|
||||
dest: /etc/systemd/system/node_exporter.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
notify: restart node-exporter
|
||||
|
||||
- name: Включить автозапуск и запустить сервис
|
||||
ansible.builtin.systemd_service:
|
||||
name: node_exporter
|
||||
state: started
|
||||
enabled: true
|
||||
|
||||
handlers:
|
||||
- name: restart node-exporter
|
||||
ansible.builtin.systemd_service:
|
||||
name: node_exporter
|
||||
state: restarted
|
||||
daemon_reload: true
|
||||
@@ -0,0 +1,42 @@
|
||||
services:
|
||||
prometheus:
|
||||
image: prom/prometheus:latest
|
||||
container_name: prometheus
|
||||
ports:
|
||||
- "9090:9090"
|
||||
volumes:
|
||||
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
||||
- ./prometheus-web.yml:/etc/prometheus/prometheus-web.yml:ro
|
||||
- prom_data:/prometheus
|
||||
|
||||
command:
|
||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||
- '--web.config.file=/etc/prometheus/prometheus-web.yml'
|
||||
- '--storage.tsdb.path=/prometheus'
|
||||
- '--web.enable-admin-api'
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
grafana:
|
||||
image: grafana/grafana:latest
|
||||
container_name: grafana
|
||||
ports:
|
||||
- "3001:3000"
|
||||
volumes:
|
||||
- ./grafana_provisioning/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml:ro
|
||||
- grafana_data:/var/lib/grafana
|
||||
|
||||
environment:
|
||||
- GF_SECURITY_ADMIN_USER="{{ grafana_admin_user }}"
|
||||
- GF_SECURITY_ADMIN_PASSWORD="{{ grafana_admin_password }}"
|
||||
- GF_USERS_ALLOW_SIGN_UP=false
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
depends_on:
|
||||
- prometheus
|
||||
|
||||
volumes:
|
||||
prom_data:
|
||||
grafana_data:
|
||||
@@ -0,0 +1,12 @@
|
||||
apiVersion: 1
|
||||
|
||||
datasources:
|
||||
- name: Prometheus
|
||||
type: prometheus
|
||||
access: proxy
|
||||
url: http://prometheus:9090
|
||||
basicAuth: true
|
||||
basicAuthUser: {{ prom_admin_user }}
|
||||
secureJsonData:
|
||||
basicAuthPassword: {{ prom_admin_password }}
|
||||
isDefault: true
|
||||
@@ -0,0 +1,2 @@
|
||||
basic_auth_users:
|
||||
{{ exporter_user }}: "{{ exporter_password | password_hash('bcrypt') }}"
|
||||
@@ -0,0 +1,24 @@
|
||||
[Unit]
|
||||
Description=Node Exporter
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
User=node_exporter
|
||||
Group=node_exporter
|
||||
Type=simple
|
||||
ExecStart=/usr/local/bin/node_exporter \
|
||||
--web.config.file=/etc/node_exporter/web.yml
|
||||
|
||||
# Контроль падений и перезапуск
|
||||
Restart=always
|
||||
RestartSec=5s
|
||||
|
||||
# Ограничения безопасности процесса
|
||||
NoNewPrivileges=true
|
||||
ProtectSystem=strict
|
||||
ProtectHome=true
|
||||
PrivateTmp=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
@@ -0,0 +1,2 @@
|
||||
basic_auth_users:
|
||||
{{ prom_admin_user }}: "{{ prom_admin_password | password_hash('bcrypt') }}"
|
||||
@@ -0,0 +1,23 @@
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: "prometheus"
|
||||
scrape_interval: 15s
|
||||
basic_auth:
|
||||
username: "{{ prom_admin_user }}"
|
||||
password: "{{ prom_admin_password }}"
|
||||
static_configs:
|
||||
- targets: ["localhost:9090"]
|
||||
|
||||
- job_name: "node_exporter"
|
||||
basic_auth:
|
||||
username: "{{ exporter_user }}"
|
||||
password: "{{ exporter_password }}"
|
||||
static_configs:
|
||||
{% for host in groups['servers'] %}
|
||||
- targets: ["{{ hostvars[host]['ansible_host'] }}:9100"]
|
||||
labels:
|
||||
nodename: "{{ host }}"
|
||||
{% endfor %}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
locals {
|
||||
ssh_user = "ubuntu"
|
||||
ssh_private_key = "~/.ssh/ssh-key-1789658954721"
|
||||
}
|
||||
|
||||
resource "local_file" "ansible_host_vars" {
|
||||
count = length(yandex_compute_instance.server)
|
||||
filename = "${path.module}/../host_vars/${yandex_compute_instance.server[count.index].name}.yml"
|
||||
directory_permission = "0755"
|
||||
file_permission = "0644"
|
||||
content = <<-EOT
|
||||
ansible_host: "${yandex_compute_instance.server[count.index].network_interface.0.nat_ip_address}"
|
||||
ansible_user: "${local.ssh_user}"
|
||||
ansible_ssh_private_key_file: "${local.ssh_private_key}"
|
||||
EOT
|
||||
}
|
||||
|
||||
resource "local_file" "ansible_inventory" {
|
||||
filename = "${path.module}/inventory.ini"
|
||||
directory_permission = "0755"
|
||||
file_permission = "0644"
|
||||
content = templatefile("${path.module}/inventory.ini.tftpl", {
|
||||
hosts = yandex_compute_instance.server[*].name
|
||||
})
|
||||
depends_on = [local_file.ansible_host_vars]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
[servers]
|
||||
general_server
|
||||
%{ for host in hosts ~}
|
||||
${host}
|
||||
%{ endfor ~}
|
||||
Binary file not shown.
@@ -0,0 +1,48 @@
|
||||
data "yandex_compute_image" "ubuntu" {
|
||||
family = "ubuntu-2204-lts"
|
||||
}
|
||||
|
||||
resource "yandex_vpc_network" "main_network" {
|
||||
name = "main-network"
|
||||
}
|
||||
|
||||
resource "yandex_vpc_subnet" "main_subnet" {
|
||||
name = "main-subnet"
|
||||
zone = "ru-central1-a"
|
||||
network_id = yandex_vpc_network.main_network.id
|
||||
v4_cidr_blocks = ["192.168.10.0/24"]
|
||||
}
|
||||
|
||||
resource "yandex_compute_instance" "server" {
|
||||
count = 5
|
||||
|
||||
name = "server_${count.index + 1}"
|
||||
platform_id = "standard-v3"
|
||||
zone = "ru-central1-a"
|
||||
|
||||
resources {
|
||||
cores = 2
|
||||
memory = 2
|
||||
}
|
||||
|
||||
boot_disk {
|
||||
initialize_params {
|
||||
image_id = data.yandex_compute_image.ubuntu.id
|
||||
size = 15
|
||||
}
|
||||
}
|
||||
|
||||
network_interface {
|
||||
subnet_id = yandex_vpc_subnet.main_subnet.id
|
||||
nat = true
|
||||
}
|
||||
|
||||
metadata = {
|
||||
ssh-keys = "ubuntu:${file("~/.ssh/ssh-key-1789658954721.pub")}"
|
||||
}
|
||||
}
|
||||
|
||||
output "public_ips" {
|
||||
description = "Публичные IP адреса созданных серверов"
|
||||
value = yandex_compute_instance.server[*].network_interface.0.nat_ip_address
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
yandex = {
|
||||
source = "yandex-cloud/yandex"
|
||||
}
|
||||
}
|
||||
required_version = ">= 0.13"
|
||||
}
|
||||
provider "yandex" {
|
||||
service_account_key_file = "authorized_key.json"
|
||||
cloud_id = "b1gl9hdpdr35i83uh5t5"
|
||||
folder_id = "b1gbb5kej5tlskp8i5oq"
|
||||
zone = "ru-central1-a"
|
||||
}
|
||||
Reference in New Issue
Block a user