Установка и настройка Consul-template

Thank you for reading this post, don't forget to subscribe!

Consul при­ло­же­ние для обна­ру­же­ния сер­ви­сов (service discovery) на осно­ве DNS и про­вер­ки их доступ­но­сти. Оно исполь­зу­ет­ся для обес­пе­че­ния свя­зи меж­ду ком­по­нен­та­ми мик­ро­сер­вис­ной инфра­струк­ту­ры, поз­во­ляя созда­вать отка­зо­устой­чи­вую и мас­шта­би­ру­е­мую систе­му с воз­мож­но­стью балан­си­ров­ки нагруз­ки. Consul раз­ра­бо­тан ком­па­ни­ей HashiCorp, кото­рой так­же при­над­ле­жат дру­гие попу­ляр­ные про­дук­ты, напри­мер, Vagrant, TerraForm, Atlas, Vault.

Реги­стра­ция сер­ви­сов в кон­су­ле про­из­во­дит­ся с помо­щью функ­ции Consul Connect. Так­же реги­стри­ру­ют­ся поли­ти­ки вза­и­мо­дей­ствия, напри­мер, мы можем ука­зать, что сер­вис 1 может вза­и­мо­дей­ство­вать с сер­ви­сом 2, но не может вза­и­мо­дей­ство­вать с сер­ви­сом 3. Так­же для реги­стра­ции сво­е­го при­ло­же­ния доступ­на HTTP API или кон­фи­гу­ра­ци­он­ные фай­лы само­го кон­су­ла (при нали­чии под­держ­ки со сто­ро­ны приложения).

При­ло­же­ние может быть уста­нов­ле­но на сер­ве­ры под управ­ле­ни­ем всех попу­ляр­ных систем: Linux, Windows, MacOS, BSD. Под­дер­жи­ва­ют­ся сле­ду­ю­щие спо­со­бы установки:

  1. Копи­ро­ва­ние в систе­му бинар­но­го файла.
  2. Сбор­ка при­ло­же­ния из исходников.
  3. Уста­нов­ка в Kubernetes.
  4. В виде кон­тей­не­ра Docker.

При­ло­же­ние рабо­та­ет на сле­ду­ю­щих портах:

Порт Про­то­кол Опи­са­ние
8600 TCP and UDP Сер­вер DNS
8500 TCP Consul UIAPI
8301 TCP and UDP Порт LAN
8302 TCP and UDP Порт WAN
8300 TCP Сер­вис RPC
21000 - 21255 Диа­па­зон пор­тов для реги­стра­ции сервисов
8501 TCP Защи­щен­ный Consul UI + API. По умол­ча­нию, не настро­ен и зада­ет­ся любой. Дан­ный номер реко­мен­до­ван в офи­ци­аль­ной документации.
8502 gRPC API. По умол­ча­нию, не настро­ен и зада­ет­ся любой. Дан­ный номер реко­мен­до­ван в офи­ци­аль­ной документации.

По сво­ей сути Consul — это база дан­ных по типу ключ-зна­че­ние. При обра­ще­нии к нему мы полу­ча­ем инфор­ма­цию о рабо­то­спо­соб­ном при­ло­же­нии. Поэто­му, сре­ди ана­ло­гов, ино­гда выде­ля­ют etcd и ZooKeeper и, даже, Redis.

Подготовка системы

Пред­ва­ри­тель­но, нам нуж­но уста­но­вить на ком­пью­тер, с кото­ро­го будет запус­кать­ся про­цесс consul-template паке­ты для:

  • загруз­ки фай­лов (wget).
  • рас­па­ков­ки архи­вов (unzip).

В зави­си­мо­сти от типа опе­ра­ци­он­ной систе­мы, наши дей­ствия будут немно­го отличаться.

а) Для Deb (Ubuntu, Debian):

apt install wget unzip

б) Для RPM (Rocky Linux, CentOS):

yum install wget unzip

Установка и запуск Consul Template

На ком­пью­те­ре, где дол­жен рабо­тать consul-template необ­хо­ди­мо уста­но­вить соот­вет­ству­ю­щий пакет и запу­стить его в каче­стве сер­ви­са. Рас­смот­рим про­цесс по шагам.

Установка

Для уста­нов­ки нуж­но ска­чать бинар­ник и поло­жить его ката­лог /usr/bin.

Захо­дим на стра­ни­цу загруз­ки Consul Template офи­ци­аль­но­го сай­та и смот­рим нуж­ную нам вер­сию паке­та (как пра­ви­ло, выби­ра­ем последнюю).

Созда­ем систем­ную пере­мен­ную, кото­рая содер­жит вер­сию уста­нав­ли­ва­е­мо­го consul-template:

export VER='0.27.0'

Теперь загру­жа­ем на сер­вер архив с бинарником:

wget https://releases.hashicorp.com/consul-template/${VER}/consul-template_${VER}_linux_amd64.zip

