This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
hashicorp_consul [2026/11/01 11:03] val |
hashicorp_consul [2026/11/01 15:14] (current) val |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Hashicorp Consul ====== | ====== Hashicorp Consul ====== | ||
| + | |||
| + | ==== Запуск ==== | ||
| <code> | <code> | ||
| server# docker run -d --name consul-dev -p 8500:8500 hashicorp/consul:2.1.0 agent -dev -client=0.0.0.0 | server# docker run -d --name consul-dev -p 8500:8500 hashicorp/consul:2.1.0 agent -dev -client=0.0.0.0 | ||
| - | | + | </code> |
| - | server$ curl --request PUT \ | + | ==== Добавление и мониторинг web сервисов ==== |
| - | --url http://localhost:8500/v1/agent/service/register \ | + | * [[Язык программирования Python#Доступ к каталогу по http]] на gate |
| + | <code> | ||
| + | $ curl --request PUT \ | ||
| + | --url http://server:8500/v1/agent/service/register \ | ||
| --header 'Content-Type: application/json' \ | --header 'Content-Type: application/json' \ | ||
| --data '{ | --data '{ | ||
| - | "ID": "web-app-1", | + | "ID": "web-app-N", |
| "Name": "web-service", | "Name": "web-service", | ||
| - | "Address": "192.168.13.10", | + | "Address": "192.168.X.1", |
| - | "Port": 80, | + | "Port": 8N, |
| "Check": { | "Check": { | ||
| "Name": "Web App HTTP Check", | "Name": "Web App HTTP Check", | ||
| - | "HTTP": "http://192.168.13.10:80/", | + | "HTTP": "http://192.168.X.1:8N/", |
| "Interval": "10s", | "Interval": "10s", | ||
| "Timeout": "1s" | "Timeout": "1s" | ||
| } | } | ||
| }' | }' | ||
| - | + | ... | |
| - | server$ curl --request PUT http://localhost:8500/v1/agent/service/deregister/web-app-1 | + | |
| + | $ curl -s "http://server:8500/v1/health/service/web-service" | ... | ||
| + | или | ||
| + | $ curl -s "http://server:8500/v1/health/service/web-service?passing=1" | ... | ||
| + | |||
| + | ... jq '.[] | .Node.Node as $node | .Service.ID as $sid | .Checks[] | {Node: $node, ServiceID: $sid, CheckName: .Name, Status: .Status}' | ||
| + | </code> | ||
| + | * [[Сервис Prometheus]] | ||
| + | <code> | ||
| + | server$ curl -s "http://localhost:8500/v1/health/service/web-service?passing=1" | \ | ||
| + | jq '[{ "targets": [ .[] | "\(.Service.Address):\(.Service.Port)" ], "labels": { "job": "web-service" } }]' \ | ||
| + | | tee /etc/prometheus/targets.json | ||
| + | </code> | ||
| + | |||
| + | ==== Удаление сервиса ==== | ||
| + | <code> | ||
| + | server$ ID=web-app-N | ||
| + | |||
| + | server$ curl --request PUT http://localhost:8500/v1/agent/service/deregister/$ID | ||
| + | </code> | ||
| + | ==== Пример с node-exporter ==== | ||
| + | |||
| + | * Prometheus [[Сервис Prometheus#Service Discovery]] | ||
| + | |||
| + | <code> | ||
| server$ curl --request PUT \ | server$ curl --request PUT \ | ||
| --data '{ | --data '{ | ||
| "ID": "node-exporter-gate", | "ID": "node-exporter-gate", | ||
| "Name": "node-exporter", | "Name": "node-exporter", | ||
| - | "Address": "192.168.13.1", | + | "Address": "192.168.X.1", |
| "Port": 9100 | "Port": 9100 | ||
| }' \ | }' \ | ||
| http://server:8500/v1/agent/service/register | http://server:8500/v1/agent/service/register | ||
| | | ||
| - | client1:~# cat register.sh | + | clientN:~# crontab -l |
| + | </code><code> | ||
| + | @reboot sleep 10; /usr/local/bin/register-in-consul.sh | ||
| + | </code><code> | ||
| #!/bin/bash | #!/bin/bash | ||
| Line 51: | Line 82: | ||
| }" \ | }" \ | ||
| http://server:8500/v1/agent/service/register | http://server:8500/v1/agent/service/register | ||
| + | </code> | ||
| + | |||
| + | ==== Пример с windows-exporter ==== | ||
| + | |||
| + | <code> | ||
| + | PS> mkdir C:\Scripts | ||
| + | |||
| + | PS> notepad C:\Scripts\register-in-consul.ps1 | ||
| + | </code><code> | ||
| + | $Hostname = [System.Net.Dns]::GetHostName() | ||
| + | $ServiceId = "windows-exporter-$Hostname" | ||
| + | |||
| + | $IpAddress = (Get-NetIPAddress -AddressFamily IPv4 | | ||
| + | Where-Object { $_.InterfaceAlias -notlike "*Loopback*" -and $_.IPAddress -notlike "169.254.*" } | | ||
| + | Select-Object -First 1).IPAddress | ||
| + | |||
| + | $Body = @{ | ||
| + | ID = $ServiceId | ||
| + | Name = "windows-exporter" | ||
| + | Address = $IpAddress | ||
| + | Port = 9182 | ||
| + | Meta = @{ | ||
| + | hostname = $Hostname | ||
| + | } | ||
| + | } | ConvertTo-Json -Compress | ||
| + | |||
| + | $Uri = "http://server:8500/v1/agent/service/register" | ||
| + | Invoke-RestMethod -Method Put -Uri $Uri -ContentType "application/json" -Body $Body | ||
| + | </code><code> | ||
| + | PS> PowerShell.exe -ExecutionPolicy Bypass -File C:\Scripts\register-in-consul.ps1 | ||
| + | |||
| + | PS Admin> | ||
| + | $Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Scripts\register-in-consul.ps1" | ||
| + | $Trigger = New-ScheduledTaskTrigger -AtStartup | ||
| + | $Trigger.Delay = "PT10S" | ||
| + | Register-ScheduledTask -TaskName "RegisterInConsul" -Action $Action -Trigger $Trigger -User "NT AUTHORITY\SYSTEM" -Force | ||
| + | |||
| + | PS Admin> Get-ScheduledTask -TaskName "RegisterInConsul" | ||
| </code> | </code> | ||