Используемые термины: Consul , Linux .
Consul-template позволяет нам формировать файлы на основе шаблонов с данными, которые хранятся в Consul. Это можно использовать для формирования конфигурационных файлов или скриптов. В инструкции мы рассмотрим процесс установки consul-template на операционные системы Linux на базе Deb и RPM.
Предварительная настройка
Установка consul-template
Загрузка и распаковка бинарника
Настройка и запуск
Использование ACL
Настройка systemd
Работа с шаблонами
Consul Template + Vault
Подготовка системы
Предварительно, нам нужно установить на компьютер, с которого будет запускаться процесс 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
consul {
address = «127.0.0.1:8500»
# token = «<token>»
retry {
enabled = true
attempts = 12
backoff = «250ms»
max_backoff = «10s»
}
}
reload_signal = «SIGHUP»
kill_signal = «SIGINT»
max_stale = «10m»
log_level = «warn»
wait {
min = «2s»
max = «5s»
}
deduplicate {
enabled = true
prefix = «consul-template/dedup/»
}
* где необходимо обратить внимание на:
- 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
session_prefix «» {
policy = «write»
}
Создаем политику из созданного файла:
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
Мы должны увидеть что-то на подобие:
AccessorID: aa8a118c-0dbf-14de-d1c4-fe35283e3426
SecretID: 9f06d485-03e5-dc1a-5a84-50dea3db7522
Description: Token for Consul Template
Local: false
Create Time: 2021-09-10 17:28:36.630170352 +0300 MSK
Policies:
d31bfc3e-c6ed-dd9f-3228-103b0d70f42d — consul-template
Нам нужна строка SecretID — это и есть нужный нам токен. Его также можно увидеть в веб-инструменте для работы с консулом.
С сервером мы закончили. Переходим на клиента.
На узле с consul-template
Открываем конфигурационный файл, который был нами создан для consul-template:
vi /etc/consul-template.d/config.hcl
Дописываем в него токен (в примере выше строка была — нужно только снять комментарий и подставить правильное значение):
consul {
…
token = «9f06d485-03e5-dc1a-5a84-50dea3db7522»
…
}
* в данном примере 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
[Unit]
Description=Consul-Template Daemon
Documentation=https://github.com/hashicorp/consul-template/
Wants=basic.target
After=network.target
[Service]
User=consul
Group=consul
ExecStart=/usr/bin/consul-template -config=/etc/consul-template.d/
SuccessExitStatus=12
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
KillMode=process
Restart=on-failure
RestartSec=42s
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
* в данном примере мы будем запускать скачанный нами банарник 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 :
template {
source = «/var/lib/consul/templates/nginx.ctmpl»
destination = «/etc/nginx/nginx.conf»
command = «systemctl reload nginx»
command_timeout = «10s»
error_on_missing_key = false
backup = true
wait {
min = «2s»
max = «10s»
}
}
* в данном примере обращаем внимание на следующее:
- 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 .
Мы должны получить ответ на подобие:
Key Value
— ——
token s.f9uzXJVNjYVUmZjw6ZpCLB6A
token_accessor vxTy5ESvfOHzP6Ca7TjlX2ds
token_duration 768h
token_renewable true
token_policies [«default» «pl-agent-app-test»]
identity_policies []
policies [«default» «pl-agent-app-test»]
Нужный нам токен — s.f9uzXJVNjYVUmZjw6ZpCLB6A . Сохраняем его.
2. Добавляем конфигурацию для Vault в consul-template:
vi /etc/consul-template.d/vault.hcl
vault {
address = «https://active.vault.service.dc1.consul:8200»
token = «s.npuzXJV6jYVUmKjw6ZpCLBHj»
renew_token = false
}
* где active.vault.service.dc1.consul — адрес нашего сервера vault (обратите внимание, что в данном примере он зарегистрирован в консуле); s.npuzXJV6jYVUmKjw6ZpCLBHj — токен, который мы создали в vault для доступа к нужным нам данным.
Создаем настройку для шаблона:
vi /etc/consul-template.d/templates.hcl
template {
source = «/var/lib/consul/templates/vault_template.ctmpl»
destination = «/tmp/render.txt»
}
3. Создаем сам шаблон:
vi /var/lib/consul/templates/vault_template.ctmpl
{{ with secret «secret/applications/myapp/db» }}
login: {{ .Data.data.login }}
passwd: {{ .Data.data.password }}
{{ end }}
* если вы работали с 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
…
[Service]
Environment=»VAULT_SKIP_VERIFY=true»
…
* данная опция нужна, если сертификат для vault не проходит проверку, а такое бывает не редко. В противном случае, данную настройку можно и не делать.
Чтобы конфигурация для systemd обновилась, вводим:
systemctl daemon-reload
Теперь можно перезапускать сервис:
systemctl restart consul-template
Если мы все сделали правильно, то мы увидим файл:
cat /tmp/render.txt
… с нужными нам данными из Vault.