Краткий HowTo по установке и использованию Consul от Hashicorp.
Установка выполняется на Ubuntu 14.
Загрузить архив с Consul можно тут>>>.
Полная документация доступна тут>>>.
Содержание
Установка Consul
Загружаем архив с подходящей сборкой со страницы загрузок>>>:
$ cd /tmp/ $ wget https://releases.hashicorp.com/consul/0.6.3/consul_0.6.3_linux_amd64.zip $ unzip consul_0.6.3_linux_amd64.zip Archive: consul_0.6.3_linux_amd64.zip inflating: consul
Копируем исполняемый файл Consul в каталог из $PATH, например — /usr/local/bin:
$ sudo cp consul /usr/local/bin/
Проверяем:
$ consul -h
usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
configtest Validate config file
event Fire a new event
...
Запуск Consul-агента
Больше информации — тут>>>.
Запускаем агент в режиме разработки:
$ consul agent -dev
В случае ошибки вида:
$ ==> Starting Consul agent... ==> Error starting agent: Failed to get advertise address: Multiple private IPs found. Please configure one.
Добавьте опцию -bind с указанием IP, на котором будет работать Consul:
Получить IP можно так:
$ getip=$(ip a s | grep -E 'inet.*eth1' | awk '{print $2}' | cut -d"/" -f 1)
Запускаем:
$ consul agent -dev -bind $getip
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Node name: 'vagrant-ubuntu-trusty-64'
Datacenter: 'dc1'
Server: true (bootstrap: false)
Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
Cluster Addr: 10.11.100.41 (LAN: 8301, WAN: 8302)
Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
Atlas: <disabled>
==> Log data will now stream in as it occurs:
2016/02/01 10:40:49 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 10.11.100.41
2016/02/01 10:40:49 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64.dc1 10.11.100.41
...
Проверяем доступные ноды:
$ consul members Node Address Status Type Build Protocol DC vagrant-ubuntu-trusty-64 10.11.100.41:8301 alive server 0.6.3 2 dc1
Более полная информация:
$ consul members -detailed Node Address Status Tags vagrant-ubuntu-trusty-64 10.11.100.41:8301 alive build=0.6.3:c933efde,dc=dc1,port=8300,role=consul,vsn=2,vsn_max=3,vsn_min=1
Или с помощью API:
$ curl localhost:8500/v1/catalog/nodes
[{"Node":"vagrant-ubuntu-trusty-64","Address":"10.11.100.41","CreateIndex":3,"ModifyIndex":4}]
С помощью DNS:
$ dig @127.0.0.1 -p 8600 vagrant-ubuntu-trusty-64.node.consul ; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 vagrant-ubuntu-trusty-64.node.consul ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14279 ... ;; QUESTION SECTION: ;vagrant-ubuntu-trusty-64.node.consul. IN A ;; ANSWER SECTION: vagrant-ubuntu-trusty-64.node.consul. 0 IN A 10.11.100.41 ...
Добавление служб
Про сервисы больше информации тут>>>. — read here https://www.consul.io/docs/agent/services.html
Создадим директорию для файлов конфигурации:
$ sudo mkdir /etc/consul.d
Установим какой-то сервис, например — Apache HTTP:
$ sudo apt-get install apache2
Добавляем файл настроек для проверки сервиса — /etc/consul.d/apache2.json:
$ cat /etc/consul.d/apache2.json
{"service":
{
"name": "apache2",
"tags": ["httpd"],
"port": 80
}
}
Перезапускаем агент, указав опцию -config-dir:
$ consul agent -dev -bind $getip -config-dir /etc/consul.d
...
2016/02/01 11:01:28 [INFO] agent: Synced service 'apache2'
...
Проверяем все сервисы с помощью API:
$ curl -s localhost:8500/v1/catalog/services | python -m json.tool
{
"apache2": [
"httpd"
],
"consul": []
}
Только один добавленный сервис:
$ curl -s localhost:8500/v1/catalog/service/apache2 | python -m json.tool
[
{
"Address": "10.11.100.41",
"CreateIndex": 5,
"ModifyIndex": 5,
"Node": "vagrant-ubuntu-trusty-64",
"ServiceAddress": "",
"ServiceEnableTagOverride": false,
"ServiceID": "apache2",
"ServiceName": "apache2",
"ServicePort": 80,
"ServiceTags": [
"httpd"
]
}
]
Обратите внимание — при проверке всех сервисов — URI содержит «/catalog/services/«, а для проверки одного — «/catalog/service/«.
Проверка при помощи DNS-запроса:
$ dig @127.0.0.1 -p 8600 apache2.service.consul ; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 apache2.service.consul ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60121 ... ;; QUESTION SECTION: ;apache2.service.consul. IN A ;; ANSWER SECTION: apache2.service.consul. 0 IN A 10.11.100.41 ...
Хранилище KEY/VALUE
Больше информации — тут>>> и тут>>>.
Проверяем имеющиеся данные в хранилище:
$ curl -v http://localhost:8500/v1/kv/?recurse * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 8500 (#0) > GET /v1/kv/?recurse HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:8500 > Accept: */* > < HTTP/1.1 404 Not Found < X-Consul-Index: 1 < X-Consul-Knownleader: true < X-Consul-Lastcontact: 0 < Date: Mon, 01 Feb 2016 11:16:44 GMT < Content-Length: 0 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host localhost left intact
404 ошибка — т.к. в хранилище нет никаких данных.
Добавим несколько:
$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1 $ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key2?flags=42 $ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/sub/key3
Получаем их обратно:
$ curl -s -v http://localhost:8500/v1/kv/?recurse | python -m json.tool
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/?recurse HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Consul-Index: 46
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:20:33 GMT
< Content-Length: 294
<
{ [data not shown]
* Connection #0 to host localhost left intact
[
{
"CreateIndex": 43,
"Flags": 0,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 43,
"Value": "dGVzdA=="
},
{
"CreateIndex": 44,
"Flags": 42,
"Key": "web/key2",
"LockIndex": 0,
"ModifyIndex": 44,
"Value": "dGVzdA=="
},
{
"CreateIndex": 46,
"Flags": 0,
"Key": "web/sub/key3",
"LockIndex": 0,
"ModifyIndex": 46,
"Value": "dGVzdA=="
}
]
Получаем один ключ:
$ curl -s -v http://localhost:8500/v1/kv/web/key1 | python -m json.tool
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /v1/kv/web/key1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Consul-Index: 43
< X-Consul-Knownleader: true
< X-Consul-Lastcontact: 0
< Date: Mon, 01 Feb 2016 11:21:25 GMT
< Content-Length: 97
<
{ [data not shown]
* Connection #0 to host localhost left intact
[
{
"CreateIndex": 43,
"Flags": 0,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 43,
"Value": "dGVzdA=="
}
]
Удалить его можно так:
$ curl -s -v -X DELETE http://localhost:8500/v1/kv/web/key1 * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 8500 (#0) > DELETE /v1/kv/web/key1 HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:8500 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: application/json < Date: Mon, 01 Feb 2016 11:22:16 GMT < Content-Length: 4 < * Connection #0 to host localhost left intact
Проверяем:
$ curl -s -v http://localhost:8500/v1/kv/web/key1 | python -m json.tool ... < HTTP/1.1 404 Not Found ...
Удалим все данные:
$ curl -s -v -X DELETE http://localhost:8500/v1/kv/web/?recurse * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 8500 (#0) > DELETE /v1/kv/web/?recurse HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:8500 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: application/json < Date: Mon, 01 Feb 2016 11:23:11 GMT < Content-Length: 4 < * Connection #0 to host localhost left intact
Проверяем:
$ curl -s -v http://localhost:8500/v1/kv/?recurse * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 8500 (#0) > GET /v1/kv/?recurse HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:8500 > Accept: */* > < HTTP/1.1 404 Not Found < X-Consul-Index: 61 < X-Consul-Knownleader: true < X-Consul-Lastcontact: 0 < Date: Mon, 01 Feb 2016 11:23:36 GMT < Content-Length: 0 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host localhost left intact
Для изменения имеющего ключа — выполняем PUT:
$ curl -X PUT -d 'test' http://localhost:8500/v1/kv/web/key1
true
$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool
[
{
"CreateIndex": 67,
"Flags": 0,
"Key": "web/key1",
"LockIndex": 0,
"ModifyIndex": 67,
"Value": "dGVzdA=="
}
]
Проверяем.:
$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool | grep Value | cut -d":" -f 2 | tr -d """ | tr -d " " | base64 --decode test
Обновляем:
$ curl -X PUT -d 'NEWtest' http://localhost:8500/v1/kv/web/key1 true
И еще раз проверяем:
$ curl -s http://localhost:8500/v1/kv/web/key1 | python -m json.tool | grep Value | cut -d":" -f 2 | tr -d """ | tr -d " " | base64 --decode NEWtest
Веб-интерфейс Consul
Для доступа к web-ui — перезапускаем агент с опцией -ui.
По умолчанию ui будет слушать localhost. Добавим опцию -client, что бы указать IP для интерфейса:
$ consul agent -dev -bind $getip -config-dir /etc/consul.d -ui -client=$getip
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Node name: 'vagrant-ubuntu-trusty-64'
Datacenter: 'dc1'
Server: true (bootstrap: false)
Client Addr: 10.11.100.41 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
Cluster Addr: 10.11.100.41 (LAN: 8301, WAN: 8302)
Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
Atlas: <disabled>
==> Log data will now stream in as it occurs:
2016/02/01 11:35:59 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 10.11.100.41
2016/02/01 11:35:59 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64.dc1 10.11.100.41
2016/02/01 11:35:59 [INFO] raft: Node at 10.11.100.41:8300 [Follower] entering Follower state
2016/02/01 11:35:59 [INFO] consul: adding LAN server vagrant-ubuntu-trusty-64 (Addr: 10.11.100.41:8300) (DC: dc1)
2016/02/01 11:35:59 [INFO] consul: adding WAN server vagrant-ubuntu-trusty-64.dc1 (Addr: 10.11.100.41:8300) (DC: dc1)
...
Открываем http://10.11.100.41:8500/ui/:
Готово.
Аналогичный пост по Vault — тут>>>.
Vault + Consul — тут>>>.





