Краткий 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 – тут>>>.