Рас­па­ко­вы­ва­ем его в ката­лог /usr/bin:

unzip consul-template_${VER}_linux_amd64.zip -d /usr/bin

Гото­во. Про­ве­ря­ем, что наш бинар­ник мож­но запустить:

consul-template -v

Мы долж­ны уви­деть что-то на подобие:

consul-template v0.27.0 (d4af0222)

Пере­хо­дим к настрой­ке запус­ка про­цес­са в каче­стве демона.

Настройка и запуск

Созда­дим поль­зо­ва­те­ля, от кото­ро­го будет запус­кать­ся и рабо­тать наш сервис:

useradd -r -c 'Consul Agent' consul

Созда­дим рабо­чие каталоги:

mkdir -p /etc/consul-template.d /var/lib/consul/templates

В каче­стве вла­дель­ца для создан­ных ката­ло­гов, назна­чим поль­зо­ва­те­ля consul:

chown -R consul:consul /etc/consul-template.d /var/lib/consul/templates

Созда­дим кон­фи­гу­ра­ци­он­ный файл для consul-template:

vi /etc/consul-template.d/config.hcl

* где необ­хо­ди­мо обра­тить вни­ма­ние на:

  • address — адрес кон­су­ла. Это может быть сер­вер или агент. В дан­ном при­ме­ре пред­по­ла­га­ет­ся, что кон­сул рабо­та­ет на том же сер­ве­ре, где запус­ка­ет­ся consul-template.
  • token — если на сер­ве­ре Consul исполь­зу­ет­ся ACL, то нам нужен токен для под­клю­че­ния. Об этом чуть подроб­нее ниже в инструкции.

Попро­бу­ем запу­стить consul-template с исполь­зо­ва­ни­ем наше­го кон­фи­гу­ра­ци­он­но­го файла:

consul-template -config /etc/consul-template.d/config.hcl

Мы долж­ны уви­деть пустую стро­ку. Зна­чит наша систе­ма настро­е­на вер­но. Мож­но пре­рвать выпол­не­ние коман­ды ком­би­на­ци­ей Ctrl + C.

ACL

Если наш сер­вер Consul выпол­ня­ет про­вер­ку под­лин­но­сти, при вво­де коман­ды для запус­ка consul-template мы уви­дим ошибку:

[ERR] (dedup) failed to create session: Unexpected response code: 403 (rpc error making call: rpc error making call: Permission denied)

Она озна­ча­ет, что мы не ука­за­ли токен, он непра­виль­ный или токен при­вя­зан к поли­ти­ке, у кото­рой нет нуж­ных прав доступа.

Для настрой­ки ACL нам нуж­но выпол­нить часть дей­ствий на сер­ве­ре кон­су­ла, часть на ком­пью­те­ре с consul-template.

На сервере

Пере­хо­дим в ката­лог с консулом:

cd /etc/consul.d/

* обра­ти­те вни­ма­ние, что в нашем слу­чае это может быть дру­гой каталог.

Созда­ем файл, в кото­ром будет опи­са­ние нашей политики:

vi consul-template-policy.txt

Созда­ем поли­ти­ку из создан­но­го файла:

consul acl policy create -name "consul-template" -rules @consul-template-policy.txt

Созда­ем токен с при­вяз­кой к дан­ной политике:

consul acl token create -description "Token for Consul Template" -policy-name consul-template

Мы долж­ны уви­деть что-то на подобие:

Нам нуж­на стро­ка SecretID — это и есть нуж­ный нам токен. Его так­же мож­но уви­деть в веб-инстру­мен­те для рабо­ты с консулом.

С сер­ве­ром мы закон­чи­ли. Пере­хо­дим на клиента.

На узле с consul-template

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл, кото­рый был нами создан для consul-template:

vi /etc/consul-template.d/config.hcl

Допи­сы­ва­ем в него токен (в при­ме­ре выше стро­ка была — нуж­но толь­ко снять ком­мен­та­рий и под­ста­вить пра­виль­ное значение):

* в дан­ном при­ме­ре 9f06d485-03e5-dc1a-5a84-50dea3db7522 — тот токен, кото­рый мы полу­чи­ли на сер­ве­ре. Само собой, у вас он будет другой.

Про­ве­ря­ем кор­рект­ность конфига:

consul-template -config /etc/consul-template.d/

Мож­но про­бо­вать запуск:

consul-template -config /etc/consul-template.d/config.hcl

Мы долж­ны уви­деть пустую стро­ку. После пре­ры­ва­ем выпол­не­ние ком­би­на­ци­ей Ctrl + C.

Сервис

Послед­нее, что нуж­но сде­лать в рам­ках нашей настрой­ки, создать юнит в systemd для авто­ма­ти­че­ско­го запус­ка сервиса.

Созда­ем файл:

vi /etc/systemd/system/consul-template.service

* в дан­ном при­ме­ре мы будем запус­кать ска­чан­ный нами банар­ник consul-template и пере­да­вать ему в каче­стве настрой­ки путь до ката­ло­га, где лежат кон­фи­гу­ра­ци­он­ные файлы.

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Стар­ту­ем наш сер­вис и про­ве­ря­ем его состояние:

systemctl start consul-template

systemctl status consul-template

Если все в поряд­ке, то мож­но раз­ре­шить автозапуск:

systemctl enable consul-template

Гото­во. Наша систе­ма гото­ва к рабо­те с шаблонами.

Работа с шаблонами

Для добав­ле­ния настрой­ки шаб­ло­на мож­но про­дол­жить редак­ти­ро­вать уже создан­ный ранее кон­фи­гу­ра­ци­он­ный файл, но удоб­нее создать отдельный:

vi /etc/consul-template.d/templates.hcl

Мы можем создать несколь­ко кон­фи­гу­ра­ций для шаб­ло­нов. Каж­дый из них опи­сы­ва­ет­ся опци­ей template:

* в дан­ном при­ме­ре обра­ща­ем вни­ма­ние на следующее:

  • source — путь до фай­ла с шаблоном.
  • destination — путь до конеч­но­го фай­ла, кото­рый будет создан на осно­ве шаблона.
  • command — коман­да, кото­рая может быть выпол­не­на после отра­бот­ки шаблона.

Созда­ем шаб­лон и после пере­за­пус­ка­ем сервис:

vi /var/lib/consul/templates/nginx.ctmpl

systemctl restart consul-template

Подроб­нее про то, как созда­ют­ся шаб­ло­ны в кон­су­ле мож­но почи­тать на стра­ни­це gitee.com/ucasrichard/consul-template.

Vault

Consul и Vault раз­ра­бо­та­ны одной ком­па­ни­ей Hashicorp. И consul-template мож­но исполь­зо­вать, что­бы вытас­ки­вать дан­ные из хра­ни­ли­ща паро­лей. Подроб­нее про настрой­ку Vault Templates мож­но про­чи­тать в инструк­ции Настрой­ка Vault Agent Templates — реко­мен­ду­ет­ся с ней ознакомиться.

Consul-template мож­но исполь­зо­вать вме­сто Vault Template. Есть неболь­шие отли­чия по настройке.

1. Необ­хо­ди­мо создать токен на сер­ве­ре Vault, кото­рый будет при­вя­зан к поли­ти­ке, кото­рой мож­но обра­щать­ся к нуж­ным нам данным:

vault token create -policy=pl-agent-app-test

* подроб­нее, про созда­ние таких поли­тик рас­ска­за­но в выше опи­сан­ной инструк­ции, так­же мож­но озна­ко­мить­ся с поли­ти­ка­ми досту­па Vault в инструк­ции Уста­нов­ка, настрой­ка и рабо­та с Hashicorp Vault.

Мы долж­ны полу­чить ответ на подобие:

Нуж­ный нам токен — s.f9uzXJVNjYVUmZjw6ZpCLB6A. Сохра­ня­ем его.

2. Добав­ля­ем кон­фи­гу­ра­цию для Vault в consul-template:

vi /etc/consul-template.d/vault.hcl

* где active.vault.service.dc1.consul — адрес наше­го сер­ве­ра vault (обра­ти­те вни­ма­ние, что в дан­ном при­ме­ре он заре­ги­стри­ро­ван в кон­су­ле); s.npuzXJV6jYVUmKjw6ZpCLBHj — токен, кото­рый мы созда­ли в vault для досту­па к нуж­ным нам данным.

Созда­ем настрой­ку для шаблона:

vi /etc/consul-template.d/templates.hcl

3. Созда­ем сам шаблон:

vi /var/lib/consul/templates/vault_template.ctmpl

* если вы рабо­та­ли с vault-template, то обра­ти­те вни­ма­ние, что син­так­сис ничем не отли­ча­ет­ся при рабо­те с consul-template.
** где:

  • secret/applications/myapp/db — путь, по кото­ро­му мы сохра­ни­ли наши секреты.
  • .Data.data.login — кон­струк­ция для извле­че­ния зна­че­ния клю­ча login.
  • .Data.data.password — кон­струк­ция для извле­че­ния зна­че­ния клю­ча password.

4. Немно­го отре­дак­ти­ру­ем наш файл для юни­та в systemd:

vi /etc/systemd/system/consul-template.service

* дан­ная опция нуж­на, если сер­ти­фи­кат для vault не про­хо­дит про­вер­ку, а такое быва­ет не ред­ко. В про­тив­ном слу­чае, дан­ную настрой­ку мож­но и не делать.

Что­бы кон­фи­гу­ра­ция для systemd обно­ви­лась, вводим:

systemctl daemon-reload

Теперь мож­но пере­за­пус­кать сервис:

systemctl restart consul-template

Если мы все сде­ла­ли пра­виль­но, то мы уви­дим файл:

cat /tmp/render.txt

… с нуж­ны­ми нам дан­ны­ми из Vault